今天莫老师讲了零知识证明的相关的概念,首先讲讲零知识证明是用来干什么的,零知识证明是为了解决对象 a 向对象 b 证明自己有某种权限,但又不能泄露对象 a 的任何有用信息。
至于怎么零知识证明呢?请看下面的例子,零知识证明有两种实现方式,一种是交互式验证,还有一种是非交互式验证。
下面我将用 P 表示是示证者,用 V 表示验证者。同时我也会引入一个使用离散对数的场景,便于理解问题。
场景:
已知 y 和 g 求w,因为这是离散对数,所以即使知道 y 和 g ,以目前计算机的能力是算不出来w的。
假设对象 P 知道 w,但如何向对象 V 证明自己知道 w 呢?
- P把自己知道的 w 发送给 V,然后等待 V 给自己反馈结果。不可取,原因是:如果 P 真的知道 w,然而 V 可能不知道 w,所以就造成了隐私泄露。
- 正确做法:可采用交互式和非交互式的零知识证明。
1、交互式
(1)首先 P 将自己知道的 ,拆分有和,,然后把和发送给 V 。
(2)然后V先验证,如不等于可直接判定P不知道w,在作弊。若等于则进行下一步验证。
(3)V 对 P 说,你给我发送一个或者(这里面是V自己随机挑),我来验证你是否作弊。比如,P给V发了一个,然后V就计算,是否相等。如果不相等,直接判定 P 在作弊,如果相等,此时还不能判定 P 就知道 w ,因为 有可能 P 凑出了一对和,正好使得。
(4)上面第(3)步中,P作假并成功骗过 V 的概率为,如果第(3)步重复了n次,V都验证P成功,那么 V 受骗的概率是,所以当 n 足够大的时候,受骗概率接近于0,此时我们就可认为 P 是真的知道w。
感觉怎么样?经过上面的流程,P 既向 V 证明了自己有 w,有没有向 V 泄露任何有用的信息,是不是很牛呢!
但是还有一个问题就是,上面的 n 如果很大的话,就显得很繁琐,如果 P 只给 V 发送一次验证数据,就可证明自己有 w 的话,就很方便了。那怎么实现呢?请看下面要介绍的非交互式证明。
2、非交互式
方案1:
(1)首先 V 给 P 发送一个数字 C ,C由01组成的一个序列(例如:010111010110001101),下面用 c 表示 C 中的一位。
(2)后 P 对数字 c 的每一位,都计算出,设
(3)之后,P计算出每个c对应的,并把,,$$y_1$放到集合 S 中。S={w_c, y_0, _y_1|w_c, y_0, _y_1|w_c, y_0, _y_1|……}
(4)然后 V 开始验证每一个对,, ,看是否满足。
方案2:
相比方案1减少了交互次数,更佳。
首先 P 和 V 共同定义一个哈希函数,例如H
(1)首先 P 随机生成一个和,然后计算出。
(2)然后循环第(1)步,计算 n 个,设
(3)之后,把,,放到集合 S 中。S={w_a, y_0, _y_1|w_a, y_0, _y_1|w_a, y_0, _y_1|……}
(4)V 收到 P 发送来的集合 S,然后计算,然后看,是否相等。
总结:
上课的莫老师讲的很透彻,通俗易懂,同时也感谢我的导师给我推荐了这门课,致敬。多听听大佬讲课,真的受益匪浅,要是本科的时候多听听清北的课岂不是要……,亡羊补牢,为时不晚,Just do it!