使用已知的 public 密钥设置 Ruby OpenSSL
Setting up Ruby OpenSSL with a known public key
我有一个 public 密钥的内容,我正在将其作为输入传递给我的系统:
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"
这两个return:
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"
这不是 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 KEY
和 END 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
错误。确保您使用的是匹配的密钥类型。
我有一个 public 密钥的内容,我正在将其作为输入传递给我的系统:
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"
这两个return:
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"
这不是 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 KEY
和 END 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
错误。确保您使用的是匹配的密钥类型。