ZK证明
两方面判断协议是否是zk,第一是「零知识」,第二是「证明可靠」,即不能随便一个没知识的证明者也能完成证明过程。换句话说,判断是否zk,需要「对证明者安全」、「对验证者可靠」。
对证明者安全
先证明zk「对证明者安全」,以上文「阿里巴巴和三染色」为例,下图中变换了称呼,阿里巴巴变成了Alice,四十大盗变成了Bob,但他们交互的过程不变,希望不会引起误解。
「零知识」是为了保护证明者Alice利益的,因为Alice不希望透露任何信息给Bob。「零知识」的证明方法是通过「模拟器」,如果使用「模拟器」能够模拟出一个Zlice,Zlice没有任何信息,但是依然能够说服Bob,则说明Zlice所在的模拟世界是「零知识」的,又因为如果我们把Bob放入世界里,Bob没有办法区分自己是在现实世界还是在模拟世界,所以在现实世界里,协议也是「零知识」的,即对「证明者安全」。
以上图为例,模拟器模拟了一个Zlice,Zlice没有掌握任何知识,那么它是如何骗过Bob的呢?
Zlice在进行到step 3时,它并没有揭露涂色方案,而是通过虚拟机的「快照机制」,记录了Bob的选择,并重新返回了step 1,由于Bob目前是在虚拟机内运行的程序,所以它并没有感知到「快照机制」的启动(在现实世界的程序才能感知到快照的启动),在模拟的世界中,零知识的Zlice成功骗过了Bob,让Bob以为Zlice掌握了知识,而正如之前所说:Bob没有办法区分现实世界和模拟世界,所以在现实世界,协议也是「零知识」。
这里还有个疑惑,如果模拟器真的存在,对Bob来说岂不是一个灾难?有没有可能在现实世界里,Alice没有知识也能用这个模拟的方法骗到Bob?这是不可能的,因为虽然模拟世界和现实世界对Bob来说是不可区分的,但是模拟世界的Zlice需要使用「超能力」,例如虚拟机快照机制的「时间倒流」才能够骗到Bob选择相同的边,而这种「超能力」是现实世界的Alice所不具备的(毕竟没有人可以倒流现实中的时间)。
模拟器的「超能力」是有限的,例如它不能够改变Bob的内部状态,不能说Bob输出的False,模拟器强行改成了True,因为如果这样Bob就很容易确定自己处在模拟世界中!就像各类「缸中之脑」的科幻电影,如果人类发现了世界是模拟的,那模拟世界就崩塌了。模拟器的「超能力」被严格限制在现实中的「虚拟机」的能力范围。
对验证者可靠
虽然在现实世界中,Alice没有「时间倒流」超能力,但是这并不能说明Alice就有知识,谁来保证验证者Bob的利益呢?
「证明可靠」是为了保护验证者Bob利益的,因为Bob不希望被没有知识的Alice欺骗。「证明可靠」的证明方法同样是通过「模拟器」,如果使用「模拟器」能够模拟出一个Zlice,Zlice能够提取出Alice的知识,则说明Zlice所在的模拟世界是「证明可靠」的,又因为如果我们把Alice放入世界里,Alice没有办法区分自己是在现实世界还是在模拟世界,所以在现实世界里,协议也是「证明可靠」的,即对「验证者可靠」。
下图使用的是Schnorr协议,该协议使用了椭圆曲线加密算法,由于篇幅原因这里不展开。简单理解下,a是密钥,a*G是公钥,根据密钥a和椭圆曲线基点G可以轻松算出公钥a*G,反之则不能(因为离散对数问题,这里用大数分解问题来帮助理解,给两个质数很容易算出他们乘积,但给一个大数,很难分解成两个质数)。
Schnorr协议共分以下四步:
- Alice生成随机数r,根据椭圆曲线基点G,计算R=r*G,将R发送给Bob;
- Bob生成随机数c(称作挑战challenge),将c发送给