gpt4 book ai didi

将 OpenSSL 的 C 实现转换为 Ruby 代码

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:27 24 4
gpt4 key购买 nike

在 C 中,我可以执行以下操作:

bignum = BN_new();
BN_bin2bn(my_message, 32, bignum);
group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
ecp = EC_POINT_new(group);
check = EC_POINT_set_compressed_coordinates_GFp(group, ecp, bignum, 0, NULL);
key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
check = EC_KEY_set_public_key(key, ecp);
check = EVP_PKEY_set1_EC_KEY(public_key, key);

在 Ruby 中,我认为这会做同样的事情,但我得到一个错误*

bignum = OpenSSL::BN.new(my_message, 2)
group = OpenSSL::PKey::EC::Group.new('prime256v1')
group.point_conversion_form = :compressed
public_key = OpenSSL::PKey::EC::Point.new(group, bignum)

在这两种情况下,我都可以记录 bignum 并看到它是相同的,而且我非常肯定 prime256v1 是正确的组。

在这两种情况下,C 和 Ruby 使用相同版本的 OpenSSL(OpenSSL 1.0.2p 2018 年 8 月 14 日)

任何关于我在这里做错的建议都将不胜感激。

*我收到的错误消息是无效编码(OpenSSL::PKey::EC::Point::Error)

最佳答案

C 中的 EC_POINT_set_compressed_coordinates_GFp 函数希望您传入点的 x 坐标,并单独传递一个值来指定它可能是两个可能点中的哪一个(您传入的是文字 0,实际上你应该确定实际值)。

在 Ruby 中,Point 初始值设定项期望点被编码为包含两个坐标信息的字符串(我不知道这种格式是否有名称,但它很常见并且有文档记录通过 SECG )。在压缩坐标的情况下,这个字符串基本上与 C 代码中的 32 字节相同,但在开头有一个额外的字节,0x020x03,它们对应将 01 作为 y 位传递给 EC_POINT_set_compressed_coordinates_GFp

如果字符串不是以 0x020x03 开头(或 0x04 对于未压缩的点)或者是错误的长度,那么你将得到 invalid encoding 错误。

Ruby OpenSSL 绑定(bind)似乎没有提供使用单独的 x 和 y 坐标指定点的方法。最简单的方法是在将字符串传递给 Point.new 之前将 0x020x03 前缀添加到字符串。

如果您已经有了这个字符串,您可以在 C 中使用它来使用 EC_POINT_oct2point 创建一个点. ruby 本身 calls EC_POINT_oct2point如果您将字符串传递给 Point.new

关于将 OpenSSL 的 C 实现转换为 Ruby 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53570312/

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