定义

百度百科中关于零知识证明的定义如下:零知识证明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。
它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。
证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。大量事实证明,零知识证明在密码学中非常有用。
如果能够将零知识证明用于验证,将可以有效解决许多问题。
简单来讲就是存在知识拥有者(证明者)和验证者双方,知识拥有者在不告知验证者知识具体内容的情况下,通过相关协议或者算法,证明知识拥有者的确掌握该知识。

举几个栗子

谁是红绿色盲

问题
假设一个房间里有100个人,只有小明不是红绿色盲,其余人都是红绿色盲。
房间里有一个盒子,盒子里有两个球,分别是绿色和红色。
现在小明如何在不告知其他人(验证者)具体哪一个球是红色的情况下,证明自己不是红绿色盲?
解决办法
验证者可以将两个球分别放在左右手,然后在小明看不到的地方去做如下操作:交换左右手上的球或者不做任何操作。
操作之后再问小明手上的两个球是否做了位置交换,如果小明每次都能答对,则能验证小明不是红绿色盲。

解数读

问题
假设现在有一个9X9的数独方格,小明和小王在比赛看谁先做出来。这两个人互相较劲,谁都觉得自己比对方厉害。
结果小明3分钟就做出来了,但是又不想把答案告诉小王。小王呢,也不相信小明已经做出来了,想当这个验证者来证明小明确实已经做出来了。小明应该怎么办呢?
解决办法
小明可以将他写的答案填在卡片上,然后倒扣在方格中。
每次小王说要检查某一行,或者某一列的数据,小明就将小王指定的这一行或者这一列的这9张卡片装到一个袋子里,然后摇均匀。
小王只需要检查每次这个袋子里出现的数字是不是都是1到9即可(检查完毕之后,小明需要再次将他填写的答案倒扣回去还原方格)。
如果每次检查都是1到9,那么就证明了小明的确是做出来了这道数独题。

百万富翁问题

问题
假设现在有两个富翁甲和乙,这两个人都有上亿资产,假设分别为i和j(其中 0<i<10, 0<j<10)。
人都是爱攀比的,甲和乙都想知道谁的资产更多。但是两人又都不想让对方知道自己的具体资产有多少。
本来嘛,可以找一个彼此都信任的人作为中间人,两人把各自的资产告诉这个中间人,然后中间人告诉他们谁资产多谁资产少。
但是这两人也不想让其他任何人知道自己的资产。应该怎么办呢?
解决办法
这个问题其实就是著名的百万富翁问题,由清华大学姚期智教授提出,姚期智是我国目前唯一一位图灵奖获得者。至于这个问题的解法,我们下回分解~
黎明前最黑暗,成功前最绝望!