零知识证明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。
零知识证明的三条性质
完备性(验证方和证明方都是诚实的,并遵循证明的每一个步骤)
正确性(没人能假冒证明方,阿里巴巴和强盗的故事,存在一种可能的情况:阿里巴巴不知道咒语,但和别人串通好,强盗举起左右手的时候,由那个人给出咒语)
零知识性(证明者只向验证者提供了“拥有这个知识”的信息,并没有获得知识本身的任何一点信息)
零知识证明需要满足三个属性。
1、如果语句为真,诚实的验证者(即:正确遵循协议的验证者)将由诚实的证明者确信这一事实。
2、如果语句为假,不排除有概率欺骗者可以说服诚实的验证者它是真的。
3、如果语句为真,证明者的目的就是向验证者证明并使验证者相信自己知道或拥有某一消息,而在证明过程中不可向验证者泄漏任何有关被证明消息的内容。
我们来看下百度百科给出的例子:
1、A要向B证明自己拥有某个房间的钥匙,假设该房间只能用钥匙打开锁,而其他任何方法都打不开。这时有2个方法:
①A把钥匙出示给B,B用这把钥匙打开该房间的锁,从而证明A拥有该房间的正确的钥匙。②B确定该房间内有某一物体,A用自己拥有的钥匙打开该房间的门,然后把物体拿出来出示给B,从而证明自己确实拥有该房间的钥匙。
后面的②方法就属于零知识证明。它的好处在于,在整个证明的过程中,B始终不能看到钥匙的样子,从而避免了钥匙的泄露。
2、A拥有B的公钥,A没有见过B,而B见过A的照片,偶然一天两个人见面了,B认出了A,但A不能确定面前的人是否是B,这时B要向A证明自己是B,也有2个方法。
① B把自己的私钥给A,A用这个私钥对某个数据加密,然后用B的公钥解密,如果正确,则证明对方确实是B。
② A给出一个随机值,并使用B的公钥对其加密,然后将加密后的数据交给B,B用自己的私钥解密并展示给A,如果与A给出的随机值相同,则证明对方是B。
后面的方法属于零知识证明。
3、有一个缺口环形的长廊,出口和入口距离非常近(在目距之内),但走廊中间某处有一道只能用钥匙打开的门,A要向B证明自己拥有该门的钥匙。采用零知识证明,则B看着A从入口进入走廊,然后又从出口走出走廊,这时B没有得到任何关于这个钥匙的信息,但是完全可以证明A拥有钥匙。
说了这么多例子,零知识证明的优点就是既安全、又有良好的隐私、又减少计算量。
那么区块链中使用零知识证明,就是在整个交易过程中,完全匿名,可以在某些特定场景中保护必要的隐私。