SHA256withECDSA签名算法的输出格式是什么?
What is the output format of the SHA256withECDSA signature algorithm?
我正在使用 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
这似乎是某种 header。是否有说明该数组格式的规范?具体来说,我想获得 r 和 s 值。
谢谢。
我很确定这是一个骗局,但我现在没时间看。
ECDSA(或 DSA)签名有几个标准 representations/encodings。 Java JCE 使用的是 ASN.1 DER 编码——参见维基百科 basics and details。
具体来说,ECDSA 或 DSA 签名是两个 INTEGER 字段的 ASN.1 SEQUENCE;参见 rfc3279 section 2.2.3 or part of SEC1 appendix C.5 on page 114 或 X9.62 中的 ECDSA-Sig-Value
,但这要花钱。
字节 48 (0x30) 是 SEQUENCE 的标记(实际上是 SEQUENCE 的 0x10 加上 'constructed' 的 0x20),其后跟一个或多个字节,给出序列主体的长度;对于 EC,正文几乎总是足够短,可以使用简单的一字节长度。 2 是 INTEGER 的标记,后面跟着一个字节,给出第一个整数的长度。在该整数的值(又名内容)结束后,将有另一个 2,它是第二个整数的标记,后跟一个字节,它是第二个整数的长度。 secp256k1 的整数通常具有 32 或 33 个八位字节的长度,具体取决于它们是否需要填充以确保符号为正,因为 ASN.1 整数是有符号的并且在 DER 中它们是二进制补码,但在极少数情况下更少。
我正在使用 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
这似乎是某种 header。是否有说明该数组格式的规范?具体来说,我想获得 r 和 s 值。
谢谢。
我很确定这是一个骗局,但我现在没时间看。
ECDSA(或 DSA)签名有几个标准 representations/encodings。 Java JCE 使用的是 ASN.1 DER 编码——参见维基百科 basics and details。
具体来说,ECDSA 或 DSA 签名是两个 INTEGER 字段的 ASN.1 SEQUENCE;参见 rfc3279 section 2.2.3 or part of SEC1 appendix C.5 on page 114 或 X9.62 中的 ECDSA-Sig-Value
,但这要花钱。
字节 48 (0x30) 是 SEQUENCE 的标记(实际上是 SEQUENCE 的 0x10 加上 'constructed' 的 0x20),其后跟一个或多个字节,给出序列主体的长度;对于 EC,正文几乎总是足够短,可以使用简单的一字节长度。 2 是 INTEGER 的标记,后面跟着一个字节,给出第一个整数的长度。在该整数的值(又名内容)结束后,将有另一个 2,它是第二个整数的标记,后跟一个字节,它是第二个整数的长度。 secp256k1 的整数通常具有 32 或 33 个八位字节的长度,具体取决于它们是否需要填充以确保符号为正,因为 ASN.1 整数是有符号的并且在 DER 中它们是二进制补码,但在极少数情况下更少。