Zcash series B1: 零知识证明之安全多方计算

零知识证明被认为是Zcash比Bitcoin迈出的一大步,虽然我认为Zcash里还有很多更精妙的设计,但不可否认零知识证明在密码学尤其是区块链中有很大的用武之地。

第一次听到zero-knowledge proof,是姚boss在学术之道的讲座上介绍他1982年提出的百万富翁比财产问题的时候。(以下故事纯属虚构,如有雷同恕不负责)比如说有一次业界大佬们的晚宴,“香港记者”发现最新的中国福布斯富豪榜还没有出来,但又很八卦马云和马化腾哪个财产更多,但很显然冒昧去问,人家非但不肯透露,还会批评她naive。

于是她精心设计了一个游戏环节,请两位富豪来玩。首先基于共同知识,如果以亿美元为单位,两位富豪的财产一定在200-300亿美元的区间范围内,百位数都是2的情况下,只有十位数值得比较,假设分别为i-1、j-1(1≤i,j≤10),游戏按如下流程进行:

  1. 马云选一个公钥(上一篇我们提到过公钥是给对方加密信息,私钥是给自己解密信息),马化腾选取一个随机的大整数x,用马云的公钥加密x得到k。

  2. 马化腾计算k-j并写在纸条里传给马云。

  3. 马云用私钥解密k-j+1, k-j+2, …, k-j+10,再选取一个适当的素数p,计算这10个数字模p的余数。

  4. 这时这10个余数看起来是完全随机的(但是第j个余数应当为x mod p),马云将前i个数不动,后10-i个数加一,一并用纸条传给马化腾。

  5. 马化腾直接去检查第j个数,如果刚好等于x mod p,表明这个数字没有被加一,意味着i≥j,否则i<j。

这个流程(算法)做到了双方既互不透露自己的信息也不让第三方知道,却可以证明两个数之间的大小关系,这也是一个安全多方计算模型。安全多方计算技术在比特币、Enigma等区块链项目中有广泛应用。