phpseclib:将 ECDSA 私钥转换为 64 个字符的十六进制

问题描述 投票:0回答:1

我正在尝试用 PHP 生成以太坊地址,部分要求是生成 64 字符的十六进制私钥。我已经在我的项目中使用 phpseclib,并决定使用它的类来生成私钥。推荐的是

secp256k1
曲线,我也用过它

$privateKey = EC::createKey('secp256k1');

$privateKeyString = $privateKey->toString('PKCS8');

我得到的输出是这样的(PEM 格式)

-----BEGIN PRIVATE KEY-----\r\n
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgDknmmpdnS+MvAylQDbXl\r\n
WECAG51RuIViJFLw/0aR40yhRANCAARpIut7yqacMbI9TW/aT5frWKpjoDOAL15l\r\n
A/5rE+6+o/AbWES5bHej1U/ygxyqlwVizCABCSeWZf5CNoTy8nMt\r\n
-----END PRIVATE KEY-----

我尝试了很多方法来获取所需的 64 个字符(256 位)十六进制代码,但没有一个有效。我尝试使用

base64_decode
解码 PEM,然后使用
bin2hex
函数,但输出字符串几乎有 310 个字符。删除页眉和页脚,我得到了 268 个字符的输出。但是,如果我使用
$privateKey->getLength()
检查长度,我得到的输出为 256。现在的问题是,如何获得 64 个字符的十六进制字符串???

有人可以帮助我如何通过图书馆实现这一目标吗?

php ethereum private-key pem phpseclib
1个回答
0
投票

这符合你的要求吗?:

$key = \phpseclib3\Crypt\PublicKeyLoader::load("-----BEGIN PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgDknmmpdnS+MvAylQDbXl
WECAG51RuIViJFLw/0aR40yhRANCAARpIut7yqacMbI9TW/aT5frWKpjoDOAL15l
A/5rE+6+o/AbWES5bHej1U/ygxyqlwVizCABCSeWZf5CNoTy8nMt
-----END PRIVATE KEY-----");

$key = json_decode($key->toString('JWK'))->keys[0];
$pub = $key->x . $key->y;

$hash = new \phpseclib3\Crypt\Hash('keccak256');
$hash = $hash->hash($pub);
$address = substr($hash, -20);
$address = '0x' . strtolower(bin2hex($address));

echo $address;
© www.soinside.com 2019 - 2024. All rights reserved.