引言
备受瞩目的技术升级 Taproot 软分叉将于最近激活,激活高度为 709632,距今已不足 500 个区块。此次升级包括三个改进提案,分别是 BIP - 340、BIP - 341 和 BIP - 342。其中,BIP - 340 引入了 Schnorr 签名,BIP - 342 结合先前的技术,制定了隔离见证 V1 版的花费规则,而 BIP - 342 则对前面脚本更新后的验证方式做了指导。今天,我们就一起来了解下 BIP - 340 中提到的 Schnorr 签名。
Schnorr 签名
Schnorr 签名是由德国著名密码学家 Claus Schnorr 在上世纪八十年代发明的一种数字签名算法。该算法一直受专利保护,直到 2008 年才到期。和其它数字签名算法一样,Schnorr 算法也包括三个步骤:
- 密钥生成。该步骤的输入是一个安全参数,比如签名长度。它的输出是一个公私钥对,其中私钥用来签名,公钥用来验证签名;
- 签名。该步骤的输入是消息和私钥,输出是用该私钥对该消息的签名结果;
- 验签。该步骤的输入是消息和公钥,输出是一个比特,用来指示该签名是否通过验证。
*在上面的步骤描述中,我们省略了公开参数的描述。
Schnorr 签名算法也是定义在群上:
假定我们拥有一个素数阶 的群 ,它的生成元是 ,并且该群上离散对数问题是困难的。另外,假定存在一个密码学哈希函数 ,任意比特串经过该哈希函数作用后,输出的哈希摘要在 中。
这里需要指出的是,在 BIP - 340 的实现中,Schnorr 算法的使用方式要比我们下面描述的复杂,但核心就是基于下面这些步骤:
用户在使用 Schnorr 签名前
用户从一个特定的区间 () 中均匀随机选取 作为自己的签名私钥,然后根据公式 生成对应的验证公钥 。
用户对任意消息 进行签名
首先从特定区间选择一个随机数 ,然后计算 。接着将 和待签名消息 进行串联,并计算其哈希值,即计算 ,最后计算 。计算完成后,用户输出 () 作为对消息 的签名结果。
验证者收到消息 和签名值 () 后
将对该签名进行验证。他首先计算 。在得到 后,接着计算 。验证者验证 是否和 相等,如果相等,则认为该签名有效,反之则认为该签名无效。
正确性与安全性
可以看到 Schnorr 签名算法非常简单高效。Schorr 签名算法是将密码学中著名的 Fiat-Shamir 转换应用到 Schnorr 身份鉴别协议转换而来。算法的正确性显而易见,它的安全性也在相应的安全模型下得到了证明。
同时,就像 BIP - 340 中指出的一样,Schnorr 签名不存在延展性的问题。
我们在前面的技术视点中讲过,ECDSA 具有延展性,即可以从一个 ECDSA 签名中快速推出另外一个对相同消息的有效签名结果。为了防止延展性,一般区块链系统都对 ECDSA 签名结果进行了限定。而采用 Schnorr 签名不存在这样的隐患。
另外,我们前面的技术视点也对 ECDSA 签名时随机数重用的问题进行了分析,得出了同一个签名者使用 ECDSA 签名算法对不同消息进行签名时,重用随机数将泄漏用户私钥。在 Schnorr 签名中,我们可以看到,重用随机数的安全威胁依然存在。假定 () 和 () 是两个采用相同随机数 的签名,那么有:
从该式中很容易推导出用户私钥 。因此,在使用 Schnorr 签名时,也必须避免随机数重用。
结语
Schnorr 签名算法的引进给区块链系统带来了更多优秀的特性,比如 BIP - 340 中提到的更具隐私性的多签方案等。
我们也将在以后的技术视点中对 Schnorr 签名算法在区块链系统中的应用作进一步了解