如何用phpseclib将secp256k1 ECDSA私钥转为64位十六进制?
问题:用phpseclib生成以太坊所需的64字符(256位)十六进制私钥
我正在PHP中生成以太坊地址,需要生成64字符(256位)的十六进制私钥。项目已使用phpseclib,因此采用secp256k1曲线生成私钥:
$privateKey = EC::createKey('secp256k1'); $privateKeyString = $privateKey->toString('PKCS8');
得到的PEM格式输出如下:
-----BEGIN PRIVATE KEY----- MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgDknmmpdnS+MvAylQDbXl WECAG51RuIViJFLw/0aR40yhRANCAARpIut7yqacMbI9TW/aT5frWKpjoDOAL15l A/5rE+6+o/AbWES5bHej1U/ygxyqlwVizCABCSeWZf5CNoTy8nMt -----END PRIVATE KEY-----
我尝试多种方法获取目标64字符十六进制串均失败:对PEM做base64_decode后用bin2hex得到近310字符结果,移除头尾后为268字符。调用$privateKey->getLength()返回256,请问如何通过该库得到目标串?
解决方法
直接处理PKCS8格式的私钥行不通,因为PKCS8是包含算法标识、曲线参数的容器格式,并非纯256位私钥本身。phpseclib的EC对象提供了直接提取纯私钥的方法:
- 提取并转换为目标格式:
// 获取私钥的BigInteger实例 $privateKeyMath = $privateKey->getPrivateKey(); // 转换为固定32字节的大端字节串(补零确保256位长度) $privateKeyBytes = $privateKeyMath->toBytes(true); // 转换为64字符的十六进制私钥 $hexPrivateKey = bin2hex($privateKeyBytes);
- 关键说明:
getPrivateKey()返回的是对应secp256k1曲线的256位整数实例,这才是私钥的核心值。toBytes(true)的true参数强制使用大端字节序,并补零到32字节,确保转换后的十六进制串正好是64字符,完全符合以太坊的私钥要求。- 之前处理PKCS8格式得到超长结果,是因为该格式包含了额外的ASN.1编码元数据,并非纯私钥内容。
内容的提问来源于stack exchange,提问作者CodeWithKyrian
相关产品推荐
相关产品推荐

