Настройка Ruby OpenSSL с известным открытым ключом - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть содержимое открытого ключа, которое я передаю в качестве входных данных для моей системы:

public_key = 'MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAC/Bu9nyAtG1DQe7t7jszLb+dZ1GbXoR8G0rIXoak67NM='

Мне нужно указать это в OpenSSL, чтобы оно могло принять участие в расшифровке ECDH.

Кажется, я не могу найти способ заставить OpenSSL принять вышеуказанный ввод.

Я пробовал следующее:

  • OpenSSL::PKey::RSA.new public_key
  • OpenSSL::PKey::RSA.new "-----BEGIN PUBLIC KEY-----\n#{public_key}\n-----END PUBLIC KEY-----\n"

Оба они возвращают:

OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key: nested asn1 error

Я могу сделать:

  • OpenSSL::PKey.read "-----BEGIN PUBLIC KEY-----\n#{public_key}\n-----END PUBLIC KEY-----\n"

Это не возвращает ошибку, однако я не могу найти способ установить группу как secp128r2 без выдачи ошибки.

Выполнение c = OpenSSL::PKey::EC.new("secp128r2") и попытка установить ключ после c.public_key = OpenSSL::PKey.read("-----BEGIN PUBLIC KEY-----\n#{public_key}\n-----END PUBLIC KEY-----\n").public_key выдает ошибку:

OpenSSL::PKey::ECError: EC_KEY_set_public_key: incompatible objects

1 Ответ

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

Здесь есть пара неправильных вещей. Во-первых, это ключ с эллиптической кривой, поэтому попытка создать ключ RSA не сработает. Вам необходимо создать ключ EC .

Инициализатор ключа EC допускает несколько способов передачи ключа. К сожалению, ни один из них не соответствует точно, что у вас здесь. Вы можете перейти в форму PEM или форму DER, хотя. Форма PEM - это именно то, что у вас есть с добавленными строками BEGIN PUBLIC KEY и END PUBLIC KEY, поэтому это будет работать (аналогично тому, что вы пробовали, только с использованием правильного типа ключа):

key = OpenSSL::PKey::EC.new "-----BEGIN PUBLIC KEY-----\n#{public_key}\n-----END PUBLIC KEY-----\n"

Форма DER - это то, что у вас есть, но декодирована база 64, так что это также будет работать и может быть более удобным:

key = OpenSSL::PKey::EC.new(Base64.decode64(public_key))

Когда вы это сделаете, вы можете позвонить key.group.curve_name, и вы увидите вторую проблему. Это простой ключ 256v1, , а не ключ secp128r2. Он не представляет точку на кривой secp128r2 и поэтому вызывает ошибку incompatible objects, которую вы получаете. Убедитесь, что вы используете соответствующие типы ключей.

...