0

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

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 而不会引发错误的方法。

在 with 之后执行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
4

1 回答 1

1

这里有几件事不对劲。首先,这是一个椭圆曲线密钥,因此尝试创建 RSA 密钥是行不通的。您需要创建一个EC 密钥

EC 密钥初始化器接受多种方式来传递密钥。不幸的是,它们中没有一个与您在这里所拥有的完全匹配。不过,您可以传入 PEM 表格或 DER 表格。PEM 表单正是您添加的BEGIN PUBLIC KEYandEND 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,您将看到第二个问题。这是 prime256v1 密钥,而不是secp128r2 密钥。它不代表 secp128r2 曲线上的一个点,因此会导致incompatible objects您遇到错误。确保您使用匹配的密钥类型。

于 2018-11-07T17:38:46.003 回答