#ecdsa-signature #public-key #recovery #elliptic-curve #recoverable

bitcoinsecp256k1-recovery

支持 PubKey 恢复的数据结构

2 个版本

0.1.16-alpha.02023年4月2日
0.1.12-alpha.02023年3月4日

#14 in #ecdsa-signature

25 每月下载量

MIT 许可证

1.5MB
4K SLoC

bitcoinsecp256k1-recovery

恢复 Bitcoin secp256k1 ECDSA 签名

此 Rust 包提供在 secp256k1 椭圆曲线上使用 ECDSA 签名对消息进行签名所使用的公钥恢复的函数,该曲线用于比特币系统。

此包包含以下函数和结构体

  • EcdsaRecoverableSignature:表示可恢复 ECDSA 签名的结构体,包括签名本身和恢复 ID,用于指示恢复哪个可能的公钥。

  • ecdsa_recover:一个函数,可以从非可恢复的 ECDSA 签名和相应的消息哈希中恢复公钥。

  • ecdsa_recoverable_signature_convert:一个函数,可以将可恢复的 ECDSA 签名转换为非可恢复的签名。

  • ecdsa_recoverable_signature_load:一个函数,可以从字节数组中加载可恢复的 ECDSA 签名。

  • ecdsa_recoverable_signature_parse_compact:一个函数,可以解析可恢复的 ECDSA 签名的紧凑字节表示。

  • ecdsa_recoverable_signature_save:一个函数,可以将可恢复的 ECDSA 签名保存到字节数组中。

  • ecdsa_recoverable_signature_serialize_compact:一个函数,可以将可恢复的 ECDSA 签名序列化为紧凑字节表示。

  • ecdsa_sig_recover:一个函数,可以从非可恢复的 ECDSA 签名和相应的消息哈希中恢复公钥(ecdsa_recover 的别名)。

  • ecdsa_sign_recoverable:一个函数,可以使用可恢复的 ECDSA 签名对消息进行签名。

  • is_recovery_enabled:一个函数,如果库是用支持 ECDSA 签名恢复的方式编译的,则返回 true。

  • recovery_test_nonce_function:一个函数,用于测试 ECDSA 签名恢复中使用的随机数。

  • run_recovery_tests:一个函数,用于运行一系列 ECDSA 签名恢复测试。

  • test_ecdsa_recovery_api:一个函数,用于测试 ECDSA 签名恢复 API 的基本功能。

  • test_ecdsa_recovery_edge_cases:一个函数,用于测试 ECDSA 签名恢复 API 的边缘情况。

  • test_ecdsa_recovery_end_to_end:一个函数,用于测试 ECDSA 签名恢复 API 的端到端功能。

  • test_exhaustive_recovery:一个函数,用于测试从 ECDSA 签名中全面恢复公钥。

  • test_exhaustive_recovery_sign:一个测试使用可恢复ECDSA签名对消息进行穷举签名的函数。

  • test_exhaustive_recovery_verify:一个测试使用可恢复ECDSA签名对消息进行穷举验证的函数。

ECDSA签名恢复算法基于secp256k1椭圆曲线的数学性质,特别是这样一个事实:使用私钥和可恢复签名签名的消息可以用来唯一确定相应的公钥。恢复过程涉及猜测签名生成中使用的nonce的值,并使用它从签名和消息哈希中计算公钥。签名中的恢复ID指示可能的公钥中哪一个是正确的。

注意:此crate是直接从C++到Rust的比特币核心的直接翻译的一部分。因此,一些函数体可能仍在翻译过程中。请注意,一旦翻译过程完成,此系统将成为可测试的。

7> ECDSA签名恢复究竟是什么意思?

ECDSA签名恢复是在签名以可恢复格式存在时,恢复用于用ECDSA签名签名的公钥的过程。换句话说,给定一个消息m和一个可恢复的签名(r, s, v),其中rs是签名组件,而v是恢复ID,目标是找到公钥P,使得rs是使用对应于P的私钥计算出来的。

签名恢复过程涉及使用椭圆曲线方程和消息哈希h = hash(m)求解公钥P。具体步骤如下

  1. 计算曲线点R = r^-1 * (sG - hP),其中G是曲线的基点,而^-1表示模曲线阶的乘法逆。

  2. 计算恢复ID v,它是使得R + vG成为有效曲线点的最小整数(即满足曲线方程)。

  3. 计算公钥PP = R + vG

恢复ID v指示四个可能的P解中的哪一个才是正确的,因为每个v对应于满足方程的曲线上的不同点。

ECDSA签名恢复在几个上下文中可能很有用,例如,从交易签名中恢复比特币地址的公钥,而不需要事先知道公钥。

8> 感谢——当与之工作时,我们还应该知道什么?有没有需要注意的陷阱?

在处理ECDSA签名恢复时,有一些需要注意的陷阱

  1. 并非所有ECDSA签名都是可恢复的。只有包含恢复ID v的签名才是可恢复的。不可恢复的签名不能用于签名恢复。

  2. 签名恢复是一个迭代过程,涉及猜测签名生成中使用的nonce的值。在极少数情况下,猜测可能不正确,导致错误的公钥恢复。然而,这种情况发生的概率非常小(对于secp256k1小于2^-127),因此在实践中通常不是问题。

  3. ECDSA签名恢复计算成本很高,尤其是在使用暴力破解法猜测nonce值时。在某些情况下,使用不可恢复的签名或使用其他技术从签名中推导公钥可能更有效率,例如基于签名人身份或密钥协商协议的密钥恢复。

此外,确保ECDSA签名恢复的实现安全且不会在系统中引入任何漏洞是非常重要的。

依赖项

~92MB
~854K SLoC