我希望能够将openssl-ruby中的椭圆曲线diffie hellman的公钥格式化为类似于这个在线示例(link),因为我一直在使用这个js库。
下面的代码生成一个openssl::pkey::ec公钥和私钥
#Ruby
ec = OpenSSL::PKey::EC.new('secp128r1')
ec.generate_key
ec.private_key
#--> 205607153615223513963863936713567041725
ec.public_key.to_bn
#--> 499599043529551953518354858381998373780459818901085313561109939106744612770290
尝试复制上面的私钥
205607153615223513963863936713567041725
并将其作为alices的私钥粘贴到联机(link)上。但是,首先单击secp1284r1
按钮以获得相同的曲线参数,然后单击Compute Public
按钮。它将从输入的私钥生成公钥然而,ruby openssl文档并不是很有帮助,我一直在想如何转换上面生成的公钥:
499599043529551953518354858381998373780459818901085313561109939106744612770290
变成这样(从网上看):
x: 107060165679262225845922473865530329196
y: 109296969851421346147544217212275741170
我假设通过适当地转换一个,它可以在某种程度上变得与另一个相等,因为它们有相同的曲线参数。还是我错了?(而且由于默认的
point_conversion_form
格式是:uncompressed
,因为我刚刚测试过)请帮助。另外,你可能想知道为什么我需要把公钥转换成另一个。不,我真的不需要。我只想学习如何转换它,因为我将使用该方法来转换类似的东西。为了便于测试,这是一个简单的问题。
最佳答案:
杰伊·阿尔,
你不应该觉得你的解决方案很奇怪,因为我认为对ec.public_key.to_bn的调用可能会遵循rfc5480 section 2.2re:subject public keys,它声明:
2.2条主题公钥
八进制字符串的第一个八进制表示密钥是否
压缩的或未压缩的显示未压缩的表单
由0x04表示,压缩形式由0x02或
0x03(见[sec1]中的2.3.3)。如果
任何其他值都包含在第一个八位字节中。
假设是这样,既然你说的格式是:未压缩,你自己的回答对我来说完全有意义。谢谢你贴出来:)