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字节

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

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

【讨论】:

您好,我正在关注这个过程:block.io/api/simple/signing 并使用这个 c# 库进行签名:github.com/Chainers/Cryptography.ECDSA 那么可能值得尝试另一种方法而不是SignCompressedCompact()。或者找到另一个库,因为你使用的那个库的文档很差。 我会尝试寻找另一个库进行签名

以上是关于Secp256k1 曲线签名接近预期签名但缺少 2 段的主要内容,如果未能解决你的问题,请参考以下文章

使用带有曲线 secp224k1 的私钥签署 ECDSA

libsecp256k1比特币密码算法开源库

libsecp256k1比特币密码算法开源库

ANFS | ED25519密钥体系 技术一小步 行业发展一大步

一文说明白ECDSA spec256k1 spec256r1 EdDSA ed25519千丝万缕的关系

libsecp256k1比特币密码算法开源库