Создание новой точки OpenSSL EC Point с использованием prime256v1 и известного открытого ключа - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь превратить известный открытый ключ в экземпляр OpenSSL::PKey::EC::Point со следующим кодом:

require 'base64'
require 'openssl'

public = 'MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAD5tgZhw82GpGYJYkWNgeDp/0OzT4y/YLS+tMpZeJ2VEQ='

decoded_public = Base64.encode64(public)
hex_string = decoded_public.each_byte.map { |b| b.to_s(16) }.join()

ec_group = OpenSSL::PKey::EC::Group.new('prime256v1')
key = OpenSSL::PKey::EC.new(ec_group)
bn = OpenSSL::BN.new(hex_string, 16)
point = OpenSSL::PKey::EC::Point.new(ec_group, bn)

Ошибка возникает в последней строке, выбрасывая:

`initialize': invalid encoding (OpenSSL::PKey::EC::Point::Error)

Я запускаю Base64.encode64, а затем превращаю каждый байт в шестнадцатеричное представление, потому что при чтении вокруг него кажется, что шестнадцатеричные строки являются обычным способом создания нового BigNum.

Я предполагаю, что это то, что яя делаю что-то не так с информацией открытого ключа, потому что ec_group создается без жалоб.

1 Ответ

0 голосов
/ 26 ноября 2018

Прежде всего, эта строка уже закодирована в base64, поэтому вам нужно де кодировать ее, а не en кодировать ее:

decoded_public = Base64.decode64(public)

Результатвы получаете это закодированную DER-структуру, содержащую ключ, поэтому попытка взглянуть на байты напрямую никуда вас не приведет (вы можете увидеть, что в ней содержится, используя OpenSSL::ASN1.decode(decoded_public)).

Однако вы можете использоватьOpenSSL::PKey::read непосредственно на decoded_public, что даст вам объект OpenSSL::PKey::EC (с правильной группой).Чтобы получить связанную точку, вы можете просто позвонить public_key:

key = OpenSSL::PKey.read decoded_public
point = key.public_key

В результате получается объект OpenSSL::PKey::EC::Point.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...