比特币算法进化为Schnorr签名算法是进步吗?| 考仔星选

历史的车轮滚滚向前,技术的进步从未停歇,一次具有里程碑意义特币协议的开始了它的技术升级。其协议中的技术升级 Schnorr Signature (施诺尔签名)和 Taproot (树的主根)已集成到Bitcoin Core 0.21.0 版本中。比特币的未来似乎面临从未有过的光明,现在它有机会不仅通过其容量而且通过其功能超越所有其他区块链。当比特币 ECDSA 椭圆曲线签名算法时,多重签名交易验证过程非常繁琐,现在可以把一笔交易中的所有签名和公钥通通合并成单个签名和公钥,无法追溯并且简单快速会是怎样?其实在此之前,中本聪在设计比特币协议时,需要考虑到签名算法的签名长度、是否开源、是否有专利、是否经过足够长时间的安全验证、性能等多种条件。当时能满足上述这些条件的数字签名算法不止有 ECDSA,还有 Schnorr Signature 这个从各个方面都不亚于 ECDSA 的数字签名算法。但是由于在 2008 年之前处于专利保护的状态,所以可能是这个原因使得中本聪在设计比特币协议时并未使用该签名算法,最终选择了椭圆曲线数字签名算法(ECDSA),还在其他专家的建议下选择了一条特殊的椭圆曲线 secp256k1。时隔10年,2018 年 7 月,比特币开发者 Pieter Wuille 撰写了 bip-schnorr提出了将 bitcoin 的签名算法更改为 schnorr 方案。Schnorr 与 ECDSA 虽然同为使用 secp236k1 曲线的椭圆曲线加密算法,但由于Schnorr Signature 在密码学特性上的优势,可以在几乎同等安全的基础上,更方便的构建多签名交易。Schnorr 使用在比特币上,相比ECDSA会有一些额外的显著优势:更安全:在随机预言模型中很容易证明 Schnorr 签名的安全性,而 ECDSA 不存在这样的证明。无延展性困扰:ECDSA签名是可延展性的,第三方无需知道私钥,可以直接修改既有签名,依然能够保持该签名对于此交易是有效的。比特币一直存在延展性攻击,直到SegWit激活后才修复,前提是使用segwit交易,而不是传统交易。BIP62 和 BIP66 对此有详细描述。线性:Schnorr签名算法是线性的!以这一特性作为基础,可以构建更高效和隐私性更强的区块链系统。使用 Schnorr 签名的各方可以生成对其各自密钥的签名聚合。例如,N个公钥进行签名,采用ECDSA的话,则有N个签名,验证同样需要做N次。若使用Schnorr,由于线性特性,则可以进行签名叠加,仅保留最终的叠加签名。例如同一个交易无论输入数量多少,其均可叠加为一个签名,一次验证即可。Schnorr签名算法几乎在各个层面均优于比特币现有的签名算法ECDSA:性能,安全,体积,扩展性等方面等,并且Schnorr Sig可以与ECDSA使用同一个椭圆曲线:secp256k1 curve,升级起来的改动非常小。当然在比特币协议中除了签名算法之外,还设计了Taproot 脚本语言定义如何使用比特币。比特币多签类地址可以不用暴露出自己的「多签」身份,也可以支持数量众多的多签场景(链上交易只需要一个聚合的公钥和一个签名),降低很多的交易字节数,特别是对于需要高频操作的地址而言,降低链上的交易费用,可以节省不少的成本。下面是一些比较常见的问答:Q&AQ: Schnorr签名是否可以用在m of n多重签名上?A: 当然可以。多重签名只是m of n的签名数量的模式。与签名算法无关。Q: Schnorr的组签名特性是否可以做或模拟出m of n式的签名?A: 无法做到。组内有N把公钥,则必须对应有N个签名,缺一不可。每个人在生成签名的时候,在哈希函数里都代入的都是组公钥P。Q: 签名机制的安全性如何衡量?A: 主要取决于两个:1. 签名算法本身 2. 椭圆曲线。目前,Schnorr与ECDSA都用的是曲线secp256k1,这个层面一样。至于签名算法本身安全性,Schnorr目前有安全证明,安全优于ECDSA。BCH对Schnorr签名算法的试行早在2019年5月16日BCH已经开始进行硬分叉升级。升级的主要内容是Schnorr签名算法和隔离见证复原,Schnorr签名升级中最受期待的功能,而隔离见证复原则是一项修复性技术,用来找回被错发到隔离见证地址的BCH。开发人员Mark Lundeberg用户不必生成新地址就可以开始使用Schnorr签名。本次升级带给BCH的优势如下:1、提高签名数据的有效性:由于签名是64字节的数据,与通常的70字节相比,交易可以减少4%的字节,该功能基本上提高了每笔比特币现金交易所需的签名数据的有效性(通过Schnorr签名将使区块链存储和带宽减少至少25%,使BCH网络更快,更加高效)。并且升级后,Schnorr签名给BCH带来隐藏普通支付渠道的能力。2、隐私性的提升:在升级之前很多用户就会故意使用多个签名来发送交易来提高隐私,而Schnorr签名会使所有用户的签名看起来和任何其他签名一样,这种结构导致了交易隐私性的大幅提升。Schnorr提供的属性以及BCH开发人员和基础设施提供商(如钱包)添加的一些延展程序将进一步增强隐私和可扩展性。3、对抗垃圾交易攻击:在过去曾出现一种垃圾交易攻击,攻击者希望通过尽可能多的交易空间来使比特币拥堵,他们的手段之一就是通过频繁地从多个来源发送交易使这个交易中包括数十个签名,这些签名占据了很多的空间。这是ECDSA签名留下的隐患。Schnorr可以规避这类的垃圾交易攻击。如果每一笔交易只有一个签名,那么区块就能容纳更多交易,垃圾交易制造者要想制造攻击就必须发送更多交易,与更多人进行竞争,因此攻击成本就会相对更高。签名所占空间通常是一笔交易最大的一部分,所以攻击者不具优势。当然我们不能只看到好的一面,全则必缺,极则必反。尤其是量子计算机的发展促使一些有远见的人尽快找到应对方法,为了应对量子计算机对一些算法的攻击,在2017年,NIST就开始了后量子密码学标准化进程,其中由瑞士ABCMint数学算法基金会推动的抗量子签名方案,后量子加密基金会支持的抗量子算法之一,最短签名长度的签名抗量子签名方案——彩虹签名Rainbow最被看好。2017年8月,Jin Liu和数学家Prof. Jintai Ding筹建ABCMint,并注册在瑞士苏黎世附近的加密谷。其数字货币ABC底层签名便是彩虹签名Rainbow,他们愿景是在全球支持抗量子计算机破解算法的研究和应用,研究包括在全球支持数学家在算法方面的发现、破解、完善等,应用包括将合适的算法应用在主流数字加密货币方面。他们认为比特币从ECDSA改为Schnorr签名的提案BIP340,采用Schnorr签名,是比特币的重大退步。不看好由计算机安全专家提出的算法选择和改进,我们更偏重由数学家提出的算法选择和改进,Schnorr签名的问题很大,应该用在Litecoin之类先长时间试车。BTC应等BCH,或其他链再用几年Schnorr签名再看看。Schnorr签名最主要的优点是“多签时签名长度最短”,但缺点是“多签时,最后一个人容易欺骗”。在密码学看来: 采用Schnorr签名是一个”胆大不审慎”的做法,背离了”长期安全“的第一要义。从密码学角度看待Schnorr签名主要是为了多签名,而多签名适合的场景应该是:既中心化又极其重要的场景,其极其重要的场景类似于核弹发射的十几道Verifiable procedure。或夏延山核武基地之类的大门。而不应该是去中心化场景,或比特币的发送这类场景。简单说:去中心化的,本身和多签名是背离的。下面简单科普一下几种算法:1 椭圆曲线数字签名算法(ECDSA)椭圆曲线数字签名算法(ECDSA,Elliptic Curve Digital Signature Algorithm)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。(椭圆曲线密码(ECC)由Neal Koblitz和Victor Miller于1985年发明),ECDSA首先由Scott和Vanstone在1992年为了响应NIST对数字签名标准(DSS)的要求而提出。比特币目前使用的是 ECDSA 椭圆曲线数字签名算法,要对消息 m 进行签名,我们需对其进行哈希操作,并将此哈希视为一个数字:z = hash(m)。我们还需要一个随机或随机查找的数字 k。我们不喜欢信任随机数生成器(存在太多的故障,很多漏洞与糟糕的 RGN 有关),因此,我们通常会使用RFC6979,并根据我们的秘密和我们要签名的消息,计算确定性 K 值。使用私钥 pk,我们可以为包含两个数字的消息 m 生成签名:r (随机点 R 的 x 坐标 = k×G) 和 s = (z+r⋅pk)/k。然后,使用我们的公钥 P = pk×G,任何人都可通过检查点 (z/s)×G+(r/s)×P 的 x 坐标等于 r,来验证我们的签名。签名验证包括反转(1/s)和两点乘法,这些操作的计算量非常大。在比特币中,每个节点都必须验证所有交易。这意味着当你广播一笔交易时,数千台计算机将不得不验证你的签名。而简化验证过程将是非常有益的,即使签名过程会更加困难。第二,每个节点必须分别验证每个签名。如果是 m-of-n 多重签名交易节点,则可能需多次验证相同的签名。例如,具有 7-of-11 多重签名输入的交易将包含 7 个签名,并且需要对网络中的每个节点进行 7-11 次的签名验证。同样,这样的交易会占用大量的空间,你必须为此支付大量的费用。Schnorr 签名Schnorr签名算法是由德国数学家、密码学家Claus Schnorr提出。并于1990年申请了专利,U.S. Patent 4,995,082,该专利与2008年2月失效。目前该算法可以自由使用。Schnorr 签名的生成则略有不同,我们使用了一个点 R 和一个标量 s 来代替两个标量(r,s)。与 ECDSA 相似的是,R 是椭圆曲线(R=K×G)上的一个随机点。签名的第二部分计算略有不同 :s = k + hash(P,R,m) ⋅ pk. 这里的 pk 是你的私钥,而 P = pk×G 则是你的公钥,m 是消息。然后可通过检查 s×G = R + hash(P,R,m)×P 来验证这个签名。这个方程是线性的,所以方程可互相加减,并且仍然有效,这就给我们带来了几大关于 Schnorr 签名的好处。3 Schnorr 签名的批量验证要验证比特币区块链中的区块,我们需确保区块中的所有签名都有效。对于 ECDSA 签名算法,每个签名都必须单独验证。也就是说,如果区块中有 1000 个签名,我们就需要计算 1000 次倒置和 2000 次点乘运算,总共约 3000 次繁重的计算任务。而通过使用 Schnorr 签名,我们可以将所有签名验证方程相加,从而节省一些计算能力。对于有 1000 个签名的区块而言,我们需验证:(s1+s2+…+s1000)×G=(R1+…+R1000)+(hash(P1,R1,m1)×P1+hash(P2,R2,m2)×P2+…+hash(P1000,R1000,m1000)×P1000)这里我们有一堆加法(在计算能力上几乎是免费的)以及 1001 次点乘法。我们需要为每个签名计算大约一次繁重的计算。4 Schnorr 签名的密钥聚合我们希望让自己的比特币保持安全,所以我们可能希望使用至少 2 个不同的私钥来控制我们的比特币。比如说一个放在笔记本电脑或手机,另一个则放在硬件钱包 / 冷钱包。因此,当其中一个受到威胁时,我们仍然可以控制我们的比特币。目前,它是通过 2-of-2 多重签名脚本来实现的,这需要在交易中包含两个单独的签名。而使用 schnorr 签名,我们可以使用一对私钥(pk1,pk2),并生成一个与共享公钥 P=P1+P2=pk1×G+pk2×G 对应的共享签名。要生成这个签名,我们需要在每个设备上选择一个随机数(k1,k2),生成一个随机点 Ri=ki×G,将它们相加以计算一个公共哈希 (P,R1+R2,m),然后从每个设备 (si = ki + hash(P,R,m) ⋅ pki) 中获取 s1 和 s2。然后我们可以将这些签名相加,并使用一对 (R, s) = (R1+R2, s1+s2) 作为我们对共享公钥 p 的签名。其他所有人都无法说出它是否是聚合签名,它看起来与普通 schnorr 签名完全相同。这种构造有 3 个问题,第一,从用户界面的角度来看,要进行交易,我们需要进行几轮通信,计算公共 R,然后-签名。有了两个私钥,只需一次访问冷钱包就可以完成:我们在在线钱包上准备一个未签名的交易,选择 k1,将 R1=K1×G 与未签名的交易一起记下。然后我们将这些数据传送到冷钱包并签名。因为我们已经有了 R1,所以我们可以一次性在冷钱包上签署交易。从冷钱包中,我们得到了 R2 和 s2,并将其传输回在线钱包。在线钱包使用之前选择的 (k1, R1) 签署交易,结合签名并广播签名交易。这与我们现在的情况非常相似,但一旦添加第三个私钥,一切就会变得更加复杂。比方说,你有一笔财富,它是由 10 个私钥控制的,它们存储在世界各地不同的安全位置,然后,你需要进行一笔交易。目前,你只需要浏览所有这些位置一次,但如果你使用的是密钥聚合,则需要执行两次,以组装所有 RI,然后签名。在这种情况下,最好在不进行聚合的情况下保留单独的签名,然后我们就需要 3 轮通信:选择一个随机数 ki 和相应的 Ri=ki×G,然后只告诉每个人其哈希 ti=hash(Ri),这样每个人都可以确定在学习了其他随机数之后你不会改变主意;把所有的数字汇总起来,计算出共同的 R;签名;第二个问题是已知的恶意密钥攻击。无论是在论文还是这篇文章中,都有很好的描述,所以我不想详细讨论。其想法是,如果你的某个设备被黑客攻击(比如说,你的在线钱包),并假装其公钥是 (p1-p2),那么它可以用它的私钥 pk1 控制共享资金。一个简单的解决方案是,在设置设备时,需要使用相应的私钥对公钥进行签名。还有第三个重要问题。不能使用确定性 k 进行签名。有一种简单的攻击方式,如果你使用确定性 K,它允许黑客获得我们的私钥。攻击看起来会是这样的:有人入侵了我们的笔记本电脑,并完全控制了两个私钥中的一个(例如 pk1)。我们可能觉得是安全的,因为我们的比特币需要来自 pk1 和 pk2 的聚合签名。因此,我们尝试像往常一样进行交易,准备一个未签名的交易和 R1 值,将它们转移到我们的硬件钱包并在那里签名。然后返回 (r2,s2) 和……我们的在线钱包发生了一些事情,它无法签名和广播。我们再次尝试,但我们被黑的电脑这次使用了另一个随机值 R1'。我们再次与我们的硬件钱包签署相同的交易,并将值 (r2,s2) 带回我们被黑的电脑。然后,糟糕的事就发生了,我们的比特币就丢失了。在这个攻击中,黑客为同一笔交易获得一对有效的签名:(R1, s1, R2, s2) 和 (R1', s1', R2, s2'),这里 R2 是相同的,但 R = R1+R2 和 R'=R1'+R2 是不同的,这意味着黑客可以计算我们的第二个私钥:s2-s2'=(hash(P,R1+R2,m)-hash(P,R1'+R2,m))⋅pk2 and pk2=(s2-s2')/(hash(P,R1+R2,m)-hash(P,R1'+R2,m))。我发现这是密钥聚合最不方便的特性:我们需要在任何地方使用好的随机数生成器来使用密钥聚合。# Rainbow #Rainbow是一种多变量签名方案,它的分层结构以不平衡石油-醋栗(UOV)签名方案为基础。Rainbow层所施加的额外结构使该方案面临更多的密码分析技术,但提高了该方案的效率。Rainbow提供了快速的签名和验证以及非常短的签名,但具有非常大的公钥。选择Rainbow增加了入围签名方案的多样性;但是,由于密钥尺寸非常大,Rainbow不适合作为通用签名算法来替代目前出现在FIPS 186-4中的算法。特别是,大公钥使得证书链非常大。然而,有些应用并不需要经常发送密钥。对于这样的应用,Rainbow提供了小而快的签名。

原创文章,作者:Chain258,如若转载,请注明出处:http://www.chain258.com/?p=94392