我正在尝试用 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 个字符的十六进制字符串???
有人可以帮助我如何通过图书馆实现这一目标吗?
这符合你的要求吗?:
$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;