- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试编写 Ruby 代码来检查我发现的特定消息上的椭圆曲线数字签名算法 (ECDSA) 签名 here .
问题是我不知道如何将公钥的八位字节字符串转换为 OpenSSL::PKey::EC::Point目的。如果我用 C 写这个,我会把八位字节字符串传递给 OpenSSL 的 o2i_ECPublicKey
,它做的事情接近我想要的,实际上被 reference implementation 使用.但是,我搜索了 source code of Ruby (MRI)而且它不包含对 o2i_ECPublicKey
的调用,所以我不知道如何在不编写 C 扩展的情况下使用 Ruby 中的该函数。
这是十六进制的八位字节字符串。它只是一个 0x04 字节,后跟两个 32 字节的整数,表示椭圆曲线上点的 x 和 y 坐标:
04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284
那么有人知道如何将该字符串转换为 Ruby 中的 OpenSSL::PKey::EC::Point
吗?一旦我得到点对象,我将在下面的代码中使用它,我相信这将验证签名:
key = OpenSSL::PKey::EC.new('secp256k1')
key.public_key = point
result = key.dsa_verify_asn1(digest, signature)
更新:
感谢 Jay-Ar Polidario,我让它开始工作。这是我使用 OpenSSL 验证签名的完整代码。我还写了一个名为 ecdsa 的 gem并且我包含了展示如何使用我的 gem 来做同样事情的代码。
# coding: ASCII-8BIT
digest =
"\xbf\x91\xfb\x0b\x4f\x63\x33\x77\x4a\x02\x2b\xd3\x07\x8e\xd6\xcc" \
"\xd1\x76\xee\x31\xed\x4f\xb3\xf9\xaf\xce\xb7\x2a\x37\xe7\x87\x86"
signature_der_string =
"\x30\x45" \
"\x02\x21\x00" \
"\x83\x89\xdf\x45\xf0\x70\x3f\x39\xec\x8c\x1c\xc4\x2c\x13\x81\x0f" \
"\xfc\xae\x14\x99\x5b\xb6\x48\x34\x02\x19\xe3\x53\xb6\x3b\x53\xeb" \
"\x02\x20" \
"\x09\xec\x65\xe1\xc1\xaa\xee\xc1\xfd\x33\x4c\x6b\x68\x4b\xde\x2b" \
"\x3f\x57\x30\x60\xd5\xb7\x0c\x3a\x46\x72\x33\x26\xe4\xe8\xa4\xf1"
public_key_octet_string =
"\x04" \
"\xfc\x97\x02\x84\x78\x40\xaa\xf1\x95\xde\x84\x42\xeb\xec\xed\xf5" \
"\xb0\x95\xcd\xbb\x9b\xc7\x16\xbd\xa9\x11\x09\x71\xb2\x8a\x49\xe0" \
"\xea\xd8\x56\x4f\xf0\xdb\x22\x20\x9e\x03\x74\x78\x2c\x09\x3b\xb8" \
"\x99\x69\x2d\x52\x4e\x9d\x6a\x69\x56\xe7\xc5\xec\xbc\xd6\x82\x84"
# Verifying with openssl.
require 'openssl'
ec = OpenSSL::PKey::EC.new('secp256k1')
key_bn = OpenSSL::BN.new(public_key_octet_string, 2) # 2 means binary
ec.public_key = OpenSSL::PKey::EC::Point.new(ec.group, key_bn)
result = ec.dsa_verify_asn1(digest, signature_der_string)
puts result # => true
# Verifying with the new ECDSA gem I wrote, version 0.1.5
require 'ecdsa'
group = ECDSA::Group::Secp256k1
point = ECDSA::Format::PointOctetString.decode(public_key_octet_string, group)
signature = ECDSA::Format::SignatureDerString.decode(signature_der_string)
result = ECDSA.valid_signature?(point, digest, signature)
puts result # => true
我认为 OpenSSL 让您暂时将公钥表示为单个 BN(大数字)很奇怪,因为它实际上是两个大数字。我的 gem 可以直接将八位字节字符串(如 SEC2 标准中所定义)转换为 ECDSA::Point
对象。
最佳答案
尝试以下操作(测试无误):
key = '04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284'
key_bn = OpenSSL::BN.new(key, 16) #Input: 16=Hexa, Output: BigNumber
group = OpenSSL::PKey::EC::Group.new('secp256k1')
point = OpenSSL::PKey::EC::Point.new(group, key_bn)
#--> <OpenSSL::PKey::EC::Point:0x5288178>
关于Ruby/openssl:将椭圆曲线点八位字节字符串转换为 OpenSSL::PKey::EC::Point,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22293864/
我的 Django/PostgreSQL 系统有一个奇怪的行为。 保存模型对象后主键为无,尽管它是一个 AutoField 并且 id 已正确保存在数据库中。 以下脚本段落为 id 返回 None:
我正在尝试在低级别使用 SSH 协议(protocol)(即我不想启动 shell 或任何东西,我只想传递数据)。因此,我正在使用 Paramiko 的 Transport直接上课。 我已经完成了服务
如何创建使用以下公钥字符串初始化的 OpenSSL::PKey 对象?最终目标是使用对象通过 ruby-jwt 解码 JWT token 。 我试过以下方法: public_key = ""-----
我需要能够识别我在使用 pg_insert 后刚刚插入的行,但文档只是说它返回 true/false。我如何从 pg_insert() 中确定记录的 pkey?我知道我可以在末尾使用带有“RETURN
尝试插入新房间时出现以下错误 ** (Ecto.ConstraintError) constraint error when attempting to insert struct: * un
我随后在两个表中插入一条记录。在第一次插入时,我将记录放在主表中,主表中生成了主键值。现在我需要将这条记录的一些字段放在另一个表中,包括主表的键值。我该怎么做? 最佳答案 “SELECT LAST_I
谁能告诉我 Hibernate 是否支持关联作为实体的 pkey?我认为这会得到支持,但我很难让代表它的任何类型的映射正常工作。特别是,使用下面的直接映射: @Entity public class
我正在尝试使用公钥解密。 bob = TCPSocket.open(host, port) cs_public_key = OpenSSL::PKey::RSA.new File.read 'c_pu
我正在尝试使用公钥解密。 bob = TCPSocket.open(host, port) cs_public_key = OpenSSL::PKey::RSA.new File.read 'c_pu
我有一些实体: @Entity public class Event{ @Id @GeneratedValue(strategy = GenerationType.IDENTIT
我们有一个使用 openssl 的应用程序 1,并且有一个客户端能够连接(握手完成)的公钥和证书文件 (RSA)。 我们有另一个应用程序2,它不使用 openssl,而是使用 Java keytool
这个问题在这里已经有了答案: Retrieving the last record in each group - MySQL (33 个答案) Fetch the rows which have
我正在尝试使用库 gittle 来克隆一个 git 存储库,我遵循了自述文件中的示例,这是我的代码。 repo_path = '/path/to/dir/' repo_url = 'git@gitl
我正在尝试编写 Ruby 代码来检查我发现的特定消息上的椭圆曲线数字签名算法 (ECDSA) 签名 here . 问题是我不知道如何将公钥的八位字节字符串转换为 OpenSSL::PKey::EC::
我有一个 Django-Postgres 设置这个表 - class User(models.Model): id = models.CharField(max_length=255, pri
我正在建立一个电子商务商店,每件商品都有不同的颜色和尺寸。那么使用包含 3 个复合键的 ProductType 表来定义连接到 Product 表的唯一行是否合适? Product Table: Pr
我正在尝试使用 net/sftp gem 从 Heroku 的 SFTP To Go 下载文件,但我总是得到未定义的方法 `e=' for #。 一直在网上搜索,但找不到任何相关的解决方案。这是我的代
我目前正在使用 Vagrant 和 Chef-solo,效果非常好。我想将 Vagrant 魔法扩展到 Chef 服务器。我已将 Vagrantfile 中的配置程序从 Chef-solo 切换为 C
多年来,我一直在使用 Capistrano 成功部署我的 Rails 3.2.13 应用程序。但就在今天,我遇到了可怕的ArgumentError: Could not parse PKey: no
我从 paramiko 得到了非常奇怪的行为: bla=paramiko.pkey.PKey(msg=None,data=None).from_private_key_file() TypeError
我是一名优秀的程序员,十分优秀!