Secp256k1 曲线签名接近预期签名但缺少 2 段
Posted
技术标签:
【中文标题】Secp256k1 曲线签名接近预期签名但缺少 2 段【英文标题】:Secp256k1 Curve Signature close to expected signature but missing 2 segements 【发布时间】:2020-03-17 01:27:32 【问题描述】:私钥:
7a01628988d23fae697fa05fcdae5a82fe4f749aa9f24d35d23f81bee917dfc3
消息:
695369676e65645468697344617461546861744973323536426974734c6f6e67
结果:
205587dfc87c3227ad37b021c08c873ca4b1faada1a83f666d483711edb2f4f743 04ee40d9fe8dd03e6d42bfc7d0e53f75286125a591ed14b39265978ebf3eea36
预期结果:
304402205587dfc87c3227ad37b021c08c873ca4b1faada1a83f666d483711edb2f4f7430220 04ee40d9fe8dd03e6d42bfc7d0e53f75286125a591ed14b39265978ebf3eea36
如您所见,预期结果有 2 个部分,而我的结果没有:
304402 205587dfc87c3227ad37b021c08c873ca4b1faada1a83f666d483711edb2f4f743 0220 04ee40d9fe8dd03e6d42bfc7d0e53f752836125a9811ed36126a5911ed
我在这里遗漏了什么,我的结果是否有一些压缩或发生了什么。
谢谢!
【问题讨论】:
【参考方案1】:我不知道您是如何得到结果的,但预期的结果看起来像 ASN.1/DER 编码中的标准 ECDSA 签名。
分解:
30
: 表示将跟随 ASN.1 SEQUENCE
44
:序列的长度,在本例中为 68 个字节
02
: 表示将跟随 ASN.1 INTEGER
20
:表示整数的长度,本例为32字节
55 ... 43
:签名的r
值的32字节
02
: 表示将跟随 ASN.1 INTEGER
20
:表示整数的长度,本例为32字节
04 ... 36
:签名的s
值的32字节
正如我所说,我不确定您当前拥有的结果使用的是什么类型的编码。它似乎包含能够从字节数组中提取r
和s
值所需的最少信息,但会丢弃其他所有信息。 (我怀疑它可能是PER 编码或自定义编码方案的某种变体。)
特别有趣的是,r
整数 (20
) 的长度指示符出现在您的结果中。除了实际的r
和s
值之外,这是成功解析签名所严格需要的唯一附加信息。由于 r
和 s
可能是 32 或 33 个字节,因此您需要一个长度指示器来了解 r
的结束位置和 s
的开始位置。
【讨论】:
您好,我正在关注这个过程:block.io/api/simple/signing 并使用这个 c# 库进行签名:github.com/Chainers/Cryptography.ECDSA 那么可能值得尝试另一种方法而不是SignCompressedCompact()
。或者找到另一个库,因为你使用的那个库的文档很差。
我会尝试寻找另一个库进行签名以上是关于Secp256k1 曲线签名接近预期签名但缺少 2 段的主要内容,如果未能解决你的问题,请参考以下文章
ANFS | ED25519密钥体系 技术一小步 行业发展一大步