密码学 | 多重签名:基于 Schnorr 的 MuSig 方案

⚠️原文:Schnorr Applications: MuSig

⚠️写在前面:本文属搬运博客,自己留存学习。



1 什么是多签名?

多签名 是指:一组签名密钥 ( X 1 , X 2 , . . . , X n ) (X_1, X_2, ..., X_n) (X1,X2,...,Xn) 共同生成一条消息的签名。

任何正常签名方案 —— 如 Schnorr 或 ECDSA —— 的多签名方案,最简单的方法是将每个签名者对给定消息的单个签名连接起来: s = ( s 1 , s 2 , . . . , s n ) s=(s_1, s_2, ..., s_n) s=(s1,s2,...,sn)

个人理解:默认的 Schnorr 或 ECDSA 是单签名方案,但它们也可以有多签名版本。最简单的方式,就是将各个单签名连接起来,构成一个多签名。

这个方案已在比特币中通过操作 OP_CHECKMULTISIG —— 简称 OP_CMS —— 得到支持。实际上,OP_CMS 支持更多的操作,你可以创建一个由 m-of-n 参与者控制的地址,其中 m ≤ n,但我们今天只考虑 n-of-n 的情况。

什么是 m-of-n 参与者?答:意思是,至少需要 n 个参与者中的 m 个人同意,才能生成一个有效的签名。当 m=1 时,它等同于传统的单签名方案,即只需要一个人同意即可生成签名。

虽然 OP_CMS 是一个正确的多签名方案,但它有一些严重的缺点。在这种方案中,n-of-n 多签名将是常规签名的 n 倍 大小,因为它需要在链上放置 n 个签名和公钥对。同样,这比验证单个签名需要更长的时间。最后,它没有隐私功能,因为所有参与者都是公开的,即所有 n 个密钥都必须用于验证。

为什么需要在链上放置 n 个签名和公钥对?答:因为在验证签名的时候,我们需要使用相应的签名和公钥。由于在 OP_CMS 方案中,一个多签名是由 n 个签名拼接来的,因此我们在验证时需要这 n 个签名和它们各自对应的公钥。

MuSig 旨在解决这些问题,它是一个 Schnorr 多签名方案。无论签字方的数量多少,它都能产生一个与普通 Schnorr 签名无法区分的签名。因此,MuSig 签名的验证与普通 Schnorr 签名完全相同。此外,它支持 密钥聚合,因此单个签名密钥可以保持私密。

与 OP_CMS 相比,MuSig 降低了存储负担、减少了验证时间、保护了密钥隐私????

具体来说,假设有 n 个签名者 X 1 , X 2 , . . . , X n X_1, X_2, ..., X_n X1,X2,...,Xn 和一条消息 m m m,他们希望共同签署这条消息。通过使用 MuSig,他们可以生成一个单一的 Schnorr 签名 ( R , s ) (R, s) (R,s)

这将使用 聚合密钥 X = a g g ( X 1 , X 2 , . . . , X n ) X = agg(X_1, X_2, ..., X_n) X=agg(X1,X2,...,Xn) m m m 进行有效签名,这样在任何公共空间 —— 如区块链 —— 中,这 n 个签名者们可以假装自己只是一位拥有密钥 X X X 的签名者。简而言之,我们可以使得多签名输出和标准输出没有区别。



2 朴素 Schnorr 多签名

针对签名者 i i i,我们对其所使用的变量进行说明:

  • 私钥: x i x_i xi
  • 公钥: X i = x i ∗ G X_i=x_i*G Xi=xiG
  • 一次性私钥: k i k_i ki
  • 部分签名: R i = k i ∗ G R_i=k_i*G Ri=kiG
  • 部分签名: s i = k i + H ( X , R , m ) ∗ x i s_i=k_i+H(X, R, m)*x_i si=ki+H(X,R,m)xi

为什么叫作一次性私钥?答:签名者 i i i 每次签名都会重新生成一个随机值 k i k_i ki,对 k i k_i ki 是用完即弃,与 x i x_i xi 这种长期性私钥应该区分开来。

假设有 n n n 个签名者。

朴素 Schnorr 多签名让每个签名者分享自己的公钥 X i X_i Xi,计算并定义聚合密钥为:

X = X 1 + X 2 + . . . + X n X = X_1 + X_2 + ... + X_n X=X1+X2+...+Xn

让每个签名者生成并分享自己的部分签名 R i R_i Ri,计算并定义部分聚合签名为:

R = R 1 + R 2 + . . . + R n R = R_1 + R_2 + ... + R_n R=R1+R2+...+Rn

为什么 R i R_i Ri 被称为 部分签名 R R R 被称为 部分聚合签名?答:因为一个完整的签名是 ( R , s ) (R, s) (R,s),所以单独的 R R R s s s 只能算作部分签名或者部分聚合签名。

获得部分聚合签名 R R R 后,每个签名者可以自行计算他们的部分签名 s i s_i si

s i = k i + H ( X , R , m ) ∗ x i s_i = k_i + H(X, R, m)*x_i si=ki+H(X,R,m)xi

为了让 s i s_i si 们可以相加,朴素 Schnorr 多签名Schnorr 签名 中的 H ( X , R i , m ) H(X, R_i, m) H(X,Ri,m) 改为了 H ( X , R , m ) H(X, R, m) H(X,R,m)

然后再分享自己的部分签名 s i s_i si,计算并定义部分聚合签名为:

s = s 1 + s 2 + . . . + s n = ( k 1 + . . . + k n ) + H ( X , R , m ) ∗ ( x 1 + . . . + x n ) = k + H ( X , R , m ) ∗ x \begin{alignat}{2} s &= s_1 + s_2 + ... + s_n \\ &= (k_1 + ... + k_n) + H(X, R, m)*(x_1 + ... + x_n) \\ &= k + H(X, R, m)*x \end{alignat} s=s1+s2+...+sn=(k1+...+kn)+H(

上一篇:详解Tomcat下载安装以及IDEA配置Tomcat(2023最新)


下一篇:uniapp picker 多列选择器用法