首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >е比率和keccаk 256

е比率和keccаk 256
EN

Ethereum用户
提问于 2018-04-19 15:23:21
回答 1查看 1.9K关注 0票数 4

我试图在PHP上生成eth地址。与keccak256有问题。

我正在使用这个类:https://github.com/kornrunner/php-keccak

它很好,我在https://emn178.github.io/online-tools/keccak_256.html上检查了很多次

Priv/pub密钥是正确生成的,检查了很多次,但是keccak256有一些地方,我得到的地址与Myether钱包和其他工具不同。

哪里有错误?

这是我的代码:

代码语言:javascript
复制
include('./keccak.php');
use BitWasp\BitcoinLib\BitcoinLib;
require_once(__DIR__. '/vendor/autoload.php');
$priv = '17d08f5fe8c77af811caa0c9a187e668ce3b74a99acc3f6d976f075fa8e0be55';
echo 'priv key: '.$priv;
echo "\r\n";
$pub=substr(BitcoinLib::private_key_to_public_key($priv),2); // deleting '04' padding from left side
echo 'pub key: '.$pub;
echo "\r\n";
$adr = \nmsps\Keccak::hash($pub, 256);
echo 'keccak256: '.$adr;
echo "\r\n";
echo 'ETH address:'.substr($adr,-40); // last 40
exit;

产出:

密钥: 17d08f5fe8c77af811caa0c9a187e668ce3b74a99acc3f6d976f075fa8e0be55发布密钥: 689268c0ff57a20cd299fa60d3fb374862aff565b20b5f1767906a99e6e09f3ff04ca2b2a5cd22f62941db103c0356df1a8ed20ce322cab2483db67685afd124 keccak256: c39d3fed9ca154a48cad5238a063d2fa1937d32fec5166ce0a27c6e6f94c95c8 ETH地址: a063d2fa1937d32fec5166ce0a27c6e6f94c95c8 //应为0x26d1eC50B4e62c1d1a40D16E7cacc6A6580757d5

EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-04-19 15:47:06

正确的公钥Keccak256散列应该是

代码语言:javascript
复制
de77577a693274e6d5e229c326d1ec50b4e62c1d1a40d16e7cacc6a6580757d5

之所以成为c39d3fed9ca154a48cad5238a063d2fa1937d32fec5166ce0a27c6e6f94c95c8,是因为公钥被视为字符串,而不是字节数组。

为了说明这一点,最好将'689268c0ff57a20cd299fa60d3fb374862aff565b20b5f1767906a99e6e09f3ff04ca2b2a5cd22f62941db103c0356df1a8ed20ce322cab2483db67685afd124‘作为

  • 一根绳子
  • 字节数组

我不知道如何将字节数组输入到这个问题中的网站。所以我用python3代替。

作为字符串

代码语言:javascript
复制
python3
from Crypto.Hash import keccak
keccak_hash = keccak.new(digest_bits=256)
s='689268c0ff57a20cd299fa60d3fb374862aff565b20b5f1767906a99e6e09f3ff04ca2b2a5cd22f62941db103c0356df1a8ed20ce322cab2483db67685afd124
pub=bytearray()
pub.extend(map(ord, s))
keccak_hash.update(bytes(pub))
print(keccak_hash.hexdigest())

输出是

代码语言:javascript
复制
c39d3fed9ca154a48cad5238a063d2fa1937d32fec5166ce0a27c6e6f94c95c8

与你的结果相符

作为字节数组

代码语言:javascript
复制
python3
from Crypto.Hash import keccak
keccak_hash = keccak.new(digest_bits=256)
pub=bytearray.fromhex('689268c0ff57a20cd299fa60d3fb374862aff565b20b5f1767906a99e6e09f3ff04ca2b2a5cd22f62941db103c0356df1a8ed20ce322cab2483db67685afd124')
keccak_hash.update(bytes(pub))
print(keccak_hash.hexdigest())

这输出

代码语言:javascript
复制
de77577a693274e6d5e229c326d1ec50b4e62c1d1a40d16e7cacc6a6580757d5

验证'As字节数组‘输出

为了验证哈希值,我们从这个输出中计算Ethereum地址。

代码语言:javascript
复制
echo de77577a693274e6d5e229c326d1ec50b4e62c1d1a40d16e7cacc6a6580757d5 | cut -c 25-

这输出26d1ec50b4e62c1d1a40d16e7cacc6a6580757d5

现在我们使用geth导入私钥,它将根据自己的计算结果打印出地址。

代码语言:javascript
复制
cd $(mktemp -d)
echo 17d08f5fe8c77af811caa0c9a187e668ce3b74a99acc3f6d976f075fa8e0be55 > key.txt
geth --datadir . account import key.txt

盖斯会要求设置密码。之后,它应该输出。

代码语言:javascript
复制
Address: {26d1ec50b4e62c1d1a40d16e7cacc6a6580757d5}

这与我们的计算相匹配,从而证明了'As字节数组‘的方法是正确的。

票数 3
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/46178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档