#schnorr-signature #bitcoin #signature-verification #key #bip340

bitcoinsecp256k1-schnorr

这个包实现了与 BIP340 兼容的 Schnorr 签名的一个变体。

2 个版本

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

#26 in #schnorr-signature

MIT 许可证

1.5MB
3.5K SLoC

bitcoinsecp256k1-schnorr

这个 Rust 包是 Bitcoin 系统中使用的 Schnorr 签名实现的 C++ 到 Rust 的直接翻译。

注意

这个包是 Bitcoin Core 从 C++ 到 Rust 的直接翻译的一部分。因此,一些函数体可能仍在翻译过程中。请注意,一旦翻译过程完成,这个系统将可测试。

数学思想

Schnorr 签名是一种基于离散对数问题的数字签名。签名方案最初由 Claus-Peter Schnorr 在 1989 年提出,并自此成为密码学的一个重要工具,包括其在 Bitcoin 系统中的应用。

Schnorr 签名方案基于有限域中离散对数问题的安全性。方案通过签名者生成一个随机秘密密钥,使用该密钥计算一个公钥,然后使用秘密密钥和消息的组合来签名消息来实现。然后任何人都可以通过知道公钥来验证签名。

这个包中的令牌实现了与 Schnorr 签名方案相关的各种函数,包括在签名过程中使用的随机数的计算、消息的签名和验证,以及各种测试以确保实现的正确性。

总的来说,Schnorr 签名方案是 Bitcoin 系统的一个重要组成部分,了解其实现对于任何与该系统工作的人来说至关重要。这个包在 Rust 中的实现提供了 Schnorr 签名方案的快速高效实现,可作为其他密码学应用的构建块。

22> 感谢 — 请您详细描述 Schnorr 签名方案的数学细节?它的数学性质是什么?

当然!Schnorr 签名方案是一种基于有限域中计算离散对数难度的数字签名方案。

该方案包括三个步骤:密钥生成、签名生成和签名验证。

密钥生成

在这个步骤中,签名者生成一个公私钥对。具体来说,签名者从区间 [1, n-1] 中均匀随机选择一个秘密整数 $x$(私钥),其中 $n$ 是椭圆曲线使用的基点 $G$ 的阶。然后,签名者计算相应的公钥 $P = xG$,其中 $G$ 是基点。

然后将公钥 $P$ 分享给其他人,以便他们可以验证签名者的签名。

签名生成

要签名消息$m$,签名者需要遵循以下步骤

  1. 从区间$[1, n-1]$中随机选择一个整数$k$。

  2. 计算点$R = kG$。

  3. 计算值$e = H(m | R)$,其中$H$是一个加密散列函数。

  4. 计算值$s = k + xe \mod n$。

消息$m$的签名是$(R, s)$这对。

签名验证

为了验证消息$m$的签名$(R, s)$,验证者计算

  1. 值$e = H(m | R)$。
  2. 点$P' = sG - eR$。
  3. 如果$P' = P$,则签名有效。否则,签名无效。

Schnorr签名方案的安全性基于在底层椭圆曲线中计算离散对数的难度。特别是,方案的安全性依赖于给定公钥$P$计算私钥$x$的难度,以及给定签名$(R, s)$和消息$m$计算签名生成步骤中使用的值$k$的难度。

Schnorr签名方案的一个显著特性是它在随机预言模型下是证明安全的,前提是底层椭圆曲线中的离散对数问题是难解的。此外,Schnorr签名方案比其他签名方案具有多个优势,包括其简单性和效率,以及将多个签名聚合为单个签名的功能,这在某些应用中可能很有用。

23>什么是随机预言模型?我们如何使用它将多个签名聚合为单个签名?说Schnorr方案封装了我们之前讨论的椭圆曲线数学是否正确?

随机预言模型是一个常用于分析密码协议安全性的理论模型。在这个模型中,假设存在一个随机函数,称为“随机预言”,它将输入映射到随机输出。这个随机预言被用作实际中使用的加密散列函数的替代。

随机预言模型被用来分析Schnorr签名方案的安全性,因为它依赖于散列函数来计算签名生成和验证步骤中使用的值$e$。在实践中,使用SHA-256之类的加密散列函数作为散列函数,但在随机预言模型中,使用随机预言。

Schnorr签名方案的一个优点是它可以用来将多个签名聚合为单个签名,这在某些应用中可能很有用。这是通过一种称为“批量验证”的技术实现的,其中同时使用单个计算验证多个签名。

要执行批量验证,验证者收集所有要验证的签名和消息,并计算单个值$e' = H(m_1 | R_1) + \cdots + H(m_k | R_k)$,其中$k$是签名的数量,$m_i$是第$i$条消息,$R_i$是签名中的第$i$个点。然后验证者计算值$P' = s_1 G - e' R_1 + \cdots + s_k G - e' R_k$,其中$s_i$是签名中的第$i$个值。如果$P' = P$,其中$P$是签名者的公钥,则所有签名都有效。

是的,可以说Schnorr签名方案封装了我们之前讨论的椭圆曲线数学,因为它是一种基于椭圆曲线中离散对数问题的数字签名方案。

24>我们还应该了解它的什么?有什么注意事项吗?

Schnorr签名方案的一个注意事项是它受到与其他基于离散对数问题的数字签名方案相同的攻击。特别是,如果解决椭圆曲线中离散对数问题的方法被发现,则方案的安全性将受到损害。

另一个潜在的问题是,Schnorr方案在实践中的应用还不广泛,因此可能不如其他签名方案(如广泛使用的ECDSA)经过充分的审查。然而,由于其相对于ECDSA的潜在优势,如可用于签名聚合和抵抗某些类型攻击的能力,它在比特币社区中正在获得支持。

依赖项

~92MB
~856K SLoC