乘法同态
双线性映射
- 首先要介绍一下双线性映射的概念:
- 双线性映射指的是来自两个域的元素映射到第三个域中的一个元素:e(x,y)→z,同时在x,y这两个输入上都具备线性,如下所示:
- e(P+R,Q)=e(P,Q)+e(R,Q)
- e(P,Q+S)=e(P,Q)+e(P,S)
- 双线性映射指的是来自两个域的元素映射到第三个域中的一个元素:e(x,y)→z,同时在x,y这两个输入上都具备线性,如下所示:
- 假设x=ab=cd,那么存在两个加法同态映射E1和E2,以及双线性映射e,使得以下等式总是成立:
-
e( E1(a), E2(b) ) = e( E1(c ), E2(d) ) = X
-
此时x->X的映射也是加法同态映射,证明如下:
- E(ax1+bx2)
- =e( E1(ax1+bx2),E2(1) )
- =e( aE1(x1)+bE1(x2),E2(1) )
- =ae( E1(x1),E2(1) )+be( E1(x2),E2(1) )
- =aE(x1)+bE(x2)
-
简单来说,就是我们可以找到一种映射E,使得E(xy)=e(E1(x),E2(y)),加入乘法同态之后,整个过程如下:
- 验证者向证明者发送一系列指数的两种映射值,也就是E1(t^n)和E2(t^n)
- 证明者再计算一些数值发送给验证者,由# 零知识证明--ZK-SNARKS(四)可知,需要判定的公式为P(n) =H(n)*Z(n)= s.C(n) - s.A(n) * s.B(n) , 即根据 A(t),C(t)和H(t) ,可以求出E1[A(t)],E1[C(t)],E1[H(t)]。根据B(t),Z(t)可以计算出E2[B(t)],E2[Z(t)],
- 如何确定哪个取E1哪个取E2呢?
- 由于式中存在H(n)*Z(n)和A(n) * B(n),所以当H(n)和A(n)取E1时,那么Z(n)和B(n)就取E2。
-
此时验证者进行验证,依据上面提到的同态乘法可以得出:
- E{ e[ E1(C(t) ) ,E2(1) } = E { C(t) };
- E{ e[ E1(A(t)) , E2(B(t))] } = E { A(t) * B(t) };
- E{ e[ E1(H(t)) , E2(Z(t))] } = E { H(t) * Z(t) };
-
此时,验证者就可以进行以下验证:
- E{P(t)}
- = E {C(t) - A(t) * B(t)}
- = E { C(t) } - E { A(t) * B(t) }
- = E{ e[E1(C(t)),E2(1)] } - E{ e[E1(A(t)),E2(B(t))] }
- ?= E{ e[E1(H(t)),E2(Z(t))] }
- = E { H(t) * Z(t) }
-
但是此算法加入同态隐藏还会出现问题吗?
- 会的!!因为证明者可以可以伪造P(n)和H(n),即证明者可以伪造A(n),B(n)和C(n)来构建P(n).
-
那么如何解决证明者的这种伪造多项式的问题呢?
- 解决方法就是KCA。零知识证明--ZK-SNARKS(七)中,我们将会进行详细介绍
-