如何使用Ruby 2.5.x OpenSSL从椭圆曲线私钥生成公钥
从给定私钥生成公钥:Ruby 2.5.x OpenSSL库的实现方式
当然可以!Ruby 2.5.x自带的OpenSSL绑定完全支持从已知私钥推导对应公钥的功能,不需要依赖Bitcoin项目的FFI或者OpenSSL命令行工具。下面是具体的实现步骤和代码示例:
核心思路
OpenSSL的EC密钥对象在设置有效私钥后,会自动计算并关联对应的公钥。我们只需要把私钥转换成OpenSSL能识别的大整数格式,绑定到指定曲线的密钥实例上即可。
代码示例
假设你有一个十六进制格式的secp256k1私钥(这是最常见的存储格式之一),可以这样处理:
# 替换成你的实际私钥十六进制字符串 private_key_hex = "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" # 1. 创建secp256k1曲线实例 ec_key = OpenSSL::PKey::EC.new('secp256k1') # 2. 将十六进制私钥转为OpenSSL大整数(BN)对象 private_key_bn = OpenSSL::BN.new(private_key_hex, 16) # 3. 设置私钥,此时OpenSSL会自动计算对应的公钥 ec_key.private_key = private_key_bn # 4. 获取并使用公钥 public_key = ec_key.public_key # 示例:导出公钥为PEM格式 puts "公钥PEM格式:" puts public_key.to_pem # 示例:导出公钥为十六进制未压缩格式(比特币常用格式) public_key_hex = public_key.to_bn.to_s(16) puts "\n公钥十六进制未压缩格式:" puts public_key_hex
其他格式私钥的处理
如果你的私钥是二进制格式(比如直接从文件读取的字节流),可以用二进制模式初始化BN对象:
private_key_bin = File.binread('private_key.bin') private_key_bn = OpenSSL::BN.new(private_key_bin, 2) # 参数2表示二进制输入
如果私钥是PEM格式(包含私钥的完整结构),可以直接加载并提取公钥:
pem_data = File.read('private_key.pem') ec_key = OpenSSL::PKey::EC.new(pem_data) public_key = ec_key.public_key
注意事项
- 确保私钥符合secp256k1曲线的要求:私钥必须是介于1和
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141(曲线阶n)之间的整数,否则OpenSSL会抛出参数错误。 - 不需要手动调用
generate_key,因为我们是基于已有私钥推导公钥,而非生成新的密钥对。
内容的提问来源于stack exchange,提问作者John Small
相关产品推荐
相关产品推荐

