RLN on KZG Version A Vulnerabilities
问题描述
在 RLN on KZG协议中,证明者需要提交一个多项式 的承诺以及公钥 。我们发现了一个漏洞,攻击者可以在不知道私钥的情况下伪造公钥。为了解决这个问题,我们提出了一个解决方案,使用 Schnorr 签名来验证公钥,可以有效地防止这种攻击。
漏洞详细信息
在原始的 RLN 协议中,证明者提交多项式承诺 、公钥 和开放证明 。验证者检查用户的公钥是否在提交的多项式上,通过验证开放证明 :
然而,攻击者可以在不知道私钥的情况下伪造公钥。攻击者可以选择一个随机数 ,然后修改公钥和开放证明,使它们满足以下等式:
- 将等式左边展开:
- 使用Pairing的性质 将等式做如下变换:
- 合并指数:
- 已知, 替换到等式中:
- 消除 和 :
通过这种方式,攻击者可以使验证者相信他们提交了一个有效的公钥,但实际上这个公钥并不与他们的私钥相匹配。
解决方案
我们提出了一个解决方案,使用 Schnorr 签名来证明证明者确实拥有与公钥匹配的私钥。这是有效的,因为攻击者无法获取私钥,因为他们没有办法计算 ,因为 是从 SRS 中获得的,而没有人知道 的值。这意味着攻击者不能制作满足配对检查的 ,除非他们知道私钥。
当证明者提交其公钥 时,他们还需要提交一个 Schnorr 签名作为知识证明,证明他们知道公钥对应的私钥。验证者可以通过验证该 Schnorr 签名来确保证明者确实知道与其公钥对应的私钥。这个步骤在 RLN 协议的设置步骤中进行,可以有效地防止攻击者提交伪造的公钥。
Schnorr签名是一种数字签名方案。它们具有可以证明安全性的优点,假设离散对数问题是难解的,并且相对简单且高效。
Schnorr签名算法涉及以下步骤:
-
密钥生成:
- 从小于预定质数的整数集中随机选择私钥。
- 然后计算相应的公钥,,其中是一个循环群的生成器,的阶为,是模数。
-
签名:
- 从小于的整数集中随机选择。
- 计算。
- 计算,其中是一个密码学哈希函数,是信息,表示连接。
- 计算。
- 签名是对。
-
验证:
在RLN的上下文中,可以使用Schnorr签名来证明证明者知道与公钥对应的私钥。证明者使用他们的私钥签名一条信息(可以是随机挑战或已知值),验证者检查Schnorr签名。如果签名验证,这意味着证明者知道与对应的私钥,所以公钥没有被伪造。
在RLN中,使用KZG承诺和Schnorr签名,需要知道并面临离散对数(DL)问题的步骤包括:
-
承诺:
- 用户使用参考字符串计算KZG多项式承诺。这里,用户需要知道来创建承诺。
-
开放证明:
- 为了发送消息,用户共享,其中是消息值的哈希,是开放证明。用户需要知道来创建开放证明。
离散对数(DL)问题在Schnorr签名和RLN协议的安全性中起着关键作用。假设在给定的情况下,计算离散对数在计算上是不可行的。在RLN的情况下,未知的离散对数是,而是共享参考字符串的一部分。
当攻击者尝试通过使用随机来伪造公钥时,他将需要知道的值来操作等式。然而,由于DL问题的困难性,攻击者无法从参考字符串计算,因此在不知道相应私钥的情况下无法伪造公钥。
结论
在 RLN 协议中,存在一个漏洞,攻击者可以在不知道私钥的情况下伪造公钥。为了解决这个问题,我们提出了一个解决方案,使用 Schnorr 签名来验证公钥。这个解决方案有效地防止了攻击者提交伪造的公钥。然而,需要注意的是,这个解决方案需要修改 RLN 协议的设置步骤,使得证明者需要提交更多的信息,并且验证者需要进行更多的验证步骤。我们希望这个解决方案可以帮助 RLN 协议的开发者修复这个漏洞,进一步提高 RLN 协议的安全性。