【问题标题】:What is the output format of the SHA256withECDSA signature algorithm?SHA256withECDSA 签名算法的输出格式是什么?
【发布时间】:2018-01-30 20:52:28
【问题描述】:

我正在使用 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

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

谢谢。

【问题讨论】:

    标签: java cryptography bouncycastle ecdsa


    【解决方案1】:

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

    ECDSA(或 DSA)签名有几种标准表示/编码。 Java JCE 使用的一种是 ASN.1 DER 编码——请参阅维基百科了解basicsdetails。 具体来说,ECDSA 或 DSA 签名是两个 INTEGER 字段的 ASN.1 SEQUENCE;请参阅rfc3279 section 2.2.3 中的ECDSA-Sig-ValueSEC1 appendix C.5 on page 114 或X9.62 的一部分,但这需要花钱。

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

    【讨论】:

    • 非常感谢。我能够使用以下方法从私钥中提取 s:new ASN1InputStream(new ByteArrayInputStream(signature));
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 2013-04-15
    • 2014-12-28
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多