在这个故事中,富翁A和B只知道自己的资产,但是他们成功比较出了谁更加有钱。当然,在这个故事中,我们默认两个富翁符合多方安全计算中的「半诚实模型」,即「参与方会诚实的运行协议,但是他们会根据其它方的输入或者计算的中间结果来推导额外的信息」,换句话说,这两个富翁都是「乐于窥探他人隐私但诚实」的人。
安全模型
在安全多方计算中,根据参与方的可信程度可以建立三种安全模型:
- Real-Ideal Paradigm(理想模型) :在理想模型中,每一个参与方都是可信的,一方将其信息发送给另一方,另一方不会去查看这份信息,只会根据规定计算出结果,并发送给下一方或者所有参与方。
- Semi-Honest Security(半诚实模型) :半诚实模型就是参与方会诚实的运行协议,但是他会根据其它方的输入或者计算的中间结果来推导额外的信息。
- Malicious Security(恶意模型) :恶意模型则可能不会诚实的运行协议,甚至会搞破坏。
在现实世界中,「理性模型」是不存在的,但相比于「恶意模型」,参与方如果真的想获取到同时对自己有用的信息(例如:真的想知道哪个富翁更加有钱),多数情况下符合「半诚实模型」。
接下来的这个故事也默认符合「半诚实模型」。
员工平均工资
你是某公司的员工,觉得自己工资太少,但你每次向老板提出加薪要求的时候,老板总是用「你已经超过公司的平均工资啦」的理由来搪塞你。某天,你想弄清公司员工平均工资到底是多少,但由于公司合同,员工不能向他人透露工资的具体数目,有没有一种既不透露员工的工资,又能算出平均工资的方法呢?你开始思考。
不久,你发现了一种解决办法:

所有的员工围成一圈,每个员工都打造一对公钥E和私钥D,私钥D自己保存,公钥E发给右手边的员工。从员工1开始,员工1想一个大数M,将M与自己的工资X1相加后,使用公钥E2加密后发给员工2;员工2使用私钥D2解密之后,加上自己的工资X2,再使用公钥E3加密后发给员工3,以此类推,最终员工1会收到员工N发来的信息,使用私钥D1解密后,将数据减去大数M,再处以员工总数N,则算出了员工平均工资。
示意图中,黑括号内是员工能看到的信息,可以发现,所有员工除了知道自己的工资,并不知道其他任何人的工资。
上面两个故事是关于「多方安全计算」的,本文的重点「zk」与此有所不同,但他们共享着一些理念,下面是关于「zk」的故事。
阿里巴巴和数独
阿里巴巴和四十大盗在寻宝途中遇到了难题,他们需要完成一个数独游戏才能获得宝藏,阿里巴巴知道数独的答案,而四十大盗不知道,阿里巴巴该如何在不告诉四十大盗答案的情况下,向四十大盗证明自己知道数独的答案呢?(为了让四十大盗不要伤害自己)
聪明的阿里巴巴很快发现了证明方法:

假设黑色是数独的题面,红色是数独的解。阿里巴巴先制作81张数字1 9的卡片,黑色位置数字朝上,红色位置数字朝下,这样四十大盗并不能看到具体的解。阿里巴巴可以让四十大盗选择,是按行、按列还是按格子检验(Verify),假设四十大盗选择按行检验,阿里巴巴将每行的卡片放到一个袋子里,把卡片打乱,然后打开让四十大盗查看数字是否为1 9,这样按行、按列和按格子的检验可以重复进行多次。最后,阿里巴巴可以向四十大盗证明,如果他不知道数独的答案,那么每次都能满足四十大盗检验的概率无限趋向于0,这样阿里巴巴就在不告诉四十大盗数独答案的情况下,向四十大盗证明了自己知道数独的答案。
这个故事就是一个典型的「交互式zk」,也称作「IZK」,阿里巴巴和四十大盗经过多轮的交互,最后阿里巴巴除了向四十大盗证明自己确实知道数独的答案,没有透露一点关于答案的知识,四十大盗到最后依然对数独的答案一无所知。