零知识证明(Zero Knowledge Proof)
零知识证明是指证明者在不向验证者提供任何有用信息的情况下,使得验证证相信某个论断是正确的。
零知识证明的三个性质
一种零知识证明的方法需要具备如下三个性质:
完备性(Completeness):若证明方确实掌握了某论断的答案,则他肯定能找到方法向验证方证明他手中掌握数据的正确性,即真的假不了。
可靠性(Soundness):若证明方根本不掌握某论断的答案,则他无法(或者 概率极低)说服验证方他手中数据的正确性,即假的真不了。
零知识性(Zero-knowlegeness):验证方除了能判断出论断的真假外,无法获得其它任何有效信息。
零知识证明构造三段论
- 证明方先根据论断内容向验证方发个交底材料,这个样例论断需要是随机的或加密的;
- 这个样例论断需要是随机的或加密的验证方随机生成一个试探(学术名词是挑战,challenge),发给证明方;
- 证明方根据该试探和交底材料生成证明信息发给验证方。验证方自己将信息和交底材料一合计,判断证明方是否通过了该试探。
示例
例1:数独问题
- 背景:一个骨灰级数独题,数字范围是1-9
- 论断:证明方有该数独题的答案
- 过程:
- 证明方将数独题答案的每个数字(连同题面上的数字)写在一张卡片上,然后将每张卡片放到数独中对应的位置,同时将答案卡片翻面(题面数字对应的卡片依然朝上);
- 验证方首先验证题面数字和朝上的卡片的数字一致,然后随意指定一行(或列);
- 证明方将该行(或列)的卡片收拢并打乱,然后全部展示给验证方。验证方验证是否数字正好为1-9。
这里第一步的交底材料是非常必要的,它有两个作用:
一是可以防止证明方根据试探的内容临时造假;
二是可以帮助证明方掩盖敏感信息,保证证明过程的零知识性。
第二步的试探也必须是随机的,否则如果证明方能提前知道试探的内容,
那即便他不知道原论断背后的答案他也能提前准备好交底材料和返回的信息。
最后,这个过程必须重复多次,因为通过一次或少数试探可能是运气,但如果一直能通过,则说明是实力了。
例2:离散对数问题(参考论文[1])
- 背景:函数 $f(x)=g^{x}$ ,其中 $g$ 为公开大整数。
- 论断:给定一个数字 $y$ ,证明方证明他知道离散对数 $\log _{g}y$ ,即 $y=f(x)$ 。
- 过程:
- 证明方生成一个随机数 $u$ ,并计算 $v=f(u)$ ,然后将 $v$ 发给验证方;
- 验证方生成一个随机数 $e$ ,并发给证明方;
- 证明方计算 $t=e+u$ ,并将 $t$ 发送给验证方。验证方验证 $f(t)=v \cdot y^{e}$ .