我正在尝试使用以下代码将已知公钥转换为OpenSSL::PKey::EC::Point
的实例:
require 'base64'
require 'openssl'
public = 'MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAD5tgZhw82GpGYJYkWNgeDp/0OzT4y/YLS+tMpZeJ2VEQ='
decoded_public = Base64.encode64(public)
hex_string = decoded_public.each_byte.map { |b| b.to_s(16) }.join()
ec_group = OpenSSL::PKey::EC::Group.new('prime256v1')
key = OpenSSL::PKey::EC.new(ec_group)
bn = OpenSSL::BN.new(hex_string, 16)
point = OpenSSL::PKey::EC::Point.new(ec_group, bn)
错误发生在最后一行,引发:
`initialize': invalid encoding (OpenSSL::PKey::EC::Point::Error)
我运行
Base64.encode64
,然后将每个字节转换为十六进制表示,因为从周围的读取来看,十六进制字符串似乎是创建新BigNum的常见方法。我猜这是我对公钥信息做了错事,因为
ec_group
是在没有抱怨的情况下创建的。 最佳答案
首先,该字符串已经是base64编码的,因此需要对其进行解码,而不是对其进行编码:
decoded_public = Base64.decode64(public)
您得到的结果是一个包含密钥的DER编码结构,因此尝试直接查看字节不会得到任何结果(您可以使用
OpenSSL::ASN1.decode(decoded_public)
查看它包含的内容)。但是,您可以直接在
OpenSSL::PKey::read
上使用decoded_public
,这将为您提供一个OpenSSL::PKey::EC
对象(具有正确的组)。要获得关联点,您只需调用public_key
:key = OpenSSL::PKey.read decoded_public
point = key.public_key
结果是一个
OpenSSL::PKey::EC::Point
对象。关于ruby - 使用prime256v1和已知的公钥创建新的OpenSSL EC Point,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53488230/