div*_*ivB 3 c++ openssl cryptography crypto++ ecdsa
我在Wei Dai的Crypto ++应用程序中创建了一个ECDSA密钥对(secp128r1).签名和验证按预期工作.我没有将消息本身添加到签名中以最小化签名长度(正好是32字节).
但是,当我使用openssl创建签名时:
$ cat test.txt | openssl dgst -ecdsa-with-SHA1 -sign sample.key -keyform DER > act.bin
Run Code Online (Sandbox Code Playgroud)
OpenSSL显然将消息本身放到签名上,从而产生更大的签名(例如39字节).如果我设置,我可以使用Crypto ++验证签名CryptoPP::SignatureVerificationFilter::PUT_MESSAGE.
我是否可以告诉OpenSSL签署一条消息而不将消息放入签名,以便生成的签名完全是32字节?
CodesInChaos是正确的.签名中的额外字节来自ASN.1编码,而不是签名的原始消息.例如,这是一个39字节的签名,使用带有曲线secp128r1的ECDSA密钥生成:
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
Run Code Online (Sandbox Code Playgroud)
30表示序列如下.25告诉你序列长度为0x25字节.02表示序列中的第一项是整数.10告诉你第一个Integer是0x10字节长.以下0x10(16)字节是ECDSA签名的"r"值.在第一个整数之后是字节02.这告诉你序列的第二个整数即将开始.11告诉您下一个0x11(17)字节构成第二个整数,这是ECDSA签名的"s"值.它是11个字节,因为Integer的第一个字节是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
Run Code Online (Sandbox Code Playgroud)
"额外"字节用于ASN.1格式化.
| 归档时间: |
|
| 查看次数: |
3127 次 |
| 最近记录: |