SHA256withECDSA签名算法的输出格式是什么?

big*_*ker 0 java cryptography bouncycastle ecdsa

我正在使用secp256k1曲线生成密钥对。然后,我使用私钥对随机字符串进行签名:

byte[] content = "random string".getBytes();
Signature dsa = Signature.getInstance("SHA256withECDSA");
dsa.initSign(privateKey);
dsa.update(content);
byte[] signature = dsa.sign();
Run Code Online (Sandbox Code Playgroud)

签名字节数组具有以下内容:

[48, 68, 2, 32, 11, 25, 119, -64, -107, 53, -84, 65, -18, -81, -56, 34,
11, 29, 120, 38, -102, 105, -89, -9, -46, -28, 91, 59, -74, -103, -53,
117, 81, -37, 85, 27, 2, 32, 55, 97, -11, -85, 110, -106, 81, -94, 7,
112, 125, -29, -16, -8, 121, 123, 14, -17, -7, -10, 1, -80, -117, 86,
98, -13, -47, -51, 58, -15, -48, 10]
Run Code Online (Sandbox Code Playgroud)

我想了解签名数组的内容。根据ECDSA维基百科页面,签名是计算出的值(rs),但在我看来,该数组中还有更多。签名始终以字节开头

48, 68, 2, 32
Run Code Online (Sandbox Code Playgroud)

这似乎是某种标题。是否有说明该数组格式的规范?具体来说,我想获得rs值。

谢谢。

dav*_*085 8

我很确定这是骗子,但我现在没有时间看。

ECDSA(或DSA)签名有一些标准表示/编码。Java JCE使用的一种是ASN.1 DER编码-有关基础知识详细信息,请参见Wikipedia 。具体来说,ECDSA或DSA签名是两个INTEGER字段的ASN.1 SEQUENCE;看到ECDSA-Sig-Valuerfc3279第2.2.3节或部分的114页附录SEC1 C.5或X9.62但成本钱。

字节48(0x30)是SEQUENCE的标签(实际上是SEQUENCE的0x10加上“已构建”的0x20),其后是一个或多个字节,给出了序列主体的长度;对于EC,主体几乎总是足够短,可以使用简单的一字节长度。2是INTEGER的标记,后跟一个字节,给出第一个整数的长度fo。在该整数的值(也称为内容)结束之后,将还有另一个2,它是第二个整数的标记,后跟一个字节,该字节是第二个整数的长度。secp256k1的整数通常具有32或33个八位位组的长度,具体取决于它们是否需要填充以确保符号为正,因为ASN.1整数是带符号的,而在DER中,它们是二进制补码,但在极少数情况下会更少。

  • 非常感谢。我能够使用以下方法从私钥中提取 s:`new ASN1InputStream(new ByteArrayInputStream(signature));` (2认同)