Schnorr签名由Claus Schnorr于2008年提出, 区块链协议公司Blockstream的密码学家Gregory Maxwell、Pieter Wuille等人,则在2018年提出了一种名为MuSig的Schnorr签名方案。
Schnorr签名
Schnorr签名使用点 和标量
来生成签名,
是椭圆曲线上的一随机点:
,签名第2部分为:
, 其中
为私钥,
为公钥,
为消息,采用下式验证签名的有效性:
批量验证
要验证网络上的区块,要保证区块中所有交易的签名是有效的。对于ECDSA签名,每个签名必须单独验证,通过使用Schnorr签名,可以将所有的签名相加,从而节省一些算力。对于1000个签名的区块而言,需要验证:
密钥聚合
对于比特币2-of-2多重签名,采用ECDSA需要两个单独的签名。使用Schnorr签名,可以使用一对私钥 , 并生成一个与共享公钥
对应的共享签名。要生成这个签名,需要分别选择随机数
和
, 生成随机点
,
, 将它们相加计算一个公共的Hash值
, 再分别计算签名:
, 得到
和
。将得到的签名相加,使用
作为共享公钥
的签名。 其它人无法确认它是否为聚合签名,因为它和普通的Schnorr签名一致。
这种构造存在三个问题:
(1)要对交易进行签名,需要进行多轮通信,计算公共的, 再进行签名。
(2) 恶意密钥攻击,若某一参与方被黑客攻击,并假装公钥为 , 则它可以用
私钥
控制共享资金。
(3)不能使用确定性 进行签名,对于2-2签名,若黑客获得一对有效的签名:
和
, 其中
是相同的, 但
和
, 可以计算出第二个私钥:
因此需要使用好的随机数生成器使用密钥聚合。
MuSig
MuSig解决了第2个问题,使得攻击者无法盗取密钥。聚合签名对应于聚合公钥,此时不将所有签名者公钥相加,而是乘以某个因子,聚合的公钥为: , 此处
为取决于所有公钥的公用数字,其非线性特性可以防止攻击者构造恶意的公钥。
为了生成签名,每个联合签名者选择一个随机数 , 并与其他人共享
, 再将这些随机点加在一起,得到
, 生成签名
,生成的聚合签名为:
, 验证方程为:
Merkle Mutisig
MuSig和密钥聚合都需要所有签名者签署一笔交易。但对于m-n门限签名,需要为所有的公钥的组合构造一个聚合公钥的Merkle树,并保留根。签名的时候需要提供公钥在Merkle树上的证据。
在有Merkle根,不局限于m-of-n多重签名,可以使用任何的公钥组制合Merkle树,使用更加灵活。













网友评论