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