零知识,怎么证明
零知识证明(zero-knowledge proof, ZKP)是一个有用但较难理解的密码学工具,在近几十年的不断发展中,已经逐步从纯理论过渡到了实际应用,在区块链、安全通信、电子投票等方面均有着广泛的应用。本文将在不涉及复杂数学表示和理论描述的情况下,用简单通俗的语句来介绍零知识证明。
零知识证明,可以通俗的理解为在不透露秘密内容的情况下,去证明其他用户知道这个秘密,它是迄今为止最强大的工具之一,其由Shafi Goldwasser,Silvio Micali和Charles Rachoff在1985年的论文《The knowledge complexity of interactive proof-systems》中提出。那么什么是零知识证明呢?首先,考虑一下以下场景:
阿里巴巴洞穴实验是一个常用的零知识证明的例子,在例子中,阿里巴巴和四十大盗分别位于洞穴的入口处,二人都声称自己知道大门的密码,但是都不想直接告诉对方。为了证明自己知道这个秘密,一人进入洞穴,一人在门口等待,并让其根据自己的指令行进,通过对方是否出现在指定的出口来判断其是否知道洞穴大门的密码。阿里巴巴洞穴实验的完整过程如图1所示
图1 阿里巴巴洞穴实验示意图
假设这个协议的目的是A向B证明自己知道秘密的内容,那么在这个协议中,A称为证明者,B称为验证者。对于整个零知识证明协议,有一以下三个要求:
1. 完备性:只要证明者拥有相应的知识,就有足够大的概率能通过验证者的验证。这在阿里巴巴洞穴实验中,对应了只要A知道密码,就一定能让B验证A知道密码这件事。
2. 可靠性:如果证明者没有相应的知识,那么欺骗验证者的概率可以忽略,即无法成功验证。这在阿里巴巴洞穴实验中,对应了倘若A不知道密码,那么就无法通过B的验证。
3. 零知识性:在协议的交互过程中,证明者除了向验证者透露自己知道这个秘密的陈述之外,不会透露任何信息。这在阿里巴巴洞穴实验中,对应了A只会让B知道自己知道洞穴的密码这件事,但并不会告诉B自己是如何得知密码的,以及其他与自己知道洞穴密码这件事无关的信息。
我们再用一个数独的例子来描述零知识证明,更进一步地,我们用证明者与验证者来表示协议中的两个参与方。证明者与验证者都拿到了一个数独的题目,证明着知道一个解法,在零知识证明的假设下,他可以这样操作。
1. 拿出81张卡片,每张卡片上都写上一个数字,正好有9张卡片写了同一个数字;
2. 根据他的答案,将所有卡片逐一放在81个格子里,并且背面朝上;
至此,证明者预设好了他所知道的知识,而卡片背面朝上,验证者无法知道任何信息。接下来,验证者随机选择一列,证明者将验证者随机选择的这列卡片收回,并打乱顺序,再将卡片展示给验证者看。验证者如果看到了1到9的每一个数字,那么就完成了验证,并且在验证的过程中,验证者没有得到每张卡片的具体位置,但是验证了1到9确实都出现了。
图2 数独实验
阿里巴巴洞穴实验与数独实验都是交互式证明,也就是验证者需要向证明者询问一些相关问题,如果均能给出正确答案,那么才能算验证成功。在阿里巴巴洞穴实验中,A需要多次根据B的指令进出洞穴,在数独实验中,验证者需要多次选择列才能确定每一列都是正确的。换句话说,只要验证的次数够多,就可以大概率的证明所要证明的信息。但这种设定也是具有局限性的,例如,最终的验证结果如何让第三方信息。非交互式零知识证明就可以解决这一问题,但这很有可能会带来一些额外的开销。例如数独实验中,让程序去决定验证者选择哪一列,从而避免验证者和证明者合谋的问题。
当前,零知识证明被更广泛的研究应用于区块链领域,例如公有链上的匿名交易、智能合约中的数据隐私保护、区块链扩容等,更多零知识证明应用层面的相关介绍将在后续的推文中详细介绍,敬请期待!