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

bttbmeg0  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(175)

我试图在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个字符的十六进制字符串???
有人可以帮助我如何实现这一点与图书馆?

bhmjp9jg

bhmjp9jg1#

现在的问题是,我如何得到64个字符的十六进制字符串???
这是你想要的吗:

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

我正在尝试用PHP生成以太坊地址
像这样?:

$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;

相关问题