Secp256k1曲线签名接近预期签名,但缺少2个分段



私钥:

7a01628988d23fa697fa05fcdae5a82fe4f749aa9f24d35d23f81bee917dfc3

消息:

695369676e65645468697344617461546861744973323536426974734c6f6e67

结果:

205587dfc87c3227ad37b021c08c873ca4b1faada1a83f666d483711edb2f4f743
04ee40d9fe8dd03e6d42bfc7d0e53f75286125a591ed14b39265978ebf3eea36

预期结果:

304402205587dfc87c3227ad37b021c08c873ca4b1faada1a83f666d483711edb2f4f743022004ee40d9fe8dd03e6d42bfc7d0e53f75286125a591ed14b39265978ebf3eea36

正如你所看到的,预期结果有两个片段,我的结果没有:

304402205587dfc87c3227ad37b021c08c873ca4b1faada1a83f666d483711edb2f4f743022004ee40d9fe8dd03e6d42bfc7d0e53f75286125a591ed14b39265978ebf3eea36

我在这里缺少的是,我的结果是否受到了一些压缩或发生了什么事情。

谢谢!

我不知道你是如何得到结果的,但预期的结果看起来像ASN.1/DER编码中的标准ECDSA签名。

分解:

  • 30:表示ASN.1SEQUENCE将紧随其后
  • 44:序列的长度,在本例中为68字节
  • 02:表示ASN.1INTEGER将紧随其后
  • 20:表示整数的长度,在本例中为32字节
  • 55 ... 43:签名的r值的32字节
  • 02:表示ASN.1INTEGER将紧随其后
  • 20:表示整数的长度,在本例中为32字节
  • 04 ... 36:签名的s值的32字节

正如我所说,我不确定您当前所使用的结果是什么类型的编码。它似乎包含了从字节数组中提取rs值所需的最低限度的信息,但放弃了其他所有信息。(我怀疑它可能是PER编码的某种变体或自定义编码方案。(

特别有趣的是,r整数(20(的长度指示符出现在您的结果中。除了实际的rs值之外,这是能够成功解析签名所严格需要的唯一附加信息。由于rs可能是32或33个字节,因此需要一个长度指示符来知道r的结束位置和s的开始位置。