我正在使用secp256k1曲线生成密钥对。然后我使用私钥签署随机字符串:
byte[] content = "random string".getBytes();
Signature dsa = Signature.getInstance("SHA256withECDSA");
dsa.initSign(privateKey);
dsa.update(content);
byte[] signature = dsa.sign();
签名字节数组具有以下内容:
[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]
我想了解签名数组的内容是什么。根据ECDSA维基百科页面,签名是计算出的值( r , s ),但在我看来,该数组中还有更多。签名始终以字节
开头48, 68, 2, 32
这似乎是某种标题。是否有解释该数组格式的规范?具体来说,我想获取 r 和 s 值。
感谢。
答案 0 :(得分:4)
我很确定这是一个骗局,但我现在没有时间看。
ECDSA(或DSA)签名有一些标准表示/编码。 Java JCE使用的是 ASN.1 DER 编码 - 请参阅维基百科basics和details。
具体而言,ECDSA或DSA签名是两个INTEGER字段的ASN.1 SEQUENCE;请参阅rfc3279 section 2.2.3中的ECDSA-Sig-Value
或SEC1 appendix C.5 on page 114或X9.62中的部分内容,但需要花钱。
字节48(0x30)是SEQUENCE的标签(实际上是SEQUENCE的0x10加上构造的'的0x20),然后是一个或多个字节,给出序列主体的长度;对于EC,主体几乎总是短到足以使用简单的一字节长度。 2是INTEGER的标记,后跟一个字节,给出第一个整数的长度。在该整数的值(又名内容)结束之后,将有另一个2,它是第二个整数的标记,后跟一个字节,该字节是第二个整数的长度。 secp256k1的整数通常长度为32或33个八位字节,具体取决于它们是否需要填充以确保符号为正,因为ASN.1整数是有符号的,而在DER中它们是两个补码,但在极少数情况下以下。