零知识证明-概念-零知识证明图文并茂的入门

零知识证明:图文并茂的入门

原文来自Zero Knowledge Proofs: An illustrated primer

现代密码学最棒的一点之一就是其美妙的术语。你可以用诸如"硬核谓词""陷门函数"或"不可能差分密码分析"等密码学术语,组建任意数量的朋克乐队(或汤博乐博客)。当然,我甚至还没提到超越所有这些术语的那一个。这个术语就是"零知识"。

事实上,"零知识"这个术语极具吸引力,以至于引发了一些问题。人们滥用这个术语,认为零知识必定等同于"绝对安全"。因此,它被附加到各种与真正的零知识协议毫无关联的事物上,比如加密系统和匿名网络。

这一切都强调了一个观点:零知识证明是密码学家有史以来设计出的最强大的工具之一。但不幸的是,人们对它的了解相对较少。在这一系列文章中,我将尝试(尽量)用非数学的方式描述零知识证明是什么,以及是什么让它们如此特别。在这篇文章和下一篇文章中,我将讨论一些我们实际使用的零知识证明协议。

零知识的起源

"零知识"的概念最早由麻省理工学院的研究人员沙菲·戈德瓦塞尔(Shafi Goldwasser)、西尔维奥·米卡利(Silvio Micali)和查尔斯·拉克夫(Charles Rackoff)在20世纪80年代提出。这些研究人员当时致力于研究与交互式证明系统相关的问题,这是一种理论系统,其中一方(称为"证明者"Prover)与另一方("验证者"Verifier)交换信息,以说服验证者某个数学命题为真。*

在戈德瓦瑟等人之前,该领域的大多数研究都聚焦于证明系统的可靠性。也就是说,其考虑的是恶意证明者试图 "欺骗" 验证者相信一个错误陈述的情况。戈德瓦瑟、米卡利和拉克夫所做的是将这个问题彻底扭转。他们不再仅仅担心证明者,而是提出疑问:如果你不信任验证者会怎样?

他们提出的具体担忧是信息泄露。具体而言,他们问道,在这个证明过程中,验证者除了知道陈述为真这一事实之外,还会额外了解到多少信息呢?

需要注意的是,这不仅仅具有理论意义。在实际应用中,这类事情也至关重要。

举个例子:假设现实世界中的一位客户希望使用密码登录到Web服务器。解决此问题的标准 "现实世界" 方法是在服务器上存储 密码的哈希版本。因此,登录可以被视为一种 "证明",即给定的密码哈希值是某个密码通过哈希函数得出的输出,更重要的是,证明客户确实知道该密码。

大多数实际系统以绝对糟糕的方式来实现这种"验证"。客户端只是简单地将原始密码传输给服务器,服务器重新计算密码哈希值并与存储的值进行比较。这里的问题显而易见:在协议结束时,服务器已经知道了我的明文密码。因此,现代密码安全措施在很大程度上只能寄希望于服务器不被攻破。

戈德瓦瑟、米卡利和拉克夫提出的方案为进行此类证明带来了新的希望。如果能够完全实现,零知识证明将使我们能够证明上述之类的命题,同时除了 "该命题为真" 这一比特的信息之外,不会泄露任何其他信息。

一个"现实世界"的例子

到目前为止,这个讨论一直相当抽象。为了让内容更具体一些,我们继续给出一个(有点疯狂的)零知识协议的 "真实" 示例。

为了便于这个例子的讲解,我希望你想象我是一位电信巨头,正在部署一个新的蜂窝通信网络。我的网络结构由下面的图表示。此图中的每个顶点代表一座蜂窝信号发射塔,连接线(边)表示两个信号覆盖区域重叠的位置,这意味着它们的信号传输可能会相互干扰。

这种重叠存在问题,因为这意味着来自相邻信号塔的信号很可能会干扰接收。幸运的是,我的网络设计允许我将每个信号塔配置到三个不同的频段之一,以避免此类干扰。

因此,部署我的网络所面临的挑战在于为基站分配频段,确保没有两个重叠的小区使用相同的频率。如果我们用颜色来表示频段,就能很快得出该问题的一个解决方案:

当然,你们中的许多人会注意到,我在这里描述的只是著名的理论问题"图的三色着色"问题的一个实例。你们可能也知道,这个问题之所以有趣,是因为对于某些图来说,找到一个解可能相当困难,甚至很难确定是否存在解。事实上,图的三色着色问题,具体来说,就是判定给定图是否存在三色解的决策问题,已知属于复杂度类NP完全问题。

不言而喻,上面这个简单示例很容易手动解决。但如果不是这样呢?例如,假设我的蜂窝网络非常庞大且复杂,以至于我所拥有的计算能力不足以找到解决方案。在这种情况下,将问题外包给拥有足够计算能力的其他人会是个不错的选择。比如,我可以请谷歌的朋友帮我按特定要求解决这个问题。

但这就引出了一个问题。

假设谷歌将其大部分计算资源用于为我的图寻找一种有效的着色方案。在我确认他们真的找到了这样一种着色方案之前,我肯定不会付钱给他们。与此同时,在我付清款项之前,谷歌也不会给我他们的解决方案副本。我们最终会陷入僵局。

在现实生活中,这个困境或许有一个符合常识的解决方案,可能涉及律师和第三方托管账户。但这不是一个关于现实生活的博客,而是一个关于密码学的博客。如果你读过任何一篇加密论文,就会明白解决这个问题的正确方式是想出一个绝对疯狂的技术方案。

一个疯狂的技术解决方案(借助帽子!)

谷歌的工程师们向麻省理工学院的西尔维奥·米卡利(Silvio Micali)咨询,米卡利与他的同事奥德·戈德赖希(Oded Goldreich)和阿维·威格森(Avi Wigderson)商讨后,想出了下面这个巧妙的协议------它非常简洁,甚至都不需要任何计算机。它只需要一个大仓库、大量蜡笔和足够多的纸张。哦,对了,还需要一大堆帽子。

它的工作原理如下:

首先,我会进入仓库,在地面铺上纸,并绘制我的蜂窝网络图的空白表示。然后我会离开仓库。现在谷歌可以进入,将三支蜡笔打乱,随机选择三种商定的蜡笔颜色(如上述示例中的红/蓝/紫)进行分配,并用他们的解决方案为图表上色。请注意,他们使用哪支具体的蜡笔并不重要,只要上色有效即可。

在离开仓库前,谷歌用一个罩子盖住了每个顶点。等我再回来时,看到的就是这样的情景:

显然,这种方法很好地保护了谷歌的秘密着色方案。但这对我毫无帮助。据我所知,谷歌可能用一个随机的、无效的解决方案填充了图表。他们甚至可能根本没有对图表进行着色。

为了解决我合理的担忧,谷歌现在给我一个 "挑战" 他们图着色解决方案的机会。我可以随机挑选这个图中的一条 "边"(也就是相邻两顶帽子之间的一条线)。然后谷歌会移除对应的两顶帽子,展示其解决方案的一小部分:

请注意,我的实验有两种结果:

  1. 如果这两个显示出来的顶点颜色相同(或者根本没有上色!),那么我肯定知道谷歌在骗我。很明显,我一分钱都不会付给谷歌。
  2. 如果显示的两个顶点颜色不同,那么谷歌可能没有对我撒谎。

希望第一个命题是显而易见的。第二个命题则需要更多的思考。问题在于,即使经过我们的实验,谷歌仍有可能对我撒谎------毕竟,我只查看了其中两顶帽子下面的情况。如果图中有E条不同的边,那么谷歌可以填入一个无效的解决方案,并且在大多数情况下仍能蒙混过关。具体来说,经过一次测试,他们欺骗我的概率可能高达(E - 1)/E(对于一个有1000条边的图,这个概率高达99.9%)。

幸运的是,谷歌对此有应对办法。我们只需再次运行该协议!

我们铺上崭新的纸张,重新画一张空白的图表。谷歌现在会随机打乱三种蜡笔的顺序。接下来,他们会用一种有效的解决方案填充图表,但使用新的随机排列的三种颜色。

帽子重新戴上。我再回来,重复挑战过程,随机选择一条新的边。上述逻辑再次适用。只是这一次,如果一切顺利,我现在应该会稍微更有信心,相信谷歌告诉我的是真话。这是因为,为了骗过我,谷歌必须连续两次都走运。这是有可能发生的------但发生的概率相对较低。谷歌连续两次骗过我的概率现在是 (E - 1)/E * (E - 1)/E(对于上述有1000条边的例子,这个概率约为99.8%)。

幸运的是,我们不必只停留在两个挑战上。事实上,我们可以不断反复尝试,直到我确信谷歌可能在告诉我真相。

但别只听我这么说。得益于一些精妙的JavaScript代码,你可以自己去试试看(交互式零知识三色可染性演示)。

请注意,我永远无法完全确定谷歌是否诚实------他们总有极小的概率在欺骗我。但经过大量的迭代(碰巧是E^2),我最终可以将我的信心提升到这样一个程度:谷歌欺骗我的概率微乎其微,低到在所有实际情况下都不值得担忧。然后我就可以放心地把钱交给谷歌了。

你需要相信的是,谷歌同样受到保护。即便我试图通过在协议运行间隙做记录来了解他们的解决方案,也无济于事。谷歌每次迭代都会随机选择颜色,这让我无计可施。我获取的有限信息毫无用处,而且我也无法将不同交互过程中了解到的数据联系起来。

是什么让它成为"零知识"的?

我向你断言,这个协议不会泄露关于谷歌解决方案的任何信息。但别轻易相信我的话!现代密码学的首要原则是,永远不要相信那些没有证据就声称此类事情的人。

戈德瓦塞尔(Goldwasser)、米卡利(Micali)和拉克夫(Rackoff)提出了每一个零知识协议都必须满足的以下三个属性。通俗地说,它们是:

  1. 完整性。如果谷歌说的是真话,那么他们最终会说服我(至少有很大概率)。
  2. 可靠性。只有谷歌说的确实是真话,才能说服我。
  3. 零知识特性。(没错,它确实叫这个名字。)我对谷歌的解决方案没有了解到其他任何信息。

我们已经讨论过完备性的论证。只要我们运行足够多次,该协议最终会说服我(误差概率可忽略不计)。在这里,可靠性也很容易证明。如果谷歌试图欺骗我,我极有可能察觉到他们的背叛。

这里的难点在于"零知识"特性。要做到这一点,我们需要进行一个非常奇特的思想实验。

(使用时间机器的)思想实验

首先,让我们从一个疯狂的假设开始。假设谷歌的工程师并不像人们想象的那么有能力。他们为这个问题研究了好几个星期,但始终没能想出解决方案。距离展示时间只剩12个小时了,谷歌的工作人员开始绝望。他们决定骗我,让我以为他们已经找到了图的着色方案,尽管实际上他们并没有。

他们的想法是潜入谷歌X实验室,借用谷歌的原型时光机。最初的计划是回到几年前,利用多出的工作时间再次尝试解决这个问题。不幸的是,和大多数谷歌的原型产品一样,这台时光机也有一些局限性。最关键的是:它只能回到四分半钟之前。

所以,利用时光机来制造更多工作时间是行不通的。但即便如此,事实证明,哪怕是这种极为有限的技术,依然能用来欺骗我。

这个计划简单得有些阴险。由于谷歌实际上并不知道该图的有效着色方法,他们就用一堆随机的颜色给纸张上色,然后把帽子戴上。要是运气好,我挑到的那对顶点恰好颜色不同,大家都会松一口气,我们就继续按协议进行。到目前为止,一切顺利。

不过,不可避免地,我会摘下两顶帽子,然后发现两个相同颜色的顶点。在常规流程中,谷歌这下就彻底败露了。而这就是时光机发挥作用的地方。每当谷歌团队发现自己陷入这种尴尬境地时,他们就直接修正这个问题。也就是说,一名指定的谷歌员工拨动开关,将时间 "倒回" 大约四分钟,然后谷歌团队用一种全新的随机方案重新为图着色。现在他们让时间向前推进,然后再试一次。

实际上,这台"时间机器"能让谷歌"修复"在其虚假协议执行过程中发生的任何意外情况,这让我觉得整个过程看起来完全合理。由于糟糕的挑战结果仅会在三分之一的时间里出现,(从谷歌的角度来看)该协议的预期运行时间仅略长于正常运行该协议所需的时间。而从我的角度看,我甚至都不知道发生了额外的"时间机器"跳转。

最后这一点是最重要的。事实上,在我看来,如果不知道时间机器参与其中,那么由此产生的交互与真实情况完全一样。从统计数据上看毫无差别。然而值得再次指出的是,在时间机器版本中,谷歌完全不知道如何给图表上色。

这到底有什么意义?

我们刚才展示的是一个模拟示例。请注意,在一个时间只会向前流逝且没人能用时间机器欺骗我的世界里,基于帽子的协议是正确且可靠的,这意味着在 <math xmlns="http://www.w3.org/1998/Math/MathML"> E 2 E^2 </math>E2轮之后,我应该(除了极小的概率外)确信图确实是可着色的,并且谷歌正在向协议中输入有效的数据。

我们刚刚展示的是,如果时间并非只向前流逝------具体来说,如果谷歌能够"倒转"我对时间的感知------那么,即使他们对实际的图着色一无所知,也能伪造出一次有效的协议运行。

在我看来,这两份协议文本有什么区别呢?从二者的统计分布来看,根本没有区别。它们所传达的有用信息完全一样。

信不信由你,这证明了非常重要的一点。

具体来说,假设我(验证者)有某种策略,在观察到诚实协议的一次执行后,能 "提取" 出关于谷歌着色的有用信息。那么,在我被时间机器欺骗的情况下,我的策略也应该同样有效。从我的角度来看,协议运行在统计上是相同的。我从物理层面上无法分辨其中的差异。

因此,如果我在"真实实验"和"时间机器实验"中能够提取到的信息量是相同的,然而谷歌在"时间机器实验"中所投入的信息量恰好为零,那么这就意味着,即使在现实世界中,该协议也肯定不会泄露任何有用信息。

因此,只需要证明计算机科学家拥有时间机器。我们确实有!(这是一个严守的秘密。)

去掉帽子(以及时光机)

当然,我们实际上并不想用帽子来运行一个协议。而且,即便是谷歌(大概?)也没有一台真正的时光机。

为了将各个环节联系起来,我们首先需要将协议引入数字世界。这就要求我们构建一个数字版的 "帽子":既能隐藏一个数字值,同时又能 "绑定"binding(或 "承诺"committing)创建者对该值的认定,使其事后无法反悔。

幸运的是,我们有一个非常适合此应用的工具。它被称为数字 "承诺方案"(commitment scheme)。承诺方案允许一方在对特定消息保密的情况下 "承诺" 该消息,然后在之后 "打开" 所产生的承诺以揭示其中的内容。它们可以由各种要素构建而成,包括(强)加密哈希函数。

给定一个承诺方案,我们现在拥有了以电子方式运行零知识协议所需的所有要素。证明者首先将其顶点着色编码为一组数字消息(例如,数字0、1、2),然后为每个消息生成数字承诺。这些承诺被发送给验证者。当验证者对一条边提出挑战时,证明者只需揭示与两个顶点对应的承诺的打开值。

所以我们已经成功去掉了帽子。但我们如何证明这个协议是零知识的呢?

幸运的是,如今我们身处数字世界,不再需要一台真正的时光机来证明关于这个协议的事情。一个关键技巧是在我们的设定中明确,该协议并非在两个人之间运行,而是在两个不同的计算机程序之间运行(或者,更正式地说,是在两个概率性的图灵机之间运行)。

我们现在能够证明的是如下定理:如果你能设计出一个计算机程序(用于验证者),它在参与一次协议运行后能提取出有用信息,那么就有可能对该程序使用一台 "时间机器",以便让它从一次 "伪造" 的协议运行中提取出等量的有用信息,在这次伪造的运行中,证明者从一开始就没有输入任何信息。

而且既然我们现在谈论的是计算机程序,那么很明显,让时间倒流根本不是什么非凡的壮举。事实上,我们一直在让计算机程序 "倒流" 。例如,可以考虑使用具有快照功能的虚拟机软件。

通过虚拟机快照回滚的示例。先将初始虚拟机向前运行,然后回滚到一个初始快照,然后执行被分支到一条新路径。

即使你没有花哨的虚拟机软件,任何计算机程序都可以"倒回"到更早的状态,只需从头重新启动程序,并向其提供完全相同的输入即可。只要输入(包括所有随机数)是固定的,程序将始终遵循相同的执行路径。因此,你只需从头运行程序,并在程序到达某个所需点时"分叉"其执行,就可以倒回程序。

最终我们得到如下定理。如果存在任何验证者计算机程序,通过与某个证明者交互式运行此协议来成功提取信息,那么我们可以简单地对该程序使用回溯技巧,提交一个随机解决方案,然后每当我们无法正确回答其挑战时,通过回溯其执行过程来"欺骗"验证者。上述逻辑同样适用:如果这样的验证者在运行真实协议后成功提取到信息,那么它应该能够从基于回溯的模拟协议中提取相同数量的信息。但由于没有信息输入到模拟协议中,也就没有信息可提取。因此,验证者能够提取的信息必然始终为零。

好的,那么这一切意味着什么呢?

所以让我们回顾一下。基于上述分析,我们知道该协议是完备且可靠的。在我们确定无人篡改时间的任何情况下,即验证者正常运行且无人倒回其执行过程时,可靠性论证都成立。

同时,该协议也是零知识的。为了证明这一点,我们表明,任何成功提取信息的验证者程序,也必须能够使用回溯从协议运行中提取信息,并且在最初的地方没有可用的信息。这会导致一个明显的矛盾,这表明该协议在任何一种情况下都不会泄露信息。

这一切有一个重要的好处。因为任何人"伪造"一份协议记录都轻而易举,所以即便谷歌向我证明他们有了一个解决方案,我也无法通过回放协议记录来向其他人(比如法官)证明任何事。这是因为法官无法保证视频记录是真实的,也无法保证我没有像谷歌可能利用时间机器所做的那样进行剪辑。这意味着协议记录本身并不包含任何信息。只有我本人参与其中,并且确定事情是实时发生的,这个协议才有意义。

所有NP问题的证明!

如果你已经读到这里,我很确定你已经准备好迎接重大消息了。那就是,给手机网络进行三色着色并不是一个特别有趣的问题------至少,就其本身而言并非如此。

三色着色问题真正有趣的地方在于,它属于NP完全问题类别。通俗来讲,这类问题的奇妙之处在于,NP类中的任何其他问题都可以转化为该问题的一个实例。这一由戈德赖希、米凯利和威格森得出的结果,一举证明了,对于大量有用的命题,都存在 "高效的" 零知识证明,其中许多命题比为蜂窝网络分配频率要有趣得多。你只需找到一个你希望证明的命题(属于NP问题),比如我们上面提到的哈希函数示例,然后将其转化为三色着色问题的一个实例。此时,你只需运行帽子协议的数字版本即可。

总结与下次

当然,对于任何有意义的命题,实际运行这个协议都是极其愚蠢的行为,因为这样做的代价包括原始命题和证据的总大小,加上将其转换为图的简化成本,再加上为了让他人相信证明有效而必须进行的E^2协议轮数。从理论上讲,这是 "高效的",因为证明的总成本与输入大小呈多项式关系,但在实际中绝非如此。

到目前为止,我们所展示的是这样的证明是可行的。我们还需要找到在现实世界中足够实用的证明方法。

在下一篇文章中,我将探讨其中的一些内容,特别是我们用于各种有用命题的高效证明。我会给出一些(来自实际应用的)例子,说明这些内容是如何被运用的。此外,应读者要求,我还会谈谈为什么我如此不喜欢SRP

注意事项

* 形式上,交互式证明的目标是让验证者相信某个特定字符串属于某种语言。通常,证明者能力很强(无界),但验证者的计算能力有限。

** 此示例基于戈德瓦塞尔(Goldwasser)、米卡利(Micali)和拉克夫(Rackoff)的原始解决方案,而使用帽子的教学示例则基于西尔维奥·米卡利(Silvio Micali)的解释。我只对其中的愚蠢错误负责。

****** 可以使用哈希函数构建一个简单的承诺示例。要对值"x"进行承诺,只需生成一些(足够长的)随机数字字符串,我们称之为"盐值",并输出承诺C = Hash(盐值 || x)。要打开该承诺,只需揭示"x"和"盐值"。任何人都可以通过重新计算哈希值来检查原始承诺是否有效。在对该函数本身的一些(相当强的)假设下,这是安全的。

相关推荐
斯普信专业组1 小时前
Kafka安全认证技术:SASL/SCRAM-ACL方案详解
分布式·安全·kafka
ybdesire1 小时前
Jinja2模板引擎SSTI漏洞
网络·人工智能·安全·web安全·大模型·漏洞·大模型安全
黑金IT2 小时前
如何在 Electron 应用中安全地进行主进程与渲染器进程通信
服务器·安全·electron
冯诺一没有曼4 小时前
无线网络入侵检测系统实战 | 基于React+Python的可视化安全平台开发详解
前端·安全·react.js
知孤云出岫5 小时前
计算机网络中科大 - 第7章 网络安全(详细解析)-以及案例
计算机网络·安全·web安全
跨境卫士-小汪6 小时前
亚马逊热销变维权?5步搭建跨境产品的安全防火墙
网络·经验分享·安全
开开心心就好6 小时前
免费多平台运行器,手机畅玩经典主机大作
服务器·python·学习·安全·微信·智能手机·ocr
久绊A7 小时前
IP检测工具“ipjiance”
网络·安全·web安全
小陈在努力ii8 小时前
网络安全-Burp Suite基础篇
linux·安全·web安全