You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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对象提供了直接提取纯私钥的方法:

  1. 提取并转换为目标格式:
// 获取私钥的BigInteger实例
$privateKeyMath = $privateKey->getPrivateKey();
// 转换为固定32字节的大端字节串(补零确保256位长度)
$privateKeyBytes = $privateKeyMath->toBytes(true);
// 转换为64字符的十六进制私钥
$hexPrivateKey = bin2hex($privateKeyBytes);
  1. 关键说明:
  • getPrivateKey()返回的是对应secp256k1曲线的256位整数实例,这才是私钥的核心值。
  • toBytes(true)的true参数强制使用大端字节序,并补零到32字节,确保转换后的十六进制串正好是64字符,完全符合以太坊的私钥要求。
  • 之前处理PKCS8格式得到超长结果,是因为该格式包含了额外的ASN.1编码元数据,并非纯私钥内容。

内容的提问来源于stack exchange,提问作者CodeWithKyrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:25:56