javascript - 如何格式化 OpenSSL key 以匹配在线示例 (JSBN-ECC)

标签 javascript ruby openssl elliptic-curve diffie-hellman

我希望能够将 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并将其粘贴到网上(link)作为 Alices 的私有(private)值(value)。但先单击secp1284r1按钮以获得相同的曲线参数,然后单击Compute Public按钮。

这将从输入的私钥生成公钥。然而,Ruby OpenSSL 文档并没有真正的帮助,我一直在思考如何转换上面生成的公钥:

499599043529551953518354858381998373780459818901085313561109939106744612770290

进入类似这样的内容(如从在线站点看到的):

x: 107060165679262225845922473865530329196
y: 109296969851421346147544217212275741170

我假设通过正确转换一个,它可以以某种方式变得等于另一个,因为它们具有相同的曲线参数。还是我错了? (也因为 point_conversion_form 的默认格式是 :uncompressed,正如我刚刚测试过的)请帮忙。

附注您可能想知道为什么我需要将公钥转换为另一个。不,我真的不需要。我只是想学习如何转换它,因为我将使用该方法来转换类似的东西。这是为了方便您测试而简化的问题。

最佳答案

杰-阿尔,

您不应该觉得您的解决方案很奇怪,因为我认为对 ec.public_key.to_bn 的调用可能遵循 rfc5480 section 2.2回复:主题公钥其中指出:

2.2. Subject Public Key

  • The first octet of the OCTET STRING indicates whether the key is compressed or uncompressed. The uncompressed form is indicated by 0x04 and the compressed form is indicated by either 0x02 or 0x03 (see 2.3.3 in [SEC1]). The public key MUST be rejected if any other value is included in the first octet.

假设情况确实如此,并且由于您指定格式为:未压缩,那么您自己的答案对我来说完全有意义。感谢您发布它! :)

关于javascript - 如何格式化 OpenSSL key 以匹配在线示例 (JSBN-ECC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22410765/

相关文章:

php - 使用 AJAX 从二维 PHP 数组创建二维 jQuery 数组

ruby-on-rails - 谁负责在 Rails 中生成 .idea 文件?

security - SSL 错误 : unable to get local issuer certificate

php - 使用客户端证书进行身份验证

javascript - 优雅的替换括号的方法

javascript - 如何在文档中嵌入 HTML 元素

javascript - 日期和数字之间的相等比较不起作用

ruby - 为什么叫 cucumber 和 capybara ?

ruby - Rails 检查哈希键对应的值是否为空数组

python - Google API 和 cx_Freeze 无法正常工作