标签:maxwell document || root 第三方 multi nat 拼接 tab
来源 https://panzhibiao.com/2019/02/28/schnorr-sigature/
https://github.com/bitcoin/bitcoin/
https://en.bitcoin.it/wiki/Secp256k1
https://en.bitcoin.it/wiki/Schnorr
Schnorr签名算法是由德国数学家、密码学家Claus Schnorr提出。并于1990年申请了专利,U.S. Patent 4,995,082,该专利与2008年2月失效。目前该算法可以自由使用。
Schnorr签名算法几乎在各个层面均优于比特币现有的签名算法ECDSA:性能,安全,体积,扩展性等方面。
Schnorr Sig可以与ECDSA使用同一个椭圆曲线:secp256k1 curve,升级起来的改动非常小。
我们定义几个变量:
P = xG
,P为x对应的公钥。H(m || R || P)
可理解为:将m, R, P三个字段拼接在一起然后再做哈希运算。签名者已知的是:G-椭圆曲线, H()-哈希函数,m-待签名消息, x-私钥。
k
, 令 R = kG
s = k + H(m || R || P)*x
那么,公钥P对消息m的签名就是:(R, s)
,这一对值即为Schnorr签名。
验证者已知的是:G-椭圆曲线, H()-哈希函数,m-待签名消息, P-公钥,(R, s)-Schnorr签名。验证如下等式:
sG = R + H(m || R || P)P
若等式成立,则可证明签名合法。
我们推演一下,此过程包含了一个极其重要的理论:椭圆曲线无法进行除法运算。
s = k + H(m || R || P)*x
,等式两边都乘以椭圆曲线G,则有:sG = kG + H(m || R || P)*x*G
,又因R = kG, P = xG
,则有:sG = R + H(m || R || P)P
,椭圆曲线无法进行除法运算,所以第3步的等式,无法向前反推出第1步,就不会暴露k值以及x私钥。同时,也完成了等式验证。一组公钥,N把,签名后得到N个签名。这个N个签名是可以相加的,最终得到一个签名。这个签名的验证通过,则代表N把公钥的签名全部验证通过。
有:
则有:
R = R1 + R2, s = s1 + s2
。推演过程:
1
|
1. 令 R = R1 + R2, s = s1 + s2
|
组公钥(Group Key),是N把公钥进行相加后的值,又称聚合公钥(Aggregation Key)。需要指出的是,参与方需要先相互交换公钥和R值,然后再进行各自的签名。
若使用在比特币上,相比ECDSA会有一些额外的显著优势:
Q: Schnorr签名是否可以用在m of n多重签名上?
A: 当然可以。多重签名只是m of n的签名数量的模式。与签名算法无关。
Q: Schnorr的组签名特性是否可以做或模拟出m of n式的签名?
A: 无法做到。组内有N把公钥,则必须对应有N个签名,缺一不可。每个人在生成签名的时候,在哈希函数里都代入的都是组公钥P。
Q: 签名机制的安全性如何衡量?
A: 主要取决于两个:1. 签名算法本身 2. 椭圆曲线。目前,Schnorr与ECDSA都用的是曲线secp256k1,这个层面一样。至于签名算法本身安全性,Schnorr目前有安全证明,安全优于ECDSA。
参考:
Schnorr signature,https://en.wikipedia.org/wiki/Schnorr_signature
BIP-Schnorr,Pieter Wuille,https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki
==================== End
标签:maxwell document || root 第三方 multi nat 拼接 tab
原文地址:https://www.cnblogs.com/lsgxeva/p/12021636.html