Schnorr签名
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树,使用更加灵活。