Настройка Ruby OpenSSL с известным открытым ключом

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

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 ответ

Решение

Здесь есть пара вещей не так. Во-первых, это ключ эллиптической кривой, поэтому попытка создать ключ 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 ошибка, которую вы получаете. Убедитесь, что вы используете соответствующие типы ключей.

Другие вопросы по тегам