「公钥加密」隐私加密系列|MuSig Schnorr签名方案

原创 浮生若梦  |  文章来源:币圈达人发布时间:2020-05-24 01:48  阅读 108 次 评论 0 条
众人帮 趣闲赚 牛帮
摘要:

介 绍
本文研究了利用密钥聚合的Schnorr多重签名方案(MuSig),该方案在普通公钥模型下具有可证明的安全性。(本文福利,文末有现金抽奖)
签名聚合涉及到在数学上将多个签名合并为一个签名,而无需证明密钥知识(KOSK)。这就是所谓的

介 绍

本文研究了利用密钥聚合的Schnorr多重签名方案(MuSig),该方案在普通公钥模型下具有可证明的安全性。(本文福利,文末有现金抽奖)

签名聚合涉及到在数学上将多个签名合并为一个签名,而无需证明密钥知识(KOSK)。这就是所谓的普通公钥模型,其中唯一的要求是每个潜在的签名者都有一个公钥。KOSK方案要求用户在向证书颁发机构注册公钥时证明知道(或拥有)密钥。这是一种防止恶意密钥攻击的方法。

多重签名是一种用于将多个参与者添加到加密货币交易中的技术形式。传统的多签名协议允许一组签名者在公共消息上产生联合的多签名。

Schnorr签名及其攻击向量

Schnorr签名产生较小的链上大小,支持更快的验证并具有更好的隐私性。它们本身允许通过聚合将多个签名组合为一个,并且允许更复杂的话费政策。

签名聚合也有其挑战。这包括流氓密钥攻击,即参与者使用专门构造的密钥来窃取资金。尽管通过涉及密钥签名本身的注册过程,对于简单的多签名来说,这很容易解决,但是跨事务的多个输入支持它需要简单的公钥安全性。

还有一个额外的攻击,称为Russel攻击,以Russel O'Connor的名字命名,他发现对于多方方案,一方可以声称拥有另一方的私钥,从而花费其他输出。

P. Wuille 解决了其中一些问题,并提供了完善Bellare-Neven(BN)方案的解决方案。他还讨论了针对BN方案的缩放器乘法实现的性能改进,以及它们如何在区块链上启用批验证。

多签(MuSig)

引入的多重签名协议允许一组签名者(分别拥有自己的私钥/公钥对)在消息m上产生单个签名σ。给定消息和所有签名者的公钥集,可以公开执行给定签名σ的验证。

将标准签名方案转换为多重签名方案的一个简单方法是,让每个签名者用其私钥为m生成一个独立的签名,然后将所有单独的签名连接起来。

从标准签名方案到多签名方案的转换需要是有用和实用的。因此新计算的多重签名方案必须产生签名,签名的大小与签名者的数量无关,并且类似于原始签名方案的签名。

传统的多重签名方案是签名和验证算法的结合,其中多个签名者(每个人都有自己的私钥/公钥)共同签署一条消息,从而产生一个组合签名。然后,任何知道消息和签名者公钥的人都可以验证这一点,其中需要使用KOSK进行可信设置。

MuSig是一个多重签名方案,它结合了:

1. 支持密钥聚合。

2. 普通公钥模型中的安全性。

MuSig有两个版本是可证明安全的,并且根据通信轮次的数量而有所不同:

1. 三轮MuSig,仅依赖于离散对数(DL)假设,椭圆曲线数字签名算法(ECDSA)也依赖于此。

2. 两轮MuSig,取而代之的是依靠稍微强一点的“离散离散对数(OMDL)”假设。

密钥聚合Key Aggregation

密钥聚合是指看起来像单密钥签名的多重签名,但是相对于仅是参与者的公共密钥的功能的聚合公共密钥。因此验证者不需要知道原始参与者的公钥。只需给它们一个聚合的密钥。在某些用例中,这会带来更好的隐私和性能。因此MuSig实际上是Schnorr签名的密钥聚合方案。

为了使传统方法更有效且不需要受信任的设置,多重签名方案必须提供子线性签名聚合以及以下属性:

1. 在普通的公钥模型中,必须证明它是安全的。

2. 它必须满足正常的Schnorr方程,由此可以将生成的签名写为公钥组合的函数。

3. 它必须允许要求签名者合作的交互式聚合签名(IAS)。

4. 它必须允许非交互式聚合签名(NAS)。任何人都可以进行汇总的地方。

5. 它必须允许每个签名者签署同一条消息。

6. 它必须允许每个签名者在自己的消息上签名。

这与正常的多签名方案不同,在正常的多签名方案中,一条消息由所有人签名。MuSig可能提供所有这些属性。

目前已经存在的多重签名方案为Schnorr签名提供密钥聚合。但是它们具有一些局限性,例如需要验证参与者实际上是否具有与其声称拥有的公共密钥相对应的私有密钥。普通公钥模型中的安全性意味着不存在任何限制。参与者需要的只是他们的公钥。

多重签名综述

最近多重签名最明显的用例是关于比特币,它可以作为n-of-n个多重签名脚本的更高效替代(其中花费的签名和可能的签名数量相等)和允许多种可能的密钥组合的其他策略。

密钥聚合方案还可以使每个输入的公共密钥数量减少为一个,因为用户可以将硬币发送到所有涉及的密钥的聚合中,而不是将它们全部包含在脚本中。这样可以减少链上占用的空间,加快验证速度并提高隐私性。

与其创建每个输入一个签名的限制,不如将一个签名用于整个交易。传统上,密钥聚合不能跨多个输入使用,因为公共密钥由输出提交,并且可以独立使用。可以在此处使用MuSig,密钥聚合由验证程序完成。

没有非交互式聚合方案,仅依靠DL假设是已知的,但是在多签名方案中每个参与者都对所有消息进行串联的多重签名方案中,交互式方案是微不足道的。文献中着重于Schnorr签名的密钥聚合,表明这并不总是一个理想的构造,并给出了一个性能更好的BN的IAS变体。

比特币m-of-n多重签名

什么是m-of-n交易?

当前比特币网络上的标准交易可被称为单签名交易,因为它们仅需要来自与比特币地址相关联的私钥的所有者的一个签名。但是比特币网络支持更为复杂的交易,这可能需要多人签名才能转移资金。这些通常称为n笔交易,其中m代表需要花费的签名数量,而n代表可能的签名数量。

m-of-n个多重签名的用例

当m=1且n>1时,它被认为是一个共享钱包,可用于不需要太多安全性的小型集团基金。这是最不安全的多重签名选项,因为它不是多重因素。任何一个失策的人都会危及整个组织。用例的例子包括周末或晚间活动的资金,或者某种游戏的共享钱包。除了方便使用之外,此设置的唯一好处是,除了一个备份/密码对之外,所有备份/密码对都可能丢失,所有资金都可以收回。

当m = n时,它被视为伙伴钱包,这带来了一些麻烦,因为不会丢失任何密钥。随着所需签名数量的增加,风险也会增加。可以将这种类型的多重签名视为硬多因素身份验证。

当m <0.5n时,它被视为好友帐户,可用于从企业集团资金中支出。共谋少数群体的后果必须大于可能的利益。与共享钱包相比,它不那么方便,但更安全。

当m> 0.5n时,称为共识帐户。经典的多签名钱包是三分之二,并且是共识帐户的特例。三种方案中的两种具有创建新比特币地址以及安全存储和支出的最佳特征。一位被损害的签字人不损害资金。单个密钥可能会丢失,但资金仍然可以收回。如果正确完成,则在钱包设置过程中创建异地备份。追回资金的方法不止一方知道。通过让一方比另一方控制更多的密钥,可以改变多签名钱包的力量平衡。如果一方控制多个密钥,则这些密钥不作为多个因素保留的风险更大。

当m = 0.5n时称为拆分帐户。这是一个有趣的用例,因为六分之三,其中一个人拥有三个密钥,而三个人拥有一个密钥。这样,一个人可以控制自己的钱,但是即使主钥匙持有人的所有钥匙都消失了,资金也仍然可以收回。随着n的增加,对次级方的信任程度可能会降低。一个好用例可能是家庭储蓄帐户,如果主要帐户持有人死亡,该帐户会自动成为继承帐户。

流氓攻击(Rogue Attacks)

在实现多签名方案时,流氓攻击是一个值得关注的问题。一个恶意的签名者的一个子集操纵作为诚实用户的公钥函数计算的公钥,允许他们容易地为公钥集生成伪造(尽管他们不知道相关的密钥)。

一般防止流氓密钥攻击的一种方法是强制用户在向认证机构注册公共密钥的过程中证明(或拥有)秘密密钥。证书颁发机构是一种称为KOSK假设的设置。基于配对的多重签名方案依赖于KOSK假设来维持安全性。

就目前而言,基于Schnorr签名方案提供了最实用的多签名方案之一,该方案证明是安全的,并且不包含任何关于密钥设置的假设。由于此方案的唯一要求是每个潜在的签名者都具有公共密钥,因此此设置称为“纯密钥模型”。

在KOSK模型中,支持密钥聚合的多重签名方案更容易实现。特别地提出了CoSi方案,该方案可以被看作是朴素的Schnorr多重签名方案,其中cosigner被组织成树形结构以快速生成签名。

交互式聚合签名

在某些情况下,允许每个参与者签署不同的消息而不是单个的公共消息可能会很有用。IAS是每个签名者都有自己的消息mi要签名,并且联合签名证明第i个签名者已经签名mi。这些方案被认为比多重签名方案更一般。然而,它们不如非交互聚合签名和顺序聚合签名灵活。

根据multisignatures-ccs,将任何多签名方案转换为IAS方案的一般方法是运行多签名协议的签名者使用IAS协议中涉及的所有公钥/消息对的元组作为消息。

对于BN的方案和Schnorr多重签名,这不会增加通信轮数,因为消息可以与共享Ri一起发送。

交互式聚合签名的应用

关于所有参与者都有能力验证交易的数字货币计划,这些交易包括输出(具有验证密钥和金额)和输入(指以前交易的输出)。每个输入都包含要用其引用输出的密钥验证的事务的修改版本的签名。一些输出可能需要花费多个签名。使用这种输出的事务被称为m-of-n多签名事务,当前的实现对应于通过连接单个签名来构建多签名方案的简单方法。此外

虽然多个多重签名方案可以提供对当前可用方法的改进,但有两个特性增加了可能的影响:如果仅需要n个可能签名中的m个有效签名来兑换事务,则可以强制实施阈值策略。(同样这是将多重签名方案转换为某种基本门限签名方案的最直接方法。)

1. 密钥聚合的可用性消除了验证者查看所有相关密钥的需求,从而提高了带宽,隐私和验证成本。

2. 普通公钥模型下的安全性允许跨事务的多个输入进行多个签名,其中签名者的选择不能提前提交。这大大增加了多重签名有益的情况的数量。

本地多签名(Multi-signature)的支持

一个改进是用一个恒定大小的多签名原语(如BN)代替实现n个或n个多签名的需要。虽然这在大小上有所改进,但仍然需要包含签名者的所有公钥。密钥聚合进一步改进了这一点,因为可以改用单个密钥谓词。该方法体积小,验证计算量小。谓词加密是一种加密范例,它使主密钥所有者可以对访问加密数据进行细粒度控制。由于参与者的密钥及其数量仍对签名者不公开,因此还可以提高隐私性。

当推广到m-of-n场景时,存在几个选项。一种是放弃密钥聚合(forego key aggregation),并且仍将所有潜在的签名者密钥包括在谓词中,而对于所选的密钥组合仍然仅生成单个签名。或者可以使用Merkle树,其中叶是允许的公钥组合(聚合形式)。在这种情况下,谓词将使用汇总的公共密钥,签名和证明作为输入。它的有效性将取决于签名对提供的密钥是否有效,以及证明该密钥实际上是Merkle树的叶子之一(由其根哈希标识)的证明。这种方法非常通用,因为它适用于密钥组合的任何子集,因此具有良好的隐私性,因为从证明中看不到确切的策略。

在上述情况下,在假设发送方获得了接收方私钥的知识/拥有证明的情况下,可以使用一些不针对流氓密钥攻击提供保护的密钥聚合方案。但是,这些方案很难证明是安全的,除非使用非常大的知识证明。由于这些知识/占有的证明不需要由验证者看到,它们由发送者的验证有效地证明。但是将它们传递给发件人并不方便,而且容易出错。使用在纯公开密钥模型中安全的方案可以避免这些问题。

另一种选择是使用一种算法,该算法的密钥生成需要可信的设置,例如 在KOSK模型中。尽管许多方案已被证明是安全的,但它们依赖于证书颁发机构通常不实施的机制。

交叉输入多签名(Cross-input Multi-signatures)

前面的部分解释了如何将每个输入的签名数减少到一个。但是可以更进一步,将其替换为每个事务的单个签名。这样做需要对验证语义进行根本性的更改,因为独立输入的有效性不再是独立的。因此输出不能再被建模为谓词,在这里密钥所有者可以访问加密的数据。相反,它们被建模为返回布尔值(只有两个可能值的数据类型)和一组零个或多个公钥的函数。

总体有效性要求所有返回的布尔值都为True,并且事务的多重签名为L,所有返回的键的并集。

关于比特币,这可以通过在脚本语言中提供签名检查操作码OP_CHECKSIG和相关操作码的替代方法来实现。他们总是返回True,而不是返回实际ECDSA验证的结果,而是将已进行验证的公钥添加到整个事务范围的多组密钥中。最后在验证所有输入之后,将对照该多集验证交易中存在的多重签名。如果交易花费了多个所有者的输入,则他们将需要协作以产生多重签名,或者选择仅使用原始操作码。以向后兼容的方式添加这些新的操作码是可能的。

防止恶意密钥攻击

在比特币中,考虑到交叉输入签名时,没有公开的签名者承诺,因为每个交易输入都可以独立花费需要不同参与者授权的输出。此功能不受限制,因为它将干扰诸如CoinJoin 之类的可移植性改进。由于缺乏认证,防范恶意密钥攻击的安全性非常重要。

如果假定交易使用了容易受到流氓攻击的单个多重签名,则攻击者可以使用公钥X1,...,Xn-t标识他们想要窃取的任意数量的输出,然后使用 恶意密钥攻击以确定Xn-t + 1,...,Xn,以便他们可以签名聚合密钥X̃。然后,他们将用与键Xn-t + 1,...,Xn相对应的谓词将少量自己的钱发送到输出。最后他们可以创建一个交易,通过为整个交易伪造多重签名,将所有受害者的硬币与他们刚刚创建的硬币一起花掉。

可以看出,在跨输入多个签名的情况下,通过在一组密钥上伪造签名(至少包含一个不受攻击者控制的密钥)的能力,可能会发生盗窃。根据普通的公钥模型,这被认为是攻击者的胜利。这与单输入多签名情况相反,在单输入多签名情况下,只有通过为现有输出中包含的准确(汇总)密钥伪造签名才能实现盗窃。结果不再可能依赖于签名者私有的知识/财产证明。

历史上的今天:

本文地址:https://www.u5881.com/7576.html
版权声明:本站推荐的部分活动具有时效性,老淘本人并不能保证当您看到本文时,该项活动是否仍在继续。

发表评论


表情