本文揭示了Girault知识证明中的一个名为“冰冻之心”的漏洞,该漏洞源于Fiat-Shamir转换的不安全实现,允许恶意用户伪造随机声明的证明。
在本系列的第一部分中,我们披露了破坏零知识证明系统多个实现健全性的严重漏洞。这类漏洞,我们称之为 Frozen Heart(冰冻之心),是由 Fiat-Shamir 转换的不安全实现引起的,这些实现允许恶意用户伪造随机statement的证明。该漏洞是普遍存在的,可以应用于任何不安全地实现 Fiat-Shamir 转换的证明系统。在这篇文章中,我将展示如何利用 Girault 的知识证明 中的 Frozen Heart 漏洞。
这篇文章假定你对零知识证明有一定的了解。如果你想了解更多关于它们的信息,你可以阅读一些有用的博客文章和视频,例如 Matt Green 的入门文章。要了解更多关于 Fiat-Shamir 转换的信息,请查看我写的 博客文章,其中更详细地解释了它。你也可以查看 ZKDocs 以获取关于这两个主题的更多信息。
在 Girault 的知识证明协议中,证明者证明他知道某个值在复合模数上的离散对数。换句话说,证明者说服验证者他知道某个秘密值 x
,使得 h = g-x mod N
,其中 g
是一个高阶生成器,N
是某个复合模数(例如,N = p * q
,其中 p
和 q
是两个素数)。要了解更多关于该协议的信息,请查看 我们在 ZKDocs 上的描述。如果你熟悉 Schnorr 证明,可以将 Girault 的知识证明看作是 Schnorr 证明在复合模数而不是素数模数上的应用。
该协议在默认情况下是交互式的,但可以使用 Fiat-Shamir 转换使其变为非交互式的:
ZKDocs 中 Girault 的知识证明的交互式和非交互式版本 (来源)
从高层次上讲,证明者首先通过生成一个随机值 r
并计算 u = gr
来计算承诺 u
。然后,证明者获得随机的 challenge 值 e
(在交互式版本中来自验证者,或者在非交互式版本中通过使用 Fiat-Shamir 转换来自自身),并计算最终的证明值 z = r + x * e
。只要不能在所使用的群上计算离散对数,并且正确计算了 Fiat-Shamir 的 challenge,该协议就被证明是安全的。
但是,如果我们没有正确计算 Fiat-Shamir 的 challenge 会发生什么?让我们看一个例子。ZenGo 的 Girault 知识证明的实现(在被修复之前),e
是通过哈希 g
、N
和 u
来计算的,但不包括 h
(在此实现中,h
由 statement.ni
表示)。在本系列的 第一部分 中,我们介绍了一条安全实现 Fiat-Shamir 转换的经验法则:Fiat-Shamir 哈希计算必须包括零知识证明 statement 中的所有公共值,以及证明中计算的所有公共值(即,所有随机“承诺”值)。因此,未能在此计算中包含 h
引入了一个 Frozen Heart 漏洞,允许恶意证明者伪造随机 h
值的证明,即使他们不知道其离散对数。
让我们逐步说明如何利用这个 Frozen Heart 漏洞。我们首先为 u
和 z
都选择随机值。由于 h
不包含在 Fiat-Shamir 实现中,我们现在可以计算 e = Hash(g,N,u)
。接下来,我们需要找到一个 h
值,它将通过验证检查:u = gzhe mod N
。我们已经知道除了 h
之外的所有值:我们生成了 u
和 z
,我们计算了 e
,并且 g
和 N
都是公开的。因此,我们可以求解 h
:
<
p style=”text-align: center;”> u = gzhe mod N he = ug-z mod N einv = e-1 mod phi(N) h = (ug-z)einv mod N
如果我们插入这个 h
值,我们知道第二个验证检查将会通过,因为我们专门选择了 h
来通过这个检查。执行的唯一其他检查是 challenge 值 e
的检查,但这个检查也会通过,因为我们已经完全相同地计算了这个值。请记住,我们只是选择了一个随机的 u
。这意味着我们实际上并不知道 u
的离散对数(即,找到一个值 t
使得 gt = u mod N
是不可行的)。由于我们不知道 u
的离散对数,因此我们也不知道 h
的离散对数。但是,我们已经欺骗了验证者,使之认为这个证明是有效的,即使不知道这个离散对数,这意味着我们已经成功地伪造了一个证明。
注意:为了计算 e_inv
,恶意证明者需要能够计算 phi(N)
,这将需要知道 N
的素因子。
Frozen Heart 漏洞在 Girault 的知识证明中是至关重要的,因为它们允许攻击者伪造证明。然而,此漏洞对使用此证明系统的应用程序的影响完全取决于证明系统的使用方式。如果 Girault 的知识证明仅用于独立的公钥(即,不作为某些更大的协议的一部分使用的密钥),那么 Frozen Heart 漏洞可能并不那么严重。
原因是,对于 Girault 的方案,Frozen Heart 漏洞使其可以伪造随机的 h
值。但这并不比生成一个随机的 x
并计算 h = g-x
更强大,后者会产生一个随机的 h
,我们可以为其构造一个证明。但是,如果此证明系统在更大、更复杂的协议中使用——例如,需要证明是不可伪造的阈值签名方案——那么 Frozen Heart 漏洞可能会非常严重。
即使在某些情况下,Frozen Heart 漏洞对于 Girault 的方案(以及 Schnorr 的方案,原因相同)可能并不重要,但对于更复杂的证明系统来说,情况并非如此。要更详细地了解这一点,请查看本系列的下一篇第 3 部分的文章,我们在其中探讨了 Bulletproofs 证明系统上的 Frozen Heart 漏洞。
- 原文链接: blog.trailofbits.com/202...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!