Получить открытый ключ эллиптической кривой из закрытого ключа, используя Ruby OpenSSL - PullRequest
0 голосов
/ 28 апреля 2018

Я работаю с эллиптическими кривыми, используя библиотеку Ruby 2.5.x OpenSSL. Я могу легко сгенерировать пару закрытых и открытых ключей, используя

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

Но, учитывая закрытый ключ, я хочу восстановить открытый ключ.

Я знаю, что OpenSSL может сделать это, потому что командная строка позволяет вам это делать, а также проект Ruby Bitcoin. Но у проекта Ruby Bitcoin есть собственный интерфейс с OpenSSL, использующий FFI, а не тот, который предоставляется Ruby.

Разве Ruby 2.5.x библиотека openssl не предоставляет достаточного количества интерфейсов OpenSSL, чтобы иметь возможность генерировать открытый ключ эллиптической кривой из личного ключа, или это возможно, но не документировано?

1 Ответ

0 голосов
/ 28 апреля 2018

Насколько я могу судить, привязки 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
...