gpt4 book ai didi

c++ - ECDSA 使用 OpenSSL 签名,使用 Crypto++ 验证

转载 作者:太空狗 更新时间:2023-10-29 23:52:07 24 4
gpt4 key购买 nike

我使用 Wei Dai 的 Crypto++ 在我的应用程序中创建了一个 ECDSA key 对 (secp128r1)。签名和验证按预期工作。我没有将消息本身添加到签名中以最小化签名长度(正好是 32 字节)。

但是,当我使用 openssl 创建签名时:

$ cat test.txt | openssl dgst -ecdsa-with-SHA1 -sign sample.key -keyform DER > act.bin

OpenSSL 显然将消息本身放入签名中,从而产生更大的签名(例如 39 字节)。如果我设置 CryptoPP::SignatureVerificationFilter::PUT_MESSAGE,我可以使用 Crypto++ 验证签名。

我可以告诉 OpenSSL 签署一条消息,而不是将消息放入签名中,这样生成的签名正好是 32 字节吗?

最佳答案

CodesInChaos 是正确的。签名中的额外字节来自 ASN.1 编码,而不是被签名的原始消息。例如,这里是一个 39 字节的签名,它使用曲线为 secp128r1 的 ECDSA key 生成:

30 25 02 10 4E 32 32 90 CA D9 BD D2 5F 8B BE 3B
F2 BF E9 7F 02 11 00 A7 83 A6 68 AD 74 7E 1A 0E
8F 73 BD DF 7A E8 B5

30 表示后面是一个序列。 25 告诉您序列的长度为 0x25 字节。 02 表示序列中的第一项是整数。 10 告诉您第一个 Integer 的长度为 0x10 字节。接下来的 0x10(16)字节是 ECDSA 签名的“r”值。第一个整数之后是字节 02。这告诉您序列的第二个整数即将开始。 11 告诉您接下来的 0x11 (17) 个字节构成第二个整数,这是 ECDSA 签名的“s”值。它是 11 个字节,因为整数的第一个字节是 00。只要整数的第一个字节 >= 0x80,就会插入“00”。这是为了避免最高有效位为 1,这将指示负整数。

所以毕竟,真正的签名值是:

r: 4E 32 32 90 CA D9 BD D2 5F 8B BE 3B F2 BF E9 7F
s: A7 83 A6 68 AD 74 7E 1A 0E 8F 73 BD DF 7A E8 B5

“额外”字节用于 ASN.1 格式。

关于c++ - ECDSA 使用 OpenSSL 签名,使用 Crypto++ 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316178/

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