使用已知的公钥设置Ruby OpenSSL

时间:2018-11-07 15:09:30

标签: ruby openssl ecdh

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

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 个答案:

答案 0 :(得分:1)

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

EC密钥初始化程序接受多种方式来传递密钥。不幸的是,它们都不完全符合您在这里的功能。不过,您可以输入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错误。确保您使用的是匹配的键类型。