- 可证明安全。Schnorr 签名安全性的数学证明仅依赖于解决离散对数问题 (DLP) 的难度,尤其是对比特币所用椭圆曲线 (EC)上的离散对数问题;以及使用哈希函数(如比特币中使用的 SHA256 函数)的能力以产生不可预测的值,称为随机预言模型(ROM)。其他签名算法要么具有额外的依赖,要么需要更大的公钥或签名才能实现与 ECC-Schnorr 同等的安全性(仅当威胁被定义为经典计算机时;其他算法可能会针对量子计算机提供更有效的安全性)。
- 线性性。Schnorr 签名具有数学家称为线性的性质,适用于具有两个特定性质的函数。第一个性质是将两个或多个变量相加,对该加总运行函数将产生与独立对每个变量运行函数然后将结果相加相同的值,如;这种性质称为加性。第二个性质是,将变量乘以一个量然后在该乘积上运行函数,将产生与在变量上运行函数然后乘以同一个量相同的值,如;该性质称为一次齐次性。
- 在密码学操作中,某些函数可能是私有的(例如涉及私钥或秘密随机数的函数),因此无论在函数内部还是外部执行操作都能够得到相同结果的性质,使得多方可以在无需分享他们的秘密的同时轻松地协调合作。我们将在“基于 Schnorr 的无脚本式多签名”和“基于 Schnorr 的无脚本式门限签名”中看到 Schnorr 签名中线性性的一些具体好处。
- 批量验证。当以某种方式(比如比特币中的方式)使用时,Schnorr 线性的一个结果是,相对容易做到同时验证多个 Schnorr 签名,且所需时间比独立验证每个签名所需的时间要短。批量验证的签名越多,速度提升就越大。对于一个区块中的典型签名数量,批量验证它们的时间大约是独立验证每个签名所需时间的一半。
- Alice 选择另一个大随机数 (), 我们称之为私有随机数。她再次将其作为标量使用,将其乘以 得到 , 称之为公共随机数。向Bob发送公共随机数。
- Bob 选择他自己的一个大随机数 , 称之为挑战标量。叫 “挑战” 是因为它用于挑战 Alice 来证明她知道她之前给 Bob 的公钥 的私钥 ; 叫“标量”是因为它稍后将用于乘以一个椭圆曲线点。
- Alice 现在有了一些数(标量) 、 和 。她使用公式 将它们组合在一起生成最终标量 。把 发给Bob。
- Bob 现在知道标量 和 , 但不知道 或 。然而, Bob 确实知道 和 , 并且他可以自己计算 和 。这意味着他可以去检查 Alice 执行操作的一个缩放后版本的相等性: 。如果相等, 那么Bob就可以确信Alice在生成 时知道 。
- Alice 选择私有随机数 并生成公共随机数 。她给 Bob发送 35。
- Bob 选择 并将其发给 Alice。
- Alice 生成 。她给 Bob 发送40 。
- Bob 导出 和 。然后他验证 。注意, 这里与 Alice 执行的操作相同, 但所有值都已按比例放大了5倍(的值)。
- 随机数 ()。在步骤 1 中, Alice 选择一个 Bob 不知道也无法猜测的数字, 并给了他该数字的缩放形式 。此时, Bob 也已经拥有了她的公钥 ( , 这是她私钥 的缩放形式。这意味着当 Bob 计算最终方程 时, Bob 不知道两个独立的变量 和 。可以使用简单代数来求解包含一个未知变量的方程,但不能求解包含两个独立未知变量的方程, 因此 Alice 的随机数的存在可以阻止 Bob 导出她的私钥。值得注意的是, 这种保护依赖于随机数以任何方式都不可猜测。如果Alice的随机数有任何可预测的地方, Bob就可能利用它来计算出Alice的私钥。
- 挑战标量()。Bob等待接收Alice的公共随机数, 然后继续执行步骤 2 , 给Alice一个她之前不知道且无法猜到的数 (挑战标量) 。非常关键的是, Bob要仅在Alice承诺公开随机数后才给她挑战标量。想象一下一个不知道 的人想冒充 Alice, 而 Bob 在收到承诺公共随机数 之前就不小心给了这个人挑战标量 , 会发生什么。冒充者就可以更改 Bob 将用于验证的等式 两边的参数; 具体来说, 可以改变 和 。考虑该表达式的简化形式: 。如果你可以同时更改 和 , 那你就可以用 消掉 (Kurt Pan注:y=x-a)。你为 选择的任何值现在都将满足方程。对于实际的方程, 冒充者只需选择一个随机数为 , 生成 , 然后使用椭圆曲线减法来选择等于 的 。把计算出的 给Bob, 随后给Bob随机的 , Bob会认为这是有效的, 因为 。这解释了为什么协议中的操作顺序至关重要: Bob 必须只在 Alice 承诺了她的公共随机数之后再向 Alice 提供挑战标量。
- Alice 选择一个大的私有随机数 并导出公共随机数 。
- Alice选择她的消息 (例如,交易数据)并生成挑战标量 。
- Alice 生成标量 。 和 这两个值是她的签名。她将此签名提供给每个想要验证该签名的人; 她还需要确保每个人都能收到她的消息。在比特币中, 这是通过将她的签名包含在她的支出交易的见证结构中, 然后将该交易转发到全节点来完成的。
- 验证者(例如全节点)使用 导出 , 然后验证 。如果等式有效, 则 Alice 证明了她知道自己的私钥 (无需泄露之) 且承诺了消息 (包含交易数据)。
警告:我们将要描述的简化协议并不安全,原因将很快解释。在描述被认为是安全的相关协议之前,我们仅使用它来展示 Schnorr 多签名的机制。Alice 和 Bob 需要导出 的公钥, 即 。由于可以使用椭圆曲线运算将两个椭圆曲线点相加, 因此首先 Alice 导出 , Bob导出 。然后他们将其加在一起以创建 。点 就是他们的聚合公钥。为了创建签名, 他们开始运行简单的多签名协议如下:
- 他们各自选择一个大私有随机数,Alice 选择, Bob 选择。他们还各自导出相应的公共随机数 和 。 共同生成一个聚合公共随机数 。
- 他们就要签名的消息 (比如一个交易) 达成一致, 各自生成挑战标量的副本: 。
- Alice 生成标量 。 Bob 生成标量 。他们将标量相加得到 。签名是两个值 和 。
- 验证者使用常规的方程检查他们的公钥和签名: 。
- MuSig:该协议也称为 MuSig1,在签名过程中需要三轮通信,与我们刚才描述的过程类似。 MuSig1 的最大优点是它的简单性。
- MuSig2:仅需要两轮通信,有时可以允许其中一轮与密钥交换相结合。这可以显著加快某些协议的签名速度,例如计划在闪电网络中使用的无脚本式多签名。 MuSig2 在 BIP327(截至撰写本文时唯一具有 BIP 的无脚本式多签名协议)中指定。
- MuSig-DN: DN 代表确定性随机数,它消除了称为重复会话攻击的问题。它不能与密钥交换结合使用,并且实现起来比 MuSig 或 MuSig2 复杂得多。
- 无可问责性。由于Alice和Bob重构了Carol的部分私钥,因此由包括Carol的过程产生的无脚本式多签名与不包括Carol的过程产生的无脚本式多签名之间不会有根本区别。即使Alice、Bob或Carol声称他们没有签名,也没有可证明的方法可以证明他们没有帮助生成签名。如果了解群组中的哪些成员进行了签名是很重要的,你将需要使用脚本。
- 操纵攻击。想象一下Bob告诉Alice说Carol联系不上了,他们共同重构出Carol的部分私钥。然后Bob告诉Carol说Alice联系不上了,他们一起重构出Alice的部分私钥。这时Bob就拥有了自己的部分私钥以及Alice和Carol的部分私钥,他自己就可以花费资金了而无需其他人的参与。如果所有参与者都同意仅使用一种参与者能看到其他所有消息的方案来进行通信(例如,如果 Bob 告诉 Alice说Carol联系不上了 ,Carol 就能够在Alice和Bob开始协作之前看到该消息),则可以解决此攻击。在撰写本文时,其他的解决方案,可能更有鲁棒性的解决方案,正在研究之中。