zk-SNARKs

对零知识证明的一些整理(未完待续)

1,同态隐藏(Homomorphic Hidings)

  • 给定E(x),很难反推出x的值
  • 若x != y, 则E(x) != E(y)
  • 若已知 E(x)E(y),则可计算出E(x+y)

举例说明同态隐藏在零知识证明中的作用:
假设Alice知道 xy的值使得 x+y=7,利用同态隐藏,Alice可以在不泄露xy具体值的情况下像Bob证明她的确知道xy的值,过程如下:

  • Alice将 E(x)E(y) 发送给Bob
  • Bob通过 E(x)E(y)计算出E(x+y),同时计算一下E(7)
  • Bob检验E(x+y)是否等于E(7)

上面的验证过程保留了Alice的秘密,同时又能让Bob信服,那么问题是,什么样的E(x)才满足我们的期望呢? E(x) = x^2 这种普通的加减乘除的函数肯定不行。。。。

取模运算mod
7 m o d 4 = 3 7 mod4 = 3 7mod4=3,或者 7 ∣ ∣ m o d 4 = 3 7||_{mod4} = 3 7mod4=3有时我们也会把mod写在右边,记为 7 = 3 ( m o d 4 ) 7 = 3 (mod4) 7=3mod4
本文我们统一用第二种。

模p乘方(p为质数,此处取5)
对于整数集合{1…p-1},对集合中任意元素求乘方后取模

x 1 2 3 4
1 x ∥ m o d 5 1^x∥ _{mod5} 1xmod5 1 1 1 1
2 x ∥ m o d 5 2^x∥ _{mod5} 2xmod5 2 4 3 1
3 x ∥ m o d 5 3^x∥ _{mod5} 3xmod5 3 4 3 1
4 x ∥ m o d 5 4^x∥ _{mod5} 4xmod5 4 1 4 1

我们把集合{1…p-1}与在集合上的求乘方后取模合称为 群 Z p Z_p Zp,集合元素有限的群称之为有限群。当p取质数时,群 Z p Z_p Zp会出现一个特征-——循环群,以上表为例, 2 x ∥ m o d 5 2^x∥ _{mod5} 2xmod5 这行,完美生成了集合中的每一个元素,这种群称之为循环群,2称之为这个群的生成元g。利用循环群的特性,我们可以构造一个符合要求的E(x)
E(x) = 2 x ∣ ∣ m o d 5 2^x||_{mod5} 2xmod5
我们检验**E(x)**是否满足同态隐藏的三个条件:

  1. 给定E(x)的值,很难反推x。(当p取5,g取2时当然不难,当p,g很大时,反推非常困难)
  2. 由于循环群的特性,x不同,E(x)也不同
  3. E(x+y) = 2 x + y ∣ ∣ m o d 5 2^{x+y}||_{mod5} 2x+ymod5 = ( 2 x ∣ ∣ m o d 5 ∗ 2 y ∣ ∣ m o d 5 ) ∣ ∣ m o d 5 (2^x||_{mod5} * 2^y||_{mod5})||_{mod5} (2xmod52ymod5)mod5 = E ( x ) ∗ E ( y ) ∣ ∣ m o d 5 E(x)*E(y)||_{mod5} E(x)E(y)mod5
    故上述E(x)能满足同态隐藏的特性。

此处假设Alice要想Bob证明她拥有x+y=4这个问题的答案(例如x=3, y=1), 不想泄露xy的具体值。于是可以这么干:

  • Alice将E(3) 的值3、E(1) 的值2发送给Bob
  • Bob计算E(x+y) = 3 ∗ 2 ∣ ∣ m o d 5 = 1 =3*2||_{mod5}=1 =32mod5=1
  • Bob计算E(4)的值, = 1,
  • 经过比较,Bob确信Alice确实知道x+y=4的答案。此过程中,Bob并不知道x,y的具体值,达到了隐藏的目的。

2,多项式盲计算

接下来,我们把要证明的问题变复杂点,假设Alice知道多项式 P ( x ) = a 0 + a 1 x + a 2 x 2 . . . a d x d P(x)=a_0+a_1x+a_2x^2...a_dx^d P(x)=a0+a1x+a2x2...adxd的系数,她要向Bob证明她有这样一组系数{ a 0 , a 1 , . . . a d a_0,a_1,...a_d a0,a1,...ad},同时不泄露各项系数。我们假设Alice手中的 P ( x ) = 1 + 2 x + 3 x 2 P(x)=1+2x+3x^2 P(x)=1+2x+3x2 E ( x ) = 2 x ∣ ∣ m o d 5 E(x)=2^x||_{mod5} E(x)=2xmod5, p = 5 p=5 p=5
那么问题来了,Alice如何证明自己呢?
我们先看这个问题比上面的x+y=4难在哪里

  • 前者是个等式,且右边是个已知的常量
  • 后者是个多项式
  • 假如Bob取一个验证点,例如令x=2, 发给Alice,Alice计算 P ( 2 ) = 1 + 4 + 12 = 17 P(2)=1+4+12=17 P(2)=1+4+12=17,然后将17发送给Bob,此时Bob并无从验证17是否是正确的。另外Bob也不想直接把x=2发给Alice——他更想让Alice在不知道x的取值的情况下,证明自己知道多项式的系数。

首先,Bob的想隐藏x=2这一点是容易实现的——再用一次同态隐藏即可:
E ( a + b x + c x 2 ) = 2 a + b x + c x 2 ∣ ∣ m o d 5 = E ( a ) ∗ E ( x ) b ∗ E ( x 2 ) c ∣ ∣ m o d 5 E(a+bx+cx^2)=2^{a+bx+cx^2}||_{mod5}=E(a)*E(x)^b*E(x^2)^c||_{mod5} E(a+bx+cx2)=2a+bx+cx2mod5=E(a)E(x)bE(x2)cmod5
于是,Bob仅需将 E ( x ) E(x) E(x) E ( x 2 ) E(x^2) E(x2)在x=2时的值发给Alice即可做到隐藏x=2的目的,同时又不影响Alice的证明。
E ( x ) = 2 2 ∣ ∣ m o d 5 = 4 E(x)=2^2||_{mod5}=4 E(x)=22mod5=4 E ( x 2 ) = 2 4 ∣ ∣ m o d 5 = 1 E(x^2)=2^4||_{mod5}=1 E(x2)=24mod5=1
Alice拿到上述两个值,带入计算 E ( P ( x ) ) = 2 1 + 2 x + 3 x 2 ∣ ∣ m o d 5 = E ( 1 ) ∗ E ( x ) 2 ∗ E ( x 2 ) 3 ∣ ∣ m o d 5 E(P(x))=2^{1+2x+3x^2}||_{mod5}=E(1)*E(x)^2*E(x^2)^3||_{mod5} E(P(x))=21+2x+3x2mod5=E(1)E(x)2E(x2)3mod5

E ( P ( x ) ) = 2 ∗ 16 ∗ 1 ∣ ∣ m o d 5 = 2 E(P(x))=2*16*1||_{mod5}=2 E(P(x))=2161mod5=2
最大的问题在于,当Alice计算出结果发送给Bob之后,Bob该如何验证呢?假如Bob知道 P ( x ) = 1 + 2 x + 3 x 2 P(x)=1+2x+3x^2 P(x)=1+2x+3x2,那验证是比较简单的 E ( P ( 2 ) ) = E ( 17 ) = 2 E(P(2))=E(17)=2 E(P(2))=E(17)=2
但是,Bob不知道P(x),他该怎么去验证呢…

这个问题分两部分
zk-SNARKs最精彩的部分来了!!!!!

3,系数知识假设(KCA)

你可能感兴趣的:(BlockChain,密码学,区块链,零知识证明)