零知识证明学习(四)— zkSNARKs(引入密码学)

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,bZ b > 0 b>0 b>0,如果 q , r ∈ Z q,r \in \mathbb{Z} q,rZ满足 a = q b + r a=qb+r a=qb+r,且 0 ≤ r < b 0 \le r<b 0r<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)=x33x+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)1E(x2)3E(x)2=(gx3)1(gx2)3(gx)2=g1x3g3x2g2x=gx33x2+2x
通过这样的运算,我们得到了多项式在未知 x x x处的加密求值。这是一个非常强大的机制,而且由于同态性,同一个多项式在加密空间中的加密求值总是相同的。

现在我们更新我们前面介绍的协议版本,对于幂次为 d d d的多项式:

  • 验证者
    • 抽取一个随机值 s s s,例如,密钥
    • 对于 s s s计算所有幂次 i i i的加密值,其中 i ∈ [ 0 , . . . , d ] i \in [0,...,d] i[0,...,d],例如 E ( s i ) = g s i E(s^i)=g^{s^i} E(si)=gsi
    • 计算未加密的目标多项式 t ( s ) t(s) t(s)
    • 将已经加密的 s s s的幂次多项式发送给证明者: E ( s 0 ) , E ( s 1 ) , . . . , E ( s d ) E(s^0),E(s^1),...,E(s^d) E(s0),E(s1),...,E(sd)
  • 证明者
    • 计算多项式 h ( x ) = p ( x ) t ( x ) h(x) = \frac{p(x)}{t(x)} h(x)=t(x)p(x)
    • 使用加密的多项式 g s 0 , g s 1 , . . . , g s d g^{s^0},g^{s^1},...,g^{s^d} gs0,gs1,...,gsd和系数 c 0 , c 1 , . . . , c n c_0,c_1,...,c_n c0,c1,...,cn,计算 E ( p ( s ) ) = g p ( s ) = ( g s d ) c d . . . ( g s 1 ) c 1 ⋅ ( g s 0 ) c 0 E(p(s))=g^{p(s)}=(g^{s^d})^{c_d}...(g^{s^1})^{c_1} \cdot (g^{s^0})^{c_0} E(p(s))=gp(s)=(gsd)cd...(gs1)c1(gs0)c0 E ( h ( s ) ) = g h ( s ) E(h(s))=g^{h(s)} E(h(s))=gh(s)
    • 证明者将 g p 和 g h g^p和g^h gpgh发送给验证者
  • 验证者
    • 验证者在加密的情况下检查 p = t ( s ) ⋅ h p=t(s) \cdot h p=t(s)h g p = ( g h ) t ( s ) ⟹ g p = g t ( s ) ⋅ h g^p = (g^h)^{t(s)} \Longrightarrow g^p = g^{t(s) \cdot h} gp=(gh)t(s)gp=gt(s)h

在这里,证明者是不知道关于 s s s​的任何信息的。虽然在这样的协议中证明者的能力是有限的,他仍然可以使用任何其他手段伪造证明没有实际使用提供加密的多项式,例如,如果证明者声称有一个令人满意的多项式只使用 s 3 s^3 s3 s 1 s^1 s1两个多项式,显然这是不可能验证当前协议。

限制一个多项式

一个多项式的知识就是这个它的系数 c 0 , c 1 , . . . , c i c_0,c_1,...,c_i c0,c1,...,ci,以及在该协议中我们将这些系数对以及加密的 s s s的项用系数再求幂,例如: E ( s i ) c i = g c i ⋅ s i E(s^i)^{c_i}=g^{c_i \cdot s^i} E(si)ci=gcisi。我们已经在 s s s的加密指数的选择上限制了证明者,但是这样的限制不是强制的,有一种可能存在找到一些任意值 z p , z h z_p,z_h zp,zh,满足等式 z p = ( z h ) t ( s ) z_p = (z_h)^{t(s)} zp=(zh)t(s),将他们发送给验证者,代替 g p , g h g^p,g^h gp,gh。例如:对于随机数 r r r z h = g r , z p = ( g t ( s ) ) r z_h =g^r,z_p=(g^{t(s)})^r zh=gr,zp=(gt(s))r,其中 g t ( s ) g^{t(s)} gt(s)是提供加密 s s s的指数项。显然存在这种威胁,这就是为什么验证者需要证明仅仅由自身提供的加密 s s s的指数项用于计算 g p , g h g^p,g^h gp,gh,而不是其他。

让我们考虑一个幂次为1的多项式 f ( x ) = c ⋅ x f(x)=c \cdot x f(x)=cx,对应 s s s项的加密值为 E ( s ) = g s E(s)=g^s E(s)=gs。我们可以确定仅仅有一个加密项,同态性乘以系数 c c c,结果为 ( g s ) c (g^s)^c (gs)c​。有一种方法是要求对另一个移位的加密值和原始值执行相同的操作,作为校验和的算术类比,确保结果是对原始值的求幂。

  • Alice有一个值 a a a,她要求Bob可以取任意次方,但唯一要求只有 a a a可以取幂,而不是其它:

    • 选择一个随机数 α \alpha α
    • 计算 a ′ = a α ( m o d   n ) a' = a^{\alpha} (mod \ n) a=aα(mod n)
    • 向Bob提供一个元组 ( a , a ′ ) (a,a') (a,a),要求对每个值执行相同的任意求幂,并使用结果元组 ( b , b ′ ) (b,b') (b,b)进行回复。例如: b α = b ′ ( m o d   n ) b^{\alpha}=b'(mod \ n) bα=b(mod n)
  • 因为Bob不能从元组 ( a , a ′ ) (a,a') (a,a)抽取 α \alpha α,Bob通过以下操作进行有效回应:

    • 选择一个值 c c c
    • 计算 b = ( a ) c ( m o d   n ) b=(a)^c(mod \ n) b=(a)c(mod n) b ′ = ( a ′ ) c ( m o d   n ) b' = (a')^c(mod \ n) b=(a)c(mod n)
    • 向Alice发送元组 ( b , b ′ ) (b,b') (b,b)
  • Alice收到后进行验证:

    • ( b ) α = b ′ ( a c ) α = ( a ′ ) c a c ⋅ α = ( a α ) c (b)^{\alpha}=b' \quad (a^c)^{\alpha} = (a')^c \quad a^{c \cdot \alpha}=(a^{\alpha})^c (b)α=b(ac)α=(a)cacα=(aα)c
  • 结论

    • Bob对元组的两个值应用了相同的指数(即c)

    • Bob能够适用Alice的元组并保留了 α \alpha α的关系

    • Bob知道指数c,因为使用同一个指数才会产生一个有效元组 ( b . b ′ ) (b.b') (b.b)

    • Alice不知道c,Bob也不知道 α \alpha α

    最终,该协议向Alice提供了一个证明,Bob确实用他知道的某个值对a求幂,而他不能做任何其他操作,例如乘法、加法,因为这会消除α-移位关系.

在同态加密背景下,求幂是加密值的乘法。我们可以将同样的结构应用到简单的一系数多项式中 f ( x ) = c ⋅ x : f(x)=c \cdot x: f(x)=cx:

  • 验证者选择一个随机数 s , α s,\alpha s,α和提供计算幂次为1的偏移: ( g s , g α ⋅ s ) (g^s,g^{\alpha \cdot s}) (gs,gαs)
  • 证明者应用一个系数 c c c ( ( g s ) c , ( g α ⋅ s ) c ) = ( g c ⋅ s , g α ⋅ c ⋅ s ) ((g^s)^c,(g^{\alpha \cdot s})^c)=(g^{c \cdot s},g^{\alpha \cdot c \cdot s}) ((gs)c,(gαs)c)=(gcs,gαcs)
  • 验证者验证: ( g c ⋅ s ) α = g α ⋅ c ⋅ s (g^{c \cdot s})^{\alpha}=g^{\alpha \cdot c \cdot s} (gcs)α=gαcs

像这种构造,限制了证明者仅仅使用由验证者提供的加密 s s s的项,因此证明者只能选择多项式的系数 c c c,计算发送给验证者。我们帮将这种一次多项式的方法扩展的多项式中,因为每一项使用同态加法合并在一起。因此,如果证明者给s的幂次加密以及它们的移位值,他可以计算原始多项式和移位多项式,其中必须保持相同的检查。特别是对于d次多项式:

  • 验证者提供加密的项 g s 0 , g s 1 , . . . , g s d g^{s^0},g^{s^1},...,g^{s^d} gs0,gs1,...,gsd和偏移项 g α ⋅ s 0 , g α ⋅ s 1 , . . . , g α ⋅ s d g^{\alpha \cdot s^0},g^{\alpha \cdot s^1},...,g^{\alpha \cdot s^d} gαs0,gαs1,...,gαsd
  • 证明者
    • 使用提供的幂函数s计算加密多项式: g p ( s ) = ( g s 0 ) c 0 ⋅ ( g s 1 ) c 1 ⋅ . . . ⋅ ( g s d ) c d = g c 0 s 0 + c 1 s 1 + . . . + c d s d g^{p(s)}=(g^{s^0})^{c_0} \cdot (g^{s^1})^{c_1} \cdot ... \cdot (g^{s^d})^{c_d}=g^{c_0s^0+c_1s^1+...+c_ds^d} gp(s)=(gs0)c0(gs1)c1...(gsd)cd=gc0s0+c1s1+...+cdsd
    • 用s的幂对应的α-移位来计算加密的“移位”多项式: g α p ( s ) = ( g α s 0 ) c 0 ⋅ ( g α s 1 ) c 1 ⋅ . . . ⋅ ( g α s d ) c d = g c 0 α s 0 + c 1 α s 1 + . . . + c d α s d = g α ( c 0 s 0 + c 1 s 1 + . . . + c d s d ) g^{\alpha p(s)}=(g^{\alpha s^0})^{c_0} \cdot (g^{\alpha s^1})^{c_1} \cdot ...\cdot (g^{\alpha s^d})^{c_d}=g^{c_0\alpha s^0+c_1\alpha s^1+...+c_d\alpha s^d}=g^{\alpha(c_0s^0+c_1s^1+...+c_ds^d)} gαp(s)=(gαs0)c0(gαs1)c1...(gαsd)cd=gc0αs0+c1αs1+...+cdαsd=gα(c0s0+c1s1+...+cdsd)
    • g p , g p ′ g^p,g^{p'} gp,gp发送给验证者
  • 验证者检验: ( g p ) α = g p ′ (g^p)^{\alpha}=g^{p'} (gp)α=gp

对于我们先前的举得多项式: p ( x ) = x 3 − 3 x 2 + 2 x p(x)=x^3-3x^2+2x p(x)=x33x2+2x执行以下步骤:

  • 验证者提供 E ( s 3 ) , E ( s 2 ) , E ( s ) E(s^3),E(s^2),E(s) E(s3),E(s2),E(s),和它的偏移 E ( α s 3 ) , E ( α s 2 ) , E ( α s ) E(\alpha s^3),E(\alpha s^2),E(\alpha s) E(αs3),E(αs2),E(αs)
  • 证明者计算:
    • g p = g p ( s ) = ( g s 3 ) 1 ⋅ ( g s 2 ) − 3 ⋅ ( g s ) 2 = g s 3 ⋅ g − 3 s 2 ⋅ g 2 s = g s 3 − 3 s 2 + 2 s g^p = g^{p(s)} = (g^{s^3})^1 \cdot (g^{s^2})^{-3} \cdot (g^{s})^2=g^{s^3} \cdot g^{-3s^2} \cdot g^{2s}= g^{s^3-3s^2+2s} gp=gp(s)=(gs3)1(gs2)3(gs)2=gs3g3s2g2s=gs33s2+2s
    • g p ′ = g α p ( s ) = ( g α s 3 ) 1 ⋅ ( g α s 2 ) − 3 ⋅ ( g α s ) 2 = g α s 3 ⋅ g − 3 α s 2 ⋅ g 2 α s = g α ( s 3 − 3 s 2 + 2 s ) g^{p'} = g^{\alpha p(s)} = (g^{\alpha s^3})^1 \cdot (g^{\alpha s^2})^{-3} \cdot (g^{\alpha s})^2=g^{\alpha s^3} \cdot g^{-3\alpha s^2} \cdot g^{2\alpha s}= g^{\alpha (s^3-3s^2+2s)} gp=gαp(s)=(gαs3)1(gαs2)3(gαs)2=gαs3g3αs2g2αs=gα(s33s2+2s)
  • 验证者检验 ( g p ) α = g p ′ (g^p)^{\alpha} = g^{p'} (gp)α=gp
    • ( g s 3 − 3 s 2 + 2 s ) α = g α ( s 3 − 3 s 2 + 2 s ) (g^{s^3-3s^2+2s})^{\alpha} = g^{\alpha (s^3-3s^2+2s)} (gs33s2+2s)α=gα(s33s2+2s)

现在我们可以确定证明者没有使用任何其他的东西,除了由验证者多项式提供,因为没有其他的方法来保持α-移位。与我们开始时相比,我们现在拥有了一个robust协议。然而,无论如何加密,零知识属性仍然有一个显著的缺陷:虽然理论上多项式系数 c i c_i ci可以有很大范围的值,但在现实中,它可能是非常有限的,这意味着验证者可以强制有限范围的系数组合,直到结果等于证明者的答案。例如,如果我们为每个系数考虑100个值的范围,那么幂次为2的多项式将总共有100万个不同的组合,这就需要不到100万个迭代。而且,即使只有一个系数,且系数值为1,安全协议也应该是安全的。

链接

[1]零知识证明学习(三)—— 非交互式零知识证明(zkSNARKs)

猜你喜欢

转载自blog.csdn.net/YM_1111/article/details/125069527