零知识证明--ZK-SNARKS(六)

195 阅读2分钟

乘法同态

双线性映射

  1. 首先要介绍一下双线性映射的概念:
    • 双线性映射指的是来自两个域的元素映射到第三个域中的一个元素: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)
  2. 假设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).
    • 那么如何解决证明者的这种伪造多项式的问题呢?