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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:09:03