零知识证明_交互式_非交互式

1,028 阅读3分钟

今天莫老师讲了零知识证明的相关的概念,首先讲讲零知识证明是用来干什么的,零知识证明是为了解决对象 a 向对象 b 证明自己有某种权限,但又不能泄露对象 a 的任何有用信息。

至于怎么零知识证明呢?请看下面的例子,零知识证明有两种实现方式,一种是交互式验证,还有一种是非交互式验证。

下面我将用 P 表示是示证者,用 V 表示验证者。同时我也会引入一个使用离散对数的场景,便于理解问题。

场景:

已知 y 和 g 求w,因为这是离散对数,所以即使知道 y 和 g ,以目前计算机的能力是算不出来w的。

gw=yg^w=y

假设对象 P 知道 w,但如何向对象 V 证明自己知道 w 呢?

  • P把自己知道的 w 发送给 V,然后等待 V 给自己反馈结果。不可取,原因是:如果 P 真的知道 w,然而 V 可能不知道 w,所以就造成了隐私泄露。
  • 正确做法:可采用交互式非交互式的零知识证明。

1、交互式

(1)首先 P 将自己知道的 w=w0+w1 w=w_0+w_1,拆分有gw0=y0g^{w_0}=y_0gw1=y1g^{w_1}=y_1,,然后把y0y_0y1y_1发送给 V 。

(2)然后V先验证y0y1=y?y_0*y_1 = y?,如不等于可直接判定P不知道w,在作弊。若等于则进行下一步验证。

(3)V 对 P 说,你给我发送一个w0w_0或者w1w_1(这里面是V自己随机挑),我来验证你是否作弊。比如,P给V发了一个w1w_1,然后V就计算gw1=y1g^{w_1}=y_1,是否相等。如果不相等,直接判定 P 在作弊,如果相等,此时还不能判定 P 就知道 w ,因为 有可能 P 凑出了一对w0w_0w1w_1,正好使得gw1=y1g^{w_1}=y_1

(4)上面第(3)步中,P作假并成功骗过 V 的概率为1/21/2,如果第(3)步重复了n次,V都验证P成功,那么 V 受骗的概率是(1/2)n(1/2)^n,所以当 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 的每一位,都计算出wc=w0(1c)+w1(c)w_c=w_0(1-c)+w_1(c),设gwc=gw0(1c)+w1=(y0)1cy1cg^{w_c}=g^{w_0(1-c)+w_1}=(y_0)^{1-c}*y_1^{c}

(3)之后,P计算出每个c对应的wcw_c,并把wcw_cy0y_0,$$y_1$放到集合 S 中。S={w_c, y_0, _y_1|w_c, y_0, _y_1|w_c, y_0, _y_1|……}

(4)然后 V 开始验证每一个对wcw_c,y0 y_0, y1y_1,看是否满足gwc=gw0(1c)+w1=(y0)1cy1cg^{w_c}=g^{w_0(1-c)+w_1}=(y_0)^{1-c}*y_1^{c}

方案2:

相比方案1减少了交互次数,更佳。

首先 P 和 V 共同定义一个哈希函数,例如H

(1)首先 P 随机生成一个y0y_0y1y_1,然后计算出c=H(y0,y1)c=H(y_0, y_1)

(2)然后循环第(1)步,计算 n 个wa=w0(1c)+w1(c)w_a=w_0(1-c)+w_1(c),设gwa=gw0(1c)+w1=(y0)1cy1cg^{w_a}=g^{w_0(1-c)+w_1}=(y_0)^{1-c}*y_1^{c}

(3)之后,把waw_ay0y_0y1y_1放到集合 S 中。S={w_a, y_0, _y_1|w_a, y_0, _y_1|w_a, y_0, _y_1|……}

(4)V 收到 P 发送来的集合 S,然后计算c=H(y0,y1)c=H(y_0, y_1),然后看gwa=(y0)1cy1cg^{w_a}=(y_0)^{1-c}*y_1^{c},是否相等。

总结:

上课的莫老师讲的很透彻,通俗易懂,同时也感谢我的导师给我推荐了这门课,致敬。多听听大佬讲课,真的受益匪浅,要是本科的时候多听听清北的课岂不是要……,亡羊补牢,为时不晚,Just do it!