Schnorr signature & Schnorr multi-signature

本文首发于 https://zhuanlan.zhihu.com/blockchain-top-paper

阅读本文前,建议先阅读下面这篇文章。

https://zhuanlan.zhihu.com/p/82128984

本文讲解一种数字签名方法。其作用跟现实中的签名是一样的:签名是签名者身份的证明。其中签名又包含单人签名和多人签名的过程。了解数字签名的原理和过程,可参考:
区块链中大量使用了签名。

问题在于,在多签名的场景中,如果将每一个签名都保存到区块链中,是很占存储的。有没有一种多签名的方法,不用将所有的签名存储到区块链中,但也能完成多签名的功能呢?

下面便是一种解决方法:Schnorr signature & Schnorr multi-signature

先讲解单方Schnorr签名的方法和证明过程;再讲解多方使用Schnorr签名的方法,但是最终的签名数据大小和单个party的签名大小一样。这可应用在区块链比如比特币的多方签名的应用场景中。目前比特币不是使用该方法进行多签名。

1 单方签名:

1.1 签名者对消息S签名:
V = G v V = G^v V=Gv
c = H ( V ∣ ∣ S ) ( 1 ) c = H(V || S) (1) c=H(VS)1
r = v − c x r = v - cx r=vcx
签名结果为(c,r),将其发送给认证者。其中 v 是一个随机数, x 是签名者的私钥,对应的公钥为 X = G x X = G^x X=Gx

1.2 认证者认证对消息S的签名,即认证者是知道签名和S的。
V ′ = G r X c ( 2 ) V' = G^rX^c (2) V=GrXc2
c = ? H ( V ′ ∣ ∣ S ) ( 3 ) c =? H(V' || S) (3) c=?H(VS)3
如果等式成立,认证成功。

证明:
这里只要证明(1)(2)式中 V = V’ ,就可以证明等式(3)式成立。
V ′ = G r X c = G v − c x X c = G v G c x G x c = G v = V V' = G^rX^c = G^{v-cx}X^c = \frac{G^v}{G^{cx}}G^{xc} = G^v = V V=GrXc=GvcxXc=GcxGvGxc=Gv=V
证毕

2 多方签名:

各个签名者(parties)的私钥为: x 1 , . . . , x n ; x_1, ...,x_n ; x1,...,xn;对应的公钥为: X 1 , . . . , X n = G x 1 , . . . , G x n X_1,...,X_n = G^{x_1}, ..., G^{x_n} X1,...,Xn=Gx1,...,Gxn
聚合所有的公钥: X = ∏ i = 1 n X i = G ∑ i n x i X = \prod_{i = 1}^{n}X_i = G^{\sum_{i}^{n}{x_i}} X=i=1nXi=Ginxi
2.1 多方签名的过程:
1)所有的parties各自生成一个随机数 v ,不公开它,进一步计算得到 V_i = G^{v_i} ,各个parties将 V_i 发给leader。
2)leader收集所有的V_i之后,计算
V = ∏ i = 1 n V i V = \prod_{i = 1}^{n}V_i V=i=1nVi
c = H ( V ∣ ∣ S ) c = H(V || S) c=H(VS)
其中S是被签名的消息。
3) leader将c广播给各个parties,parties给leader返回 r i = v i − c x i r_i = v_i - cx_i ri=vicxi
4)leader收集 r_i ,计算 r = \sum_{i = 1}^{n}{r_i} ,得到签名(c,r)
2.2 多方认证过程。

V ′ = G r X c V' = G^rX^c V=GrXc
c = ? H ( V ′ ∣ ∣ S ) c =? H(V' || S) c=?H(VS)
如果上面第二个等式成立,则对消息S的签名认证成功。
证明:
V ′ = G r X c = G ∑ i = 1 n r i X c = G ∑ i = 1 n ( v i − c x i ) X c = G ∑ i = 1 n v i − ∑ i = 1 n c x i X c V' = G^rX^c = G^{\sum_{i = 1}^{n}{r_i}}X^c = G^{\sum_{i = 1}^{n}{(v_i - cx_i)}}X^c = G^{\sum_{i = 1}^{n}{v_i} - \sum_{i = 1}^{n}{cx_i}}X^c V=GrXc=Gi=1nriXc=Gi=1n(vicxi)Xc=Gi=1nvii=1ncxiXc
= G ∑ i = 1 n v i G ∑ i = 1 n c x i X c = \frac{G^{\sum_{i = 1}^{n}{v_i}}}{G^{ \sum_{i = 1}^{n}{cx_i}}}X^c =Gi=1ncxiGi=1nviXc
= ( G v 1 G v 2 , . . . , G v n ) ( G x 1 G x 2 , . . . , G x n ) c X c = \frac{(G^{v_1}G^{v_2},...,G^{v_n})}{(G^{x_1}G^{x_2},...,G^{x_n})^{c}} X^c =(Gx1Gx2,...,Gxn)c(Gv1Gv2,...,Gvn)Xc
= ∏ i = 1 n V i ( ∏ i = 1 n X i ) c X c = V X c X c = V = \frac{\prod_{i = 1}^{n}V_i}{(\prod_{i = 1}^{n}X_i)^c} X^c = \frac{V}{X^c}X^c = V =(i=1nXi)ci=1nViXc=XcVXc=V
证毕

总结:
单方签名和多方签名的区别在于,多方签名的时候将 V_i 和公钥 X_i 使用加法聚合成一个单一的V和X,聚合之后的操作跟单方签字一样。因此,最终将签名保存到区块链之后,所存储的数据大小跟单签名的是一样的。

reference
Syta, Ewa, et al. “Keeping authorities” honest or bust" with decentralized witness cosigning."2016 IEEE Symposium on Security and Privacy (SP). Ieee, 2016.
Ohta, Kazuo, and Tatsuaki Okamoto. "Multi-signature schemes secure against active insider attacks."IEICE Transactions on Fundamentals of Electronics, Communications and Computer Sciences82.1 (1999): 21-31.

你可能感兴趣的:(区块链,密码学)