何为零知识证明?
零知识证明,指的是示证者向验证者表明他知道某种秘密,不仅能使验证者完全确信他的确知道这个秘密,同时还保证一丁点秘密也不泄露给验证者。
童话里的零知识证明
举个最简单的阿拉伯童话《一千零一夜》里的零知识证明:阿里巴巴与四十大盗的故事其中一个片段。
阿里巴巴会芝麻开门的咒语,强盗向他拷问打开山洞石门的咒语,他不想让人听到咒语,便对强盗说:「你们离我一箭之地,用弓箭指着我,你们举起右手,我念咒语打开石门,举起左手,我念咒语关上石门,如果我做不到或逃跑,你们就用弓箭射死我。」
这个方案对阿里巴巴没损失,也能帮助他们搞清楚阿里巴巴到底是否知道咒语,于是强盗们同意。强盗举起了右手,只见阿里巴巴的嘴动了几下,石门打开了;强盗举起了左手,阿里巴巴的嘴动了几下,石门又关上了。强盗有点不信,没准这是巧合,多试几次过后,他们相信了阿里巴巴。
零知识证明的优点
- 在使用零知识证明的时候,不降低安全性。
- 零知识证明工作高效,计算过程量小,双方交换信息少。
- 既安全、又有良好的隐私、又减少计算量。
零知识证明的性质
根据零知识证明的定义和有关例子,可以得出零知识证明具有以下三个性质:
- 完备性(completeness):如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。
- 合理性(soundness):没有人能够假冒证明方,使这个证明成功。
- 零知识性(zero-knowledge):证明过程执行完之后,验证方只获得了「证明方拥有这个知识」的信息,而没有获得关于这个知识本身的任何信息。
零知识证明的优点
- 随着零知识证明的使用,安全性不会降级,因为该证明具有零知识性质。
- 高效性。该过程计算量小,双方交换的信息量少。
- 安全性依赖于未解决的数学难题,如离散对数、大整数因子分解、平方根等。
- 许多零知识证明相关的技术避免了直接使用有政府限制的加密算法,为相关产品的出口带去优势。
证明举例
例 1:A 要向 B 证明自己拥有某个房间的钥匙,假设该房间只能用钥匙打开锁,而其他任何方法都打不开。有两个方法:
- A 把钥匙出示给 B,B 用这把钥匙打开该房间的锁,从而证明 A 拥有该房间的正确的钥匙。
- B 确定该房间内有某一物体,A 用自己拥有的钥匙打开该房间的门,然后把物体拿出来出示给 B,从而证明自己确实拥有该房间的钥匙。
后面的方法 2 属于零知识证明。好处在于在整个证明的过程中,B 始终不能看到钥匙的样子,从而避免了钥匙的泄露。
例 2:A 拥有 B 的公钥,A 没有见过 B,而 B 见过 A 的照片,某天二人偶然碰面,B 认出了 A,但 A 不能确定面前的人是否是 B,这时 B 要向 A 证明自己是 B,也有两个方法:
- B 把自己的私钥给 A,A 用这个私钥对某个数据加密,然后用 B 的公钥解密,如果正确,则证明对方确实是 B。
- A 给出一个随机值,B 用自己的私钥对其加密,然后把加密后的数据交给 A,A 用 B 的公钥解密,如果能够得到原来的随机值,则证明对方是 B。
后面的方法属于零知识证明。
有一个缺口环形的长廊,出口和入口距离非常近(在目距之内),但走廊中间某处有一道只能用钥匙打开的门,A 要向 B 证明自己拥有该门的钥匙。采用零知识证明,则 B 看着 A 从入口进入走廊,然后又从出口走出走廊,这时 B 没有得到任何关于这个钥匙的信息,但是完全可以证明 A 拥有钥匙。
零知识证明一般的过程
假设有两方人,甲方是证明者,乙方是验证者。他们在一个工作环境内有相同的一组函数和一组数值。证明开始:
- 甲方先发送满足条件的随机值给乙方,这个称为承诺。
- 乙方发送满足条件的随机值给甲方,这个称为挑战。
- 甲方执行一个不让乙方知道的计算,并把计算结果给乙方,这个称为响应。
- 乙方对响应进行验证,验证失败就退出,验证成功回到 1,然后继续顺序执行 n 次。
如果每一次乙方验证都是成功的,那么乙方就相信了和甲方之间的共识。在整个过程中没有透露任何相关秘密信息。
References
https://www.jianshu.com/p/3f524c925c34
https://blog.csdn.net/liudongdong19/article/details/82884742