gpt4 book ai didi

ruby - 使用 prime256v1 和已知公钥创建新的 OpenSSL EC 点

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:47 26 4
gpt4 key购买 nike

我正在尝试使用以下代码将已知公钥转换为 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 编码的,因此您需要对其进行de编码,而不是en编码:

decoded_public = Base64.decode64(public)

您得到的结果是包含 key 的 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 点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53488230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com