我试图在PHP上生成eth地址。与keccak256有问题。
我正在使用这个类:https://github.com/kornrunner/php-keccak
它很好,我在https://emn178.github.io/online-tools/keccak_256.html上检查了很多次
Priv/pub密钥是正确生成的,检查了很多次,但是keccak256有一些地方,我得到的地址与Myether钱包和其他工具不同。
哪里有错误?
这是我的代码:
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
发布于 2018-04-19 15:47:06
正确的公钥Keccak256散列应该是
de77577a693274e6d5e229c326d1ec50b4e62c1d1a40d16e7cacc6a6580757d5之所以成为c39d3fed9ca154a48cad5238a063d2fa1937d32fec5166ce0a27c6e6f94c95c8,是因为公钥被视为字符串,而不是字节数组。
为了说明这一点,最好将'689268c0ff57a20cd299fa60d3fb374862aff565b20b5f1767906a99e6e09f3ff04ca2b2a5cd22f62941db103c0356df1a8ed20ce322cab2483db67685afd124‘作为
我不知道如何将字节数组输入到这个问题中的网站。所以我用python3代替。
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())输出是
c39d3fed9ca154a48cad5238a063d2fa1937d32fec5166ce0a27c6e6f94c95c8与你的结果相符
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())这输出
de77577a693274e6d5e229c326d1ec50b4e62c1d1a40d16e7cacc6a6580757d5为了验证哈希值,我们从这个输出中计算Ethereum地址。
echo de77577a693274e6d5e229c326d1ec50b4e62c1d1a40d16e7cacc6a6580757d5 | cut -c 25-这输出26d1ec50b4e62c1d1a40d16e7cacc6a6580757d5
现在我们使用geth导入私钥,它将根据自己的计算结果打印出地址。
cd $(mktemp -d)
echo 17d08f5fe8c77af811caa0c9a187e668ce3b74a99acc3f6d976f075fa8e0be55 > key.txt
geth --datadir . account import key.txt盖斯会要求设置密码。之后,它应该输出。
Address: {26d1ec50b4e62c1d1a40d16e7cacc6a6580757d5}这与我们的计算相匹配,从而证明了'As字节数组‘的方法是正确的。
https://ethereum.stackexchange.com/questions/46178
复制相似问题