概述

两方交互式游戏是密码学中探讨的基本问题之一,简单来说,就是一方(Prover,示证者)向另一方(Verifier,验证者)证明一个命题成立,但不让Verifer知道前Prover是如何证明的,由于Verifier缺少Prover所知道的某些信息,Verifier无法独自验证这个命题

上述这个游戏有一个通用的名称,称为交互式证明系统(Interactive Proofs System,IP)

我们可以将其理解为“在黑暗中证明”,“在黑暗中”有两层意思

Verifier在确信证明内容有效后,不能从Prover那里获得其拥有的知识

协议结束后,除Prover和Verifier外的任意第三方均不能获悉Prover'和Verifier之间交互了什么有意义的信息

仔细理解一下上面这两行字,其实不仅非常有意思,还非常的实用(且好用),比如说你很厉害,发现了某些世纪难题的证明(比如说证明或证伪哥德巴赫猜想,或者P=NP),但是由于这些问题太过于出名,以至于如果你向其他人泄露了证明方法(哪怕任何一个细节),其他人都有可能会剽窃你的成果,而交互式证明系统可以非常好的解决这个问题,在不提供关于如何证明的任何额外信息的情况下,使得Prover让Verifier确信这个命题是肯定的

为什么是交互?

1985年,Goldwasser、Micali和Rackoff三位学者共同发表了一篇影响深远的论文:The knowledge complexity of interactive proof systems.$[1]$

在深入讨论这篇论文之前,先重新理解证明二字,过往的证明更多的是在数学上的推理或者演化,而这篇论文重新诠释了证明的含义

通过构造两个图灵机进行交互,来证明一个命题在概率上是否成立

交互式证明的表现形式为两个(或多个)图灵机的对话脚本(Transcript),其中一方为Prover,另一方为Verifier,由Prover向Verifier证明一个命题的成立,并在此基础上引出了交互式证明系统的概念,如果说这个过程还可以不泄露关于Prover的任何知识,又可以拓展为零知识证明

证明确实可以完成,但整个过程可以做到不泄露知识,这似乎是一个反直觉的过程,在看零知识的相关书籍的时候,给一位学弟简单讲了一下密码学版本的《阿里巴巴与四十大盗》的故事,他听完之后也是一脸疑惑,这个故事第一次听应该是在本科的信息安全数学基础的课程上,当时听完了以后也是一脸疑惑,到底凭什么可以做到所谓的“我并没有告诉你为什么,但是你确实信了”这个概念

个人理解:三位学者将证明蕴含在了交互之中,而证明中又凝结了知识

接下来,咱们细说

何为证明

Shimon Even教授在课上这样回答他的学生

A Proof is whatever convinces me.

听起来好像很玄幻,什么叫能让我信服的东西?似乎对于证明而言,没有一个比较精确的定义

如果从数学的角度出发,证明有两个性质

Proofs are viewed as fixed objects

Proofs are considered at least as fundamental as their consequences(i.e.,the theorems)

这个概念似乎很宽泛,从数学的角度出发是如此,那要是放在其它地方呢,比如法庭上、在哲学角度中、在科技领域的证明又应当如何呢,三位学者认为,证明应该是通过交互来完成的(via an interaction),而非简单的对既有公式和结论的逻辑自洽的推导

何为知识

在零知识证明里,所谓的知识和一般人所理解的知识完全不同,普通的知识或许更多的应当从信息论的角度来理解,将其理解为信息(Information)而非知识(Knowledge)

如果不太能明白的话,可以看下面这两段话

  • 知识是一种与计算困难性相关的概念,而信息不是
  • 知识主要依赖于一些人尽皆知的对象,而信息主要描述的是大众对这个对象的信息差

说得直白一点,从信息论的角度来说,我收到了一些信息,这些信息可以帮助我减少或者消除对某个对象的不确定性,比如说我不知道明天是否会下雨,但是我可以通过看天气预报的方式来减少我在判断明天是否会下雨这个问题时的错误的概率,即便天气预报不完全准确,至少在大部分情况下是准确的,从而我通过看天气预报减少了我对明天是否下雨的不确定性

而知识更多的应该从计算困难的角度出发,比如说我知道某个大合数的素因子,你不知道,在计算这个大合数的分解的时候,或许你会用一些平凡的方法,比如试除法、筛方法之类的,或者用一些高效的算法,比如Pollard ρ算法等等,但即便是用Pollard ρ算法,其复杂度也在四次根式左右,而由于我提前知道了这个数的素因子,在面对这个分解大合数问题时,我可以做到在比你更短的时间内得到答案,因为我已经有答案了

可能分解大合数的这个表述不太严谨,下面通过零知识的概念来表述一个相对严谨的说法

如何理解零知识

让我们从一个例子讲起,考虑Alice和Bob之间的一次对话,假设这次对话是单向的,也就是Alice只说,Bob只听,显然我们可以知道,Alice在本次对话中没有获得任何信息(或知识),另一方面,Bob在听Alice说的过程中,也可能没有获得知识,比方说,Alice只是2说“1+1=2”,则Bob从本次对话中也无法获得任何知识,因为Bob本身就知道这个事实,如果说Alice在对话过程中说出了哥德巴赫猜想的一些证明细节,那么就说Bob从本次对话中获得了知识

如果不太能理解的话,在看一个例子,假设有一个公共的文件系统,里面的文件均被该文件的所有者用密钥加密了,假设某一个时间点,Alice想要向Bob证明一件事,即在她拥有的某个文件中有一段特定意义的明文,如何完成?

最简单直接的做法是将保存在系统内的密文件直接发送给Bob,但是存在一个问题,由于文件被加密了,况且Bob没有Alice的密钥,他如何验证Alice发送给他的内容确实是包含这段特定意义的明文,而不是发了一个毫无意义的文件给他呢?更更简单的做法就是,Alice直接把密钥给Bob就好了,但是这并不是Alice所想要的,因为Alice只想向Bob证明(或者说展示)这个特定的文件有特定的内容,但是Alice并不像泄露她其它的文件

结合上述两个例子,Alice是否可以在不泄露知识(第一个例子中指的是哥德巴赫猜想证明,第二个例子中指的是Alice的密钥)的情况下向Bob证明她确实有这样东西,这就是零知识证明所探讨的问题

简单来说,零知识证明就是一句话

Zero-knowledge proofs are proofs that yield nothing beyong the validity of the assertion.

如果说证明并没有泄露关于一个断言的任何信息,那么它就是零知识的

在更详细的阐述上一节提到的知识之前,先来提一个题外话,或许会更好的帮助我们理解知识零知识

香农在其开创性的信息论中提到了一个完美安全的概念

完美安全意味着攻击者不能通过密文获取到任何有价值的信息

换句话说,如果攻击者截获了密文,那么他除了瞎猜之外,没有更有效地手段或者方法来得到密文的信息

接下来回到我们的零知识的概念,看下面这一句话

Verifier在与Prover的交互后,并没有提高他对原问题的计算能力

还是之前的大合数分解问题举例,如果说我和你在完成交互后,你对这个大合数的素因子分解仍然还是只能通过Pollard ρ算法,或者其他什么众所周知的算法来求解,那么就说这个交互没有泄露知识,也即交互完成之后,你对这个求解这个大合数的素因子还是只能用交互前的方法来完成,交互并没有让你改变你的计算能力,使你能以一个更效率的方式来求解

仔细对比知识完美安全这两个概念,完美安全说的是攻击者看到密文后还是只能通过瞎猜的方式来破解,而零知识意味着Verifier不能通过交互来更快的求解原问题,在大合数分解问题中,因为交互并没有让Verifier知道这个合数的素因子,从而他还是只能通过原来的算法来求解

通过与完美安全的对比,可以大致理解零知识中知识的概念,但是并不能将其与零知识联系起来,因为对于零知识这个概念有更为严谨的定义,涉及到计算理论的相关知识,之后的文章咱们细说

回到上一节的对知识的理解,知识是和计算困难性相关的,如果说你得到了知识,意味着你的计算能力以某种方式提高了,从而可以更快的求解原问题

而零知识证明就是在这样的基础上完成的一种协议,虽然我不告诉你答案是什么,但是我确实可以通过这个方式让你确信我有这个问题的答案

小结

总的来说,零知识证明就是两方可以通过交互的手段,使得Prover可以让Verifier确信P知道这个问题的答案,但又不向V透露出这个答案的任何具体的细节

但是零知识证明作为应用非常广泛的密码学原语,还是要非常谨慎地使用,如何构建零知识证明,构建过程中又具体需要注意哪些安全细节,在之后的文章中再详细展开讨论

以不安全的方式使用密码学原语,有时候可能会比不使用这个原语产生的后果更严重

后记

有人说,天才是百分之一的灵感,百分之九十九的汗水,但那1%的灵感是最重要的,甚至比那99%的汗水都要重要,或许证明与验证的过程应当也是如此,无论是跨越了三百多年的费马大定理,还是至今仍悬而未决的千禧年难题,证明过程总是常人难以理解的繁琐与复杂,但似乎验证这个结论的过程又应当是一个非常简单的、机械的行为(从直觉上来说似乎是),而这种由复杂与简单来构成的一种不对称性,恰恰构成了零知识体系的价值

本系列文章撰写于研一,受笔者知识面与理解能力的局限,部分概念与定理的表述难免有不准确与不严谨的地方,烦请各位专业人士斧正

参考文献

$[1]$ Goldwasser, Shafi, Silvio Micali, and Charles Rackoff. "The knowledge complexity of interactive proof systems." SIAM Journal on computing 18.1 (1989): 186-208.

$[2]$ 初识「零知识」与「证明」—— 探索零知识证明系列(一) - 知乎 (zhihu.com)

$[3]$ (英)Wenbo Mao著;王继林,伍前红等译.现代密码学理论与实践$[M]$.北京:电子工业出版社.2004.

$[4]$(以)Odeb Goldreich著;温巧燕,杨义先译.密码学基础$[M]$.北京:人民邮电出版社.2003.