密码学 | 数字签名方法:Schnorr 签名

发布于:2024-04-23 ⋅ 阅读:(27) ⋅ 点赞:(0)

⚠️原文:Introduction to Schnorr Signatures
⚠️写在前面:适用于有一点密码学基础的亲故,否则建议跑路。



1 Schnorr 签名的定义

假设你有密钥对 ( x , X = x ∗ G ) ( x, X = x * G ) (x,X=xG),那么消息 m m m 的 Schnorr 签名 ( R , s ) ( R, s ) (R,s) 为:

R = k ∗ G R = k * G R=kG s = k + H ( R , m ) ∗ x s = k + H( R, m )* x s=k+H(R,m)x

其中 k k k 是随机私钥。

这里作者假定你已经有一点密码学基础了,以防万一,还是说明一下 x x x 是私钥, X X X 是公钥。

让我们分解一下上述过程。

  1. 对于每个签名,签名者都会生成一个随机值 k k k,它是该签名的 一次性私钥
  2. 签名者计算 R R R,即 k k k 的公钥,称 R R R 为随机数(nonce value);
  3. 签名者计算 R R R 和消息 m m m 的哈希值,这个哈希值是实际要签名的内容;
  4. 签名者将该哈希值乘以自己的私钥 x x x,再加上一次性私钥 k k k,得到 s s s

每个签名由一个 ( R , s ) (R, s) (R,s) 对组成: s s s 本质上是 “私钥 x x x 的所有者已签署消息 m m m” 的证明,而 R R R 作为一次性公钥,主要用于和普通公钥 X X X 一起验证该签名。

在比特币中,一个 ( R , s ) (R, s) (R,s) 对使用 64 个字节进行编码,其中前 32 个字节表示 R R R,后 32 个字节表示 s s s

一旦生成签名,任何知道消息 m m m 和公钥 X X X 的人都能够验证该签名。签名验证只是检查:

s ∗ G = ? R + H ( R , m ) ∗ X s * G \overset{?}{=} R + H( R , m )* X sG=?R+H(R,m)X

你会注意到:消息 m m m 和公钥 X X X 必须是已知的,或者是被提供给了验证者的,而 R R R s s s 是作为签名给出的。



2 Schnorr 签名的属性

Schnorr 签名看起来像随机数。

具体来说,值 k k k x x x 是随机数, H ( R , m ) H(R, m) H(R,m) 也是随机数,因为它是哈希函数的输出。宽松地说,将一堆随机数放在一起,得到的还是一个随机数。总之,无论消息是什么以及签名者是谁,值 s s s 都同样可能是任何数字。

请注意,此论点并不能证明 Schnorr 签名不会泄漏有关签名者密钥的信息,我们将在稍后讨论安全性时讨论此属性。

禁止重复使用随机数!

我将密钥 k k k R R R 称为 “一次性的” 是有原因的:如果你使用相同的密钥签署两条不同的消息,你将泄露整个私钥。让我们看看如果你犯了这个错误,攻击者是如何窃取你的密钥的。

攻击者首先获取到:

  • X X X:你的公钥
  • R R R:你不小心重用了的随机数
  • m 1 m_1 m1:你签署的第一条消息
  • s 1 s_1 s1:你生成的第一个签名
  • m 2 m_2 m2:你签署的第二个消息
  • s 2 s_2 s2:你生成的第二个签名

回想一下, s s s 值是对消息 m m m 和私钥 x x x 的承诺,由随机数 k k k 调整。因此,如果攻击者将两个 s s s 值相减,用于隐藏私钥 x x x 的随机调整将被抵消。

重用随机数 R = k ∗ G R=k*G R=kG 意味着两次签名所用的随机数 k k k 是相同的,本质上就没有进行随机调整了。

攻击者计算:

s 1 − s 2 = ( k + H ( R , m 1 ) ∗ x ) − ( k + H ( R , m 2 ) ∗ x ) = H ( R , m 1 ) ∗ x – H ( R , m 2 ) ∗ x = ( H ( R , m 1 ) – H ( R , m 2 ) ) ∗ x \begin{alignat}{2} s_1 - s_2 &= ( k + H( R , m_1 )* x ) - ( k + H( R , m_2 )* x ) \\ &=H( R , m_1 )* x – H( R , m_2 )* x \\ &= (H( R , m_1 ) – H( R , m_2 ))* x \end{alignat} s1s2=(k+H(R,m1)x)(k+H(R,m2)x)=H(R,m1)xH(R,m2)x=(H(R,m1)H(R,m2))x

正如我所说, k k k 值实现的随机调整抵消了,只留下 H ( . . . ) ∗ x H(...)*x H(...)x 值的差异,它只是两个哈希值差异的 x x x 倍。除此之外,这两个哈希值还都是已知的,因为它们是公共信息的哈希。

因此攻击者可以求解 x x x

x = ( s 1 − s 2 ) ∗ ( H ( R , m 1 ) − H ( R , m 2 ) ) − 1 x = ( s_1 - s_2 )*(H( R , m_1 ) - H( R , m_2 )) ^{-1} x=(s1s2)(H(R,m1)H(R,m2))1

BIP 340 尝试通过将消息 m m m 用作生成密钥 k k k 的密钥生成函数的一个输入,以确保不会发生随机数重用。因为如果消息 m m m 改变,随机数 k k k 也会跟着改变。

这两个属性同样适用于 ECDSA 以及许多其他签名协议,实际上,它们是 Schnorr 签名安全性不可或缺的一部分。



3 与 ECDSA 比较

ECDSA 和 Schnorr 之间的两个主要区别使得 Schnorr 签名独特且更优越:

  • Schnorr 签名比 ECDSA 签名更小、更快。比特币中使用的 ECDSA 签名长度为 70 或 71 字节,而 Schnorr 签名仅为 64 字节。此外,Schnorr 签名的生成和验证明显快于 ECDSA 签名。
  • Schnorr 签名是线性的。这是将 Schnorr 与其他签名方案区分开来的关键区别。

线性是签名函数 Sign 的属性,该属性说明:

S i g n ( x 1 , k 1 , m ) + S i g n ( x 2 , k 2 , m ) = S i g n ( x 1 + x 2 , k 1 + k 2 , m ) Sign(x_1, k_1, m) + Sign(x_2, k_2, m) = Sign(x_1 + x_2, k_1 + k_2, m) Sign(x1,k1,m)+Sign(x2,k2,m)=Sign(x1+x2,k1+k2,m)

上述等式说明,如果两个实体签署同一条消息,然后将它们的签名相加,我们最终将得到它们聚合密钥的有效签名!

签名函数 Sign 是一个接受私钥 x x x 和消息 m m m 作为输入并输出部分签名 s s s 的函数。

通过修改 Schnorr 签名的版本来验证 “Schnorr 签名是线性的”。具体来说,令聚合随机值 R = R 1 + R 2 R = R_1 + R_2 R=R1+R2,即每个随机值 R i R_i Ri 的和。

什么叫做 “修改 Schnorr 签名的版本”?答:因为 H ( R 1 , m ) H(R_1,m) H(R1,m) H ( R 2 , m ) H(R_2,m) H(R2,m) 是没有办法相加的,所以我们换做使用 H ( R , m ) H(R,m) H(R,m),其中 R R R R 1 R_1 R1 R 2 R_2 R2 的和,以此来实现相加😇

将两个实体的签名相加:

S c h n o r r S i g n ( x 1 , k 1 , m ) + S c h n o r r S i g n ( x 2 , k 2 , m ) = ( k 1 + H ( R , m ) ∗ x 1 ) + ( k 2 + H ( R , m ) ∗ x 2 ) = ( k 1 + k 2 ) + H ( R , m ) ∗ ( x 1 + x 2 ) = S c h n o r r S i g n ( x 1 + x 2 , k 1 + k 2 , m ) \begin{alignat}{2} SchnorrSign(x_1, k_1, m) &+ SchnorrSign(x_2, k_2, m) \\ &= (k_1 + H(R, m)*x_1) + (k_2 + H(R, m)*x_2) \\ &= (k_1 + k_2) + H(R, m)*(x_1 + x_2) \\ &= SchnorrSign(x_1 + x_2, k_1 + k_2, m) \end{alignat} SchnorrSign(x1,k1,m)+SchnorrSign(x2,k2,m)=(k1+H(R,m)x1)+(k2+H(R,m)x2)=(k1+k2)+H(R,m)(x1+x2)=SchnorrSign(x1+x2,k1+k2,m)

我们修改了 Schnorr 签名以使用相同的哈希,从而得到了一个很好的线性签名函数。

请注意,ECDSA 是没有这个属性的。

最后,正如 BIP 340 中所说:“尽管有这些优势,几乎没有缺点。” Schnorr 是基于椭圆曲线的最简单的签名方案,比特币将只会从它中受益。

好硬核的机翻💥