我有一个公开密钥的内容,我将其作为输入传递给系统:
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
答案 0 :(得分:1)
这里有些错误。首先,这是一个椭圆曲线密钥,因此尝试创建RSA密钥是行不通的。您需要创建一个EC key。
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格式,但是可以对base 64进行解码,因此这也可以使用,并且可能会更方便:
key = OpenSSL::PKey::EC.new(Base64.decode64(public_key))
完成后,您可以致电key.group.curve_name
,您会看到第二个问题。这是prime256v1密钥,不是是secp128r2密钥。它不代表secp128r2曲线上的点,因此会导致您得到incompatible objects
错误。确保您使用的是匹配的键类型。