PHP中基于openssl实现secp256k1 ECDSA签名及转DER十六进制方案问询
仅用PHP内置openssl库实现secp256k1签名、DER格式转换、ETH地址生成及验签方案
核心原理说明
- PHP内置
openssl_sign生成的ECDSA签名本身就是二进制DER格式,直接调用bin2hex()即可转换为十六进制DER字符串 - 从openssl生成的EC密钥中可直接提取公钥的x、y坐标,拼接后即可得到符合ETH规则的未压缩公钥,用于生成ETH地址
- 所有功能仅依赖PHP内置openssl、hash扩展,无需引入第三方库
完整实现代码
1. 生成secp256k1密钥对与ETH地址
<?php // 初始化openssl配置 $config = [ "config" => getenv('OPENSSL_CONF'), 'private_key_type' => OPENSSL_KEYTYPE_EC, 'curve_name' => 'secp256k1' ]; // 生成密钥对 $res = openssl_pkey_new($config); if (!$res) { echo 'ERROR: 私钥生成失败 -> ' . openssl_error_string(); exit; } // 导出PEM格式私钥 openssl_pkey_export($res, $privKeyPem, null, $config); // 获取密钥详情 $keyDetails = openssl_pkey_get_details($res); // 拼接未压缩公钥:固定前缀0x04 + 32字节x坐标 + 32字节y坐标 $pubKeyRaw = "\x04" . $keyDetails['ec']['x'] . $keyDetails['ec']['y']; // 转十六进制公钥 $pubKeyHex = bin2hex($pubKeyRaw); // 生成ETH地址:去掉公钥首字节前缀,做keccak256哈希后取后40位加0x前缀 $pubKeyNoPrefix = substr($pubKeyRaw, 1); $pubKeyHash = hash('keccak256', $pubKeyNoPrefix, true); $ethAddress = '0x' . substr(bin2hex($pubKeyHash), -40); // 输出结果 echo "私钥(PEM格式):\n" . $privKeyPem . "\n\n"; echo "公钥(十六进制未压缩):\n" . $pubKeyHex . "\n\n"; echo "ETH地址:\n" . $ethAddress . "\n\n";
2. 生成十六进制格式DER签名
// 待签名数据示例:可替换为你序列化后的交易数据哈希 $txHash = hex2bin('ab4c345100000000000000000000000000000000000000000000000000000000'); // 签名:默认返回二进制DER格式签名,使用sha256作为哈希算法 // 若待签名$txHash已经是完成哈希的32字节值,无需二次哈希可将算法参数替换为'NONE' openssl_sign($txHash, $signatureBin, $privKeyPem, OPENSSL_ALGO_SHA256); // 二进制DER转十六进制字符串 $derSignHex = bin2hex($signatureBin); echo "十六进制DER签名:\n" . $derSignHex . "\n\n";
3. 验签实现
// 十六进制DER签名转回二进制后验签 $verifyResult = openssl_verify($txHash, hex2bin($derSignHex), $keyDetails['key'], OPENSSL_ALGO_SHA256); if ($verifyResult === 1) { echo "验签成功\n"; } elseif ($verifyResult === 0) { echo "验签失败\n"; } else { echo "验签出错:" . openssl_error_string() . "\n"; }
注意事项
- 确保PHP版本 >=7.4,hash扩展支持
keccak256算法,可通过print_r(hash_algos())查看当前环境支持的算法列表 - 实际对接ETH交易时,交易数据需要先按照RLP规则序列化后再做keccak256哈希,再传入签名函数,本示例为简化流程直接使用哈希值作为输入
- openssl输出的DER签名格式和第三方EC类库输出格式完全兼容,可直接用于加密货币相关业务场景
内容的提问来源于stack exchange,提问作者smith john
相关产品推荐
相关产品推荐

