zkSNARK-密码学基础
本节主要讲解zkSNARK涉及到的密码学知识。因为上一部分介绍的,证明者知道一些值,可能会恶意伪造证明。所以我们需要考虑在不破坏协议的前提下,对某些值能够进行模糊计算操作。
同态加密
同态加密的目的允许对一个值进行加密,并能够对这种加密进行算术运算。实现加密同态性的方法有很多种,我们将简要介绍一种简单的方法。
这里我们选一个基数去加密我们设计的明文,例如,我们设基数为5,去加密一个数字5: 5 3 = 125 5^3 = 125 53=125,因此,125就是明文3加密的结果。
模运算:a mod b:设 a , b ∈ Z a,b \in \mathbb{Z} a,b∈Z且 b > 0 b>0 b>0,如果 q , r ∈ Z q,r \in \mathbb{Z} q,r∈Z满足 a = q b + r a=qb+r a=qb+r,且 0 ≤ r < b 0 \le r<b 0≤r<b,则定义:a mod b := r.
小例子:日常我们生活时钟,17点对应的几点? 17 mod 12 =5 对应下午5点 生活中还能找到许多小例子
我们将同态加密和模运算结合。例如;
5 1 = 5 ( m o d 7 ) 5 2 = 4 ( m o d 7 ) 5 3 = 6 ( m o d 7 ) 5^1=5(mod \,7) \quad 5^2=4(mod \,7) \quad 5^3=6(mod \,7) 51=5(mod7)52=4(mod7)53=6(mod7)
不同指数但有相同结果:
5 5 = 3 ( m o d 7 ) 5 11 = 3 ( m o d 7 ) 5 17 = 3 ( m o d 7 ) 5^5=3(mod \,7) \quad 5^{11}=3(mod \,7) \quad 5^{17}=3(mod \,7) 55=3(mod7)511=3(mod7)517=3(mod7)
因此我们可以联想的离散对数难题,如果给你一个密文,以及一个基元,很难找到对应的明文。大部分现在密码学都是基于离散对数难题来进行构造。该方案的所有同态性质都保留在模域内:
e n c r y p t i o n : 5 3 = 6 ( m o d 7 ) m u l t i p l i c a t i o n : 6 2 = ( 5 3 ) 2 = 5 6 = 1 ( m o d 7 ) a d d i t i o n : 5 3 × 5 2 = 5 5 = 3 ( m o d 7 ) encryption: \quad 5^3 = 6(mod\,7)\\ multiplication: \quad 6^2=(5^3)^2 = 5^6=1(mod\,7)\\ addition: \quad 5^3 \times 5^2 = 5^5 = 3(mod\,7) encryption:53=6(mod7)multiplication:62=(53)2=56=1(mod7)addition:53×52=55=3(mod7)
本文中,我们声明加密函数: E ( v ) = g v ( m o d n ) E(v)=g^v(mod \ n) E(v)=gv(mod n),其中表示我们想要加密的值。
加密多项式
结合上述同态加密,我们现在可以用一个随机值x去加密计算多项式,并相应地修改零知识协议。
假设多项式方程为 p ( x ) = x 3 − 3 x + 2 x p(x) = x^3-3x+2x p(x)=x3−3x+2x,我们可以确定该多项式的系数分别为:1,-3,2。因为同态加密并不允许对一个加密的值取幂,所以我们连同需要加密值的幂次一起加密,分别为: E ( x ) , E ( x 2 ) , E ( x 3 ) E(x),E(x^2),E(x^3) E(x),E(x2),E(x3),所以我们计算加密的多项式如下:
E ( x 3 ) 1 ⋅ E ( x 2 ) − 3 ⋅ E ( x ) 2 = ( g x 3 ) 1 ⋅ ( g x 2 ) − 3 ⋅ ( g x ) 2 = g 1 x 3 ⋅ g − 3 x 2 ⋅ g 2 x = g x 3 − 3 x 2 + 2 x E(x^3)^1 \cdot E(x^2)^{-3} \cdot E(x)^2=(g^{x^3})^1 \cdot(g^{x^2})^{-3} \cdot (g^x)^2=\\ g^{1x^3} \cdot g^{-3x^2} \cdot g^{2x}=g^{x^3-3x^2+2x} E(x3)1⋅E(x2)−3⋅E(x)2=(gx3)1⋅(gx2)−3⋅(gx)2=g1x3⋅g−3x2⋅g2x=gx3−3x2+2x
通过这样的运算,我们得到了多项式在未知 x x x处的加密求值。这是一个非常强大的机制,而且由于同态性,同一个多项式在加密空间中的加密求值总是相同的。
现在我们更新我们前面介绍的协议版本,对于幂次为 d d d的多项式:
- 验证者
- 抽取一个随机值 s s