使用Ruby OpenSSL从私钥获取椭圆曲线公钥

时间:2018-04-28 13:29:31

标签: ruby openssl elliptic-curve

我正在使用Ruby 2.5.x OpenSSL库来使用Elliptic Curves。我可以使用

轻松生成私钥和公钥对
curve = OpenSSL::PKey::EC.new('secp256k1')
curve.generate_key

但是给定私钥我想重新生成公钥。

我知道OpenSSL可以做到这一点,因为命令行允许你这样做,而Ruby比特币项目也可以做到这一点。但Ruby比特币项目有自己的使用FFI的OpenSSL接口,而不是Ruby提供的接口。

Ruby 2.5.x openssl库是否暴露了足够的OpenSSL接口以便能够从私钥生成椭圆曲线公钥,或者它可以但是它没有记录?

2 个答案:

答案 0 :(得分:2)

Ruby OpenSSL绑定不允许您直接从PKey::EC对象获取公钥,但是它们确实暴露了足以自己进行计算,这很简单。

给定私钥作为OpenSSL:BN对象,我们可以像这样生成:

example_key = OpenSSL::PKey::EC.new('secp256k1').generate_key
private_key = example_key.private_key

我们可以通过将组基点(即生成器)乘以私钥来计算公钥:

group = OpenSSL::PKey::EC::Group.new('secp256k1')
public_key = group.generator.mul(private_key)

公钥是OpenSSL::PKey::EC::Point。您可以与原始版本进行比较,看是否相同:

puts example_key.public_key == public_key # => true

答案 1 :(得分:0)

如果有人也有兴趣以pem格式获取公钥:)

const Queue = require("../queue/queue");
const connectDB = require("../../config/db");
const constants = require("../constants");

connectDB();