使用已知的 public 密钥设置 Ruby OpenSSL

Setting up Ruby OpenSSL with a known public key

我有一个 public 密钥的内容,我正在将其作为输入传递给我的系统:

public_key = 'MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAC/Bu9nyAtG1DQe7t7jszLb+dZ1GbXoR8G0rIXoak67NM='

我需要将其输入 OpenSSL 以便它可以参与一些 ECDH 解密。

我似乎找不到让 OpenSSL 接受上述输入的方法。

我试过以下方法:

这两个return:

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

我能做到:

这不是 return 错误,但是我无法在不引发错误的情况下将组设置为 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

这里有几处错误。首先,这是一个椭圆曲线密钥,因此尝试创建 RSA 密钥是行不通的。您需要创建一个 EC key.

EC 密钥初始值设定项接受多种方式来传递密钥。不幸的是,其中 none 个与您在这里的完全匹配。不过,您可以传入 PEM 表单或 DER 表单。 PEM 表单正是添加了 BEGIN PUBLIC KEYEND PUBLIC KEY 行后的内容,因此这将起作用(与您尝试过的类似,仅使用正确的密钥类型):

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

DER 形式是您拥有的形式,但经过 base 64 解码,因此这也可以工作并且可能更方便:

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

完成后,您可以调用 key.group.curve_name,您将看到第二个问题。这是 prime256v1 密钥,不是 secp128r2 密钥。它不代表 secp128r2 曲线上的一个点,因此会导致您收到 incompatible objects 错误。确保您使用的是匹配的密钥类型。