[译]零知识证实: an illustrated primer

前言:

密码学一直被冠以一层神秘的面纱,它深奥的原理一直让人望而生畏,在区块链技术中,密码学又显得尤其重要,因此,尝试翻译学习一下 “Zero Knowledge Proofs” 来加深对密码学的进一步认识。html

“零知识” 这个词很是吸引人,咱们假设零知识是“绝对安全”的代名词,这致使了许多地方在滥用它。它被固定在各类各样的东西上,好比加密系统和匿名网络,然而它们与真正的零知识协议毫无关系。web

这一切都有助于强调一个观点:零知识证实是密码学家所设计的最强大的工具之一。但不幸的是,他们的理解也相对较差。接下来,我将尝试给出一个(大部分)非数学描述 ZK 证实是什么,以及是什么使他们如此特别。编程

ZK 的起源:

“零知识”的概念最先是由麻省理工学院的研究人员Shafi Goldwasser,Silvio Micali和Charles Rackoff在20世纪80年代提出的。这些研究人员正在研究与交互式证实系统有关的问题,即第一方(称为“证实者”)与第二方(“验证者”)交换信息的理论系统,以说服验证者某些数学陈述是真实的。安全

在Goldwasser等人以前,这个领域的大部分工做集中在证实系统的正确性上。也就是说,它认为恶意的证实者试图“欺骗”验证者相信虚假陈述的状况(有点难理解) 。Goldwasser,Micali和Rackoff所作的就是把这个问题变成现实。他们不只仅担忧证实者,而是问:若是验证者是不可信的,你该怎么办?服务器

他们提出的具体问题是信息泄漏。具体地说,在证实过程当中,验证者要了解多少额外的信息,就会超出了陈述是真实的事实?网络

注意,这不只仅是理论上的兴趣,这种理论已经有其实际的应用。svg

下面是一个例子:假设现实中的一个客户但愿使用密码登陆到Web服务器。这个问题的标准在 “real world” 中涉及到在服务器上存储散列版本的密码。所以,登陆能够被看做是一种“证实”,即给定的密码散列是某个密码散列函数的输出 - 更重要的是,客户端实际上知道密码。(不理解不要紧,接着往下看)函数

大多数真实的系统以至关差劲的方式实施这个“证实”。客户端只需将原始密码发送到服务器,从新计算密码哈希并将其与存储的值进行比较。这里的问题很明显:在协议结束时,服务器已经学习了个人明文密码。所以,咱们只能默默祷告服务器不会瘫痪,呵呵。工具

Goldwasser,Micali和Rackoff提出的是进行这种证实新思路。庆幸的是,零知识证实就是用来证实上述问题,同时证实除了与“这个真实的”相对应的单个信息外没有任何信息被泄漏(看完下面的讲解再回过头来理解)。学习

A ‘real world’ example:

到目前为止,这个讨论很是抽象。为了使事情更加具体,让咱们继续,给出一个 “真正的” 零知识协议(略微疯狂)的例子。

就这个例子而言,我但愿你们能想象我是一个新通讯网络的电信巨头。个人网络结构以下图所示。该图中的每一个顶点表示蜂一个无线电塔,链接线(边缘)表示两个单元重叠的位置,这意味着它们的传输可能相互干扰。

网络拓扑图

很明显,这种重叠是有问题的,由于相邻塔的信号可能会扰乱我对信号的接收。幸运的是,个人网络设计容许我将每一个塔配置为三个不一样频段之一以免这种干扰。

所以,要部署个人网络的挑战是将频带分配给塔,使得没有两个重叠的无线电塔会共享相同的频率。若是咱们使用颜色来表示频段,咱们能够快速找出解决问题的办法:

着色解决-1

固然,绕了半天圈子,你们会发现,这是一个著名的理论,称为 Graph three-coloring 问题。您可能也会知道,有趣的是对于某些图形来讲,找到一个解决方案或者肯定一个解决方案是否存在都是至关困难的。事实上,Graph three-coloring - 具体来讲,就是给定的图形是否支持三种颜色解决方案的决策问题 - 在已知的复杂度等级 NP-complete 中。

毫无疑问,上面的例子so easy,用手均可以找到着色方案。OK,咱们将思惟发散。例如,假设个人蜂窝网络很是庞大而复杂,以致于我所掌握的计算能力还不足以找到解决方案。在这种状况下,咱们能想到的途径是将这种解决方法外包给具备这种庞大算力的公司。例如,google。

可是,这会致使一个问题。

假设Google使用大量的计算基础设施来为个人图搜索有效的着色。在我知道他们可以找到解决途径以前,我确定不会付钱给他们。可是,在当我付清以前,谷歌不会给我一个他们的解决方案的副本。咱们将陷入僵局。

较为疯狂的解决方案

Google的工程师与麻省理工学院的Silvio Micali进行了协商,他与Oded Goldreich和Avi Wigderson的同事进行了磋商,提出了以下的巧妙协议 - 一个如此优雅,甚至不须要任何计算机。它只须要一个大仓库,大量的蜡笔和大量的纸张。哦,还有一大堆帽子。

它是如何工做的呢?

首先,我将进入仓库,用纸覆盖地板,并画出个人网络拓扑图的空白表示。而后,我将退出仓库。google工程师如今进入,按照他们预先的解决方案,使用(红色/蓝色/紫色,如上例)三种颜色的集合,随机的为个人空白图进行着色。注意,使用哪一种特定的蜡笔并不重要,只要着色是有效的。

在离开仓库前,Google工程师用帽子盖住每一个顶点。当我回来的时候,我会看到:

初始状态

很明显,这种方法能够完美地保护Google的着色方案。但它对我来讲是不利的。我可能会想,Google会用一个随机的,无效的解决方案填充图表。他们甚至可能根本没有对图表进行着色。

为了消除个人疑虑,Google如今给了我一个“挑战”图表着色解决方案的机会。我能够随意选择这张图的一个“边缘”(也就是两个相邻的帽子之间的一条线)。而后谷歌将“揭开”这两个相应的帽子,展现他们解决方案的一小部分:

着色方案-1

对我而言,这个实验有两个结果:

  • 若是两个显示的顶点是相同的颜色(或根本没有着色),那么我确定知道Google正在对我说谎。很明显,我不会向Google支付一分钱。
  • 若是两个透露的顶点是不一样的颜色,那么Google可能不会对我说谎,(仅仅是可能)。

咱们确定但愿第一种状况出现,我直接就能知道Google在骗我(在验证过程当中,我一直是处于怀疑的角色)。问题是,即便在咱们的实验后,谷歌仍然能够对我说谎 - 毕竟,我只看了两下帽子。若是图中有E个不一样的边缘,那么Google可能会填写一个无效的解决方案。具体来讲,通过一次测试,他们可能以(E-1)/ E的几率(1000个边缘图的计算结果达到99.9%的时间)成功欺骗我。

幸运的是,Google为了进一步消除个人疑虑,容许咱们继续重复执行上述的操做!

我进入仓库,从新绘制和我上述同样的网络拓扑的空白图表。接下来,google工程师进入仓库,用一个有效的解决方案从新填充图形,可是使用上述三种颜色(红色/蓝色/紫色)从新随机排序。这里,要注意理解,我进去仓库后,绘制的仍是我原先的图表,可是google工程师使用的着色方案是与第一次的着色方案不一样的。

帽子又回来了。我回来重复挑战过程,挑选一个新的随机边缘。这一次,若是一切顺利的话,我如今应该稍微有点自信,Google告诉个人是实话。为何呢?由于为了欺骗我,Google必须连续两次幸运。这可能发生 - 但发生的几率相对较低。如今,Google连续两次欺骗个人机会如今是(E-1)/ E *(E-1)/ E(或者咱们上面的1000个边缘例子大约有99.8%的几率)。

幸运的是,咱们能够一直重复上述的操做过程。直到我确信Google可能会告诉我真相。

这里有一个例子,你们能够直观感觉一下:零知识证实

请注意,我永远不会彻底肯定Google是诚实的 - 他们欺骗我老是会有一个小几率。但通过大量迭代(E ^ 2),我终于能够提升本身的信心,以致于Google只能以微不足道的可能性来欺骗我 - 这足够低了,实际上并不值得担忧。而后,我能够安全地把个人钱交给Google。

在这个过程当中,咱们要注意理解,Google 的着色方案也是受到保护的。即便我试图经过在协议运行之间留下笔记来了解他们的解决方案,也没关系。google 每次让我验证以前都会随机使用新的解决方案。我每次获取到的信息都是不一样的,因此我没办法将这些信息串联起来,最终得到 google 的着色方案。

What makes it ‘zero knowledge’?

我向你声称,这个协议没有泄露有关Google解决方案的信息。可是现代密码学的第一条规则就是永远不要相信那些没有证据就要求这样的事情的人。

Goldwasser,Micali和Rackoff提出了三个如下属性,每一个零知识协议都必须知足。它们是:

  • 完整性。若是谷歌说的是实话,那么他们最终会说服我(至少颇有可能)。
  • 肯定性。若是Google真的说实话,他们只能说服我(这个方案只对我有用)。
  • 零knowledgeness。 (是的,这真的叫作这个。)我不知道Google的解决方案。

咱们已经讨论了完整性的论点。若是咱们运行足够多的时间,协议最终会说服我(错误几率能够忽略不计)。若是谷歌曾经试图欺骗我,我会以极大的可能性检测到他们的在说谎。

这里最困难的部分是“零知识”属性。要作到这一点,咱们须要进行一个脑洞大开的思想实验。

时光穿梭机

首先,让咱们作一个疯狂的假设。想象一下,Google的工程师并不像人们想象的那样有能力。他们在这个问题上工做了好久好久,但他们一直没有找到合理的解决途径。因此他们决定欺骗我。

他们的想法是潜入Google “X研讨会” 并借用Google的原型时间机器。最初的计划是倒退几年,利用额外的工做时间来解决问题。不幸的是,事实证实,像大多数谷歌原型同样,时间机器有一些限制。最关键的是:它只能倒退 4min30s。因此没办法使用时间机器来赢得更多的工做时间。但事实证实,即便这种很是有限的技术仍然能够用来欺骗我。

Google时光穿梭机

这个计划执行起来很是简单。因为Google实际上并不知道图形的有效颜色,所以他们只会用一堆随机颜色对纸张着色,而后戴上帽子。若是运气好的话,我会挑战他们在一对不一样颜色的顶点,每一个人都会松了一口气,咱们会继续这个协议。到如今为止还挺好。

然而,不可避免地,我要验证一副帽子,发现两个相同颜色的顶点。在正常的协议中,我目前已经知道Google在说谎了。可是Google这个时候启动时间机器。每当Google发现本身处于这种尴尬境地时,他们只是简单地修复它。也就是说,一个指定的Google员工拉开一个开关,“倒退”时间大约四分钟,Google团队用一个全新的随机解决方案从新调整图表。如今,他们让时间前进,而后再试一次。

时间机器容许谷歌'修复'在他们的虚假协议执行过程当中发生的任何事故,这使得个人经验看起来彻底合法。因为坏的挑战结果只会发生在1/3的时间内,因此协议的预期运行时间(从Google的角度来看)只比运行诚实协议所需的时间稍微大一些。从个人角度来看,我甚至不知道额外的时间机器旅行正在发生。

最后一点是最重要的。事实上,从个人角度来看,不知道时间机器的存在,因此从个人迷之视角来看,由此产生的交互与真实状况彻底相同。再强调一点,在时间机器版本中,Google绝对没有找到合理的着色方案。

这究竟是什么意思?

咱们刚刚展现的是一个模拟的例子。请注意,在三维世界中,时间是不可能倒退的,也就是说,没有人能够用时间机器欺骗我,这个基于帽子的协议是正确的和合理的,这意味着在E ^ 2轮以后,我可以确信(除了可忽略的几率)Google对图形的着色方案是正确的。

在上面扯淡的例子中,咱们假设若是谷歌可以“倒退”个人时间观点 - 那么即便他们根本没有关于实际图的信息,他们也能够为着色方案伪造有效的运行协议。从个人角度来看,两个协议有什么区别?当咱们考虑二者的统计分布时,根本没有区别。二者都传达了相同数量的有用信息。

相信与否,这证实了一些很是重要的东西。

具体而言,假设我(验证者)在观察到诚实协议的执行以后有一些策略“提取”有关Google着色的有用信息。那么当我被时间机器愚弄的时候,个人策略应该也一样适用。从个人角度来看,协议运行在统计上是相同的。我没法分辨。

所以,若是我所能提取的信息量在“真实实验”和“时间机器实验”中是相同的,可是Google放入“时间机器”实验的信息量刚好为零 - 那意味着即便在现实世界的协议下Google也没有泄露任何有用的信息。(个人理解就是:加入时间机器实验以后,Google没有给出咱们任何解决方案,可是在我看来,这个着色方案同样是可信的,那么在现实世界,同理。)

上述实验主要用来辅助理解,什么是零知识

摆脱帽子和时间机器

固然,咱们不能在庞大的网络拓扑图中使用帽子和时间机器什么的来解决问题。

把事情联系在一块儿,咱们首先须要把咱们的协议带入数字世界。这就要求咱们构建一个“帽子”的数字等价物:既隐藏数字价值,又同时“约束”(或“承诺”)制造者的东西,而且在验证以后她不能改变主意。

幸运的是,咱们有这个应用程序的完美工具。这就是所谓的数字承诺计划。承诺方案容许一方在保密的状况下“承诺”给定的信息,而后“打开”由此产生的承诺,揭示内部的内容。它们能够由各类成分构成,包括(强)密码散列函数。

给定一个承诺方案,咱们如今拥有了咱们所须要的全部要素来以电子方式运行零知识协议。证实者首先将其顶点颜色编码为一组数字消息(例如数字0,1,2),而后对每一个数字消息产生数字承诺。这些承诺被发送到验证器。当验证者在边缘挑战时,证实者只显示对应于两个顶点的承诺的开放值。

因此咱们设法消除了帽子。可是,咱们如何证实这个协议是零知识?

幸运的是,如今咱们处于数字世界,咱们再也不须要一台真正的时间机器来证实这个协议的事情。一个关键的技巧就是在咱们的设置中指定协议不会在两我的之间运行,而是在两个不一样的计算机程序之间运行(或者是更为正式的几率图灵机)。

咱们如今能够证实的是下面的定理:若是你可以想出一个在参与协议运行以后提取有用信息的计算机程序(对于验证者),那么就有可能使用“时间机器”在那个程序中,为了使得从证书没有提供任何信息开始的协议的“假”运行中提取相同数量的有用信息。

并且因为咱们如今正在谈论电脑程序,显而易见,“时间倒退”很容易。事实上,咱们一直在“倒退“电脑程序。例如,咱们使用有快照功能的虚拟机软件就能够解决。

即便你没有花哨的虚拟机软件,任何计算机程序均可以被“倒带”到一个较早的状态,只需从头开始从新编程,并为它提供彻底相同的输入。只要包括全部随机数在内的输入是固定的,程序将始终遵循相同的执行路径。所以,您能够经过从一开始就运行程序来“倒带”一个程序,并在达到某个指望的点时“分叉”执行。

最终咱们获得的是下面的定理。若是有一个 Verifier 计算机程序经过与一些 Prover 交互地运行这个协议成功地提取信息,那么咱们能够简单地使用该程序的 “倒带” 技巧来提交一个随机的解决方案,而后经过倒退它的执行来 “欺骗” Verifier没法正确回答其挑战。上面给出的逻辑是相同的:若是验证者在运行实际协议后成功地提取信息,那么它应该可以从模拟的基于 “倒带” 的协议中提取相同数量的信息。但因为没有信息进入模拟协议,因此没有信息能够提取。所以,验证者能够提取的信息必须始终为零。

OK,这是什么意思呢?

如今,让咱们回顾一下。咱们知道,协议是完整的,基于咱们上面的分析。在任何状况下,都不存在时间机器这个玩意儿。

同时,协议也是零知识。为了证实这一点,咱们证实了任何成功提取信息的 Verifier 程序也必须可以从使用的协议运行中提取信息,而且首先没有信息可用。这致使了一个明显的矛盾,并告诉咱们这个协议在任何状况下都不能泄漏信息。

这一切都有一个重要的好处。因为任何人“伪造”协议都是微不足道的,即便在Google向我证实他们有解决方案以后,我也不能从新还原协议的记录,以向任何其余人证实任何事情(好比法官) 。这是由于法官不能保证视频是真实录制的,并且我也不会像谷歌使用时间机器那样简单地进行编辑。这意味着协议转录自己不包含任何信息。协议只有在我本身参与的状况下才有意义,我能够肯定它是实时发生的。

总结

可使用散列函数来构建一个简单的承诺示例。要提交值“x”,只需生成一些(适当长的)随机数字,咱们将其称为“salt”,并输出承诺C = Hash(salt || x)。要打开承诺,你只须要显示“x”和“salt”。任何人均可以经过从新计算散列来检查原始承诺是否有效。这在一些关于函数自己的假设下是安全的。

原文连接:Zero Knowledge Proofs: An illustrated primer


本文由 Copernicus团队 冉小龙翻译,转载无需受权。

转载自:mp.weixin.qq.com/s/fgenZvQUj…

相关文章
相关标签/搜索