零知识证明 - 基于多项式构造零知识证明

本文详细介绍了如何基于多项式构造零知识证明,从直观版本到皮诺曹协议,逐步揭示其工作原理。通过同态加密、"α对"、双线性映射等技术,解决证明者知识的保护和验证的有效性。最后,文章总结了零知识证明的实现关键点,包括多项式分解、同态加密和双线性映射的应用。
摘要由CSDN通过智能技术生成

理解为什么以及如何基于多项式构造零知识证明,这篇文章讲的比较清楚。虽然文章只讲到了皮诺曹协议,但是足够理解基于多项式构造零知识证明的本质。想深入零知识证明的小伙伴都建议看看。

http://petkus.info/papers/WhyAndHowZkSnarkWorks.pdf

以下是我对这篇文章的理解和总结。原文由浅入深地从一个个简单版本,慢慢推导出实用的证明协议。

协议0 - 直观版本

随机抽查,随机提供样本,对照结果。这种协议,需要通过设定随机抽查的次数,确定安全系数。

协议1 - 从多项式的系数证明开始

最简单的d阶多项式,可以随机选择一个点x,让prover通过多项式计算生成y,verifier可以查看y是否正确。不同的多项式,最多有d个相交的点(相等的点)。

如果x/y的取值范围很大(设为n),在不知道原始多项式的情况下,能正确给出证明的概率比较低:d/n。多项式,能在一次交互,就能获取比较好的安全系数(如果n远大于d的话,将近100%)。比版本0,优秀不少。

这种协议还是比较简单和原始。证明建立在双方还是相互信任的基础上。本质上,prover并没有证明他/她知道多项式。证明本身并不能推出他/她知道一个确定的多项式。知道一个值,并不代表知道一个多项式。而且,如果多项式的值范围不大的话,证明者可以随机选择一个值撞概率。

协议2 - 基于多项式因式分解改进

假设一个多项式可以分解成:p(x) = t(x)h(x)。t(x)是目标多项式,是由p(x)的部分解组成的多项式: t ( x ) = ( x − x 0 ) ( x − x 1 ) . . . ( x − x d − 1 ) t(x) = (x-x_0)(x-x_1) ... (x-x_{d-1}) t(x)=(xx0)(xx1)...(xxd1)。也就是说,证明者需要证明的一部分,证明者知道一个多项式的部分解。从验证者的角度看,既然你知道一个多项式的部分解,那你知道的多项式一定能整除t(x)。在随机挑选x的情况下,你都能给出正确的证明,即可认定你知道这个满足条件的多项式。

  • 验证者,随机生成r,并计算出t®,将r发送给证明者

  • 证明者,计算h(x) = p(x)/t(x),并给出p®以及h®

  • 验证者验证,是否p®=t®h®

该版本要求证明者,知道一个能整除t(x)的多项式。但比较容易发现,该协议存在如下的问题:

1/ 证明者,可以自己计算出t®,随机生成h®,并构造出p® = t®h®

2/ 即使不像1,证明者不考虑多项式,直接通过结果伪造证明。证明者,因为知道随机数r,证明者可以使用任何一个多项式,保证存在相同点(r, t®h®)。这样,证明的p®和h®虽然和正确的证明是一样的,但是,证明者却不需要知道正确的多项式。

3/ 证明者,可以自己构造多项式,只要满足h(x)=p(x)/t(x)即可。

版本3 - 引入同态加密

协议2中的问题1/2,都是因为证明者知道随机数r以及t®。引入同态加密解决。数据是加密的,在加密数据的基础上可以进行计算,能和原始数据计算具有同样的“形态”。

模运算基础上的幂次计算,是同态加密的一种方式,表示为: E ( v ) = g v ( m o d   n ) E(v) = g^v(mod\ n) E(v)=gv(mod n),其中v是需要加密的数据。在同态加密的基础上,可以定义运算:

加法:加密结果相乘,加密结果相乘等于原始数据相加后的加密结果

乘法:幂次运算,一个加密结果进行幂次计算等于两个原始数据乘法的加密结果(注意不是同态乘法)

除法:相对复杂,不深究

不要被加法(相乘),乘法(幂次)迷惑了。你可以认为,加密结果加法是通过加密结果的乘法实现的。

注意,乘法不支持两个加密结果乘法。也就是说,只支持一个原始数据和一个同态加密结果进行乘法操作。

有了同态加密,一个多项式的加密结果,可以通过多项式的各个项的加密结果计算。

比如说,一个多项式 p ( x ) = x 3 − 3 x 2 + 2 x p(x) = x^3 - 3x^2 + 2x p(x)=x33x2+2x。p(x)的加密结果可以通过如下的方式计算:

E ( X 3 ) 1 ⋅ E ( x 2 ) − 3 ⋅ E ( x ) 2 = ( g x 3 ) 1 ⋅ ( g x 2 ) − 3 ⋅ ( g x ) 2 = 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^{x^3-3x^2+2x} E(X3)1E(x2)3E(x)2=(gx3)1(gx2)3(gx)2=gx33x2+2x

显而易见,一个多项式的值,可以通过各项的加密结果乘上各项的系数,计算出多项式的加密结果。

  • 验证者,随机挑选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),并将这些值发给证明者。同时计算出目标多项式的加密值t(s)
  • 证明者先计算出h(x) = p(x)/t(x),并通过多项式加密计算的方法计算出E(p(s)) 和 E(h(s))
  • 验证者验证:E(p(s)) = E(h(s))*t(s)是否成立

这个协议,验证者没有暴露随机值s,证明者只能通过多项式计算出h,从而计算出证明。这个协议,也有问题,证明者有可能只用验证者提供的各项加密结果中的几项来构造证明。并且,聪明的证明者可以自己通过多项式的各项的加密结果计算出t(s)。在知道t(s)的情况下,要构造一个证明非常容易,只需要满足幂次计算即可。

版本4 - KEA(Knowledge-of-Exponent Assumption)

假设Alice想获得a的幂次结果,具体的幂次不关心。为了限制幂次结果的提供者Bob只在a上进行幂次操作,Alice提供 a a a以及 a α a^{\alpha} aα。Bob选择一个幂次 c c c,计算 b = a c m o d   n b = a^c mod \ n b=acmod n以及 b ′ = ( a ′ ) c m o d   n b' = (a')^c mod\ n b=(a)cmod n,并发送给Alice。Alice通过检查 b α = b ′ b^\alpha = b' bα=b确定是否b是在a基础上的幂次计算。

( a , a α ) (a, a^\alpha) (a,aα)就是“ α \alpha α对"。通过一个“ α \alpha α对",数据进行同样的幂次操作。

在上述同态加密的情况下,幂次计算,是同态加密后的乘法操作。举个例子,有个简单的多项式 f ( x ) = c ⋅ x f(x)=c\cdot x f(x)=cx,验证者为了保证证明者在随机选择的s的加密结果上都“乘以”c,提供 ( g s , g α ⋅ s ) (g^s, g^{\alpha\cdot s}) (gs,gαs)。证明者,通过提供 ( ( g s ) c , ( g α ⋅ s ) c ) ((g^{s})^{c},(g^{\alpha\cdot s})^{c}) ((gs)c,(gαs)c),证明计算是对同一个加密结果进行了乘法操作。

因为同态加法成立,该方法可以从简单的多项式可以扩展到一半多项式。

  • 验证者提供 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
  • 证明者分别计算两组值:
    • g p = g p ( s ) = ( g s 0 ) c 0 ⋅ ( g s 1 ) c 1 ⋅ . . . ⋅ ( g s d ) c d g^p = g^{p(s)} = (g^{s^0})^{c_0}\cdot (g^{s^1})^{c_1} \cdot... \cdot (g^{s^d})^{c_d} gp=gp(s)=(gs0)c0(gs1)c1...(gsd)cd
    • g p ′ = g α p ( s ) = ( g α s 0 ) c 0 ⋅ ( g α s 1 ) c 1 ⋅ . . . ⋅ ( g α s d ) c d g^{p'} = 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} gp=gαp(s)=(gαs0)c0(gαs1)c1...(gαsd)cd
  • 验证者验证: ( g p ) α = g p ′ (g^p)^{\alpha} = g ^ {p'} (gp)α=gp

从证明可以推导出: g p ′ = 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^{p'} = g^{c_0 \alpha s^0 + c_1 \alpha s^1+ ... + c_d \alpha s^d} = g^{\alpha(c_0 s^0 + c_1 s^1+ ... + c_d s^d)} gp=gc0αs0+c1αs1+...+cdαsd=gα(c0s0+c1s1+...+cdsd)

该协议很好的限制证明者必须在多项式的计算下,每个系数都正确“计算”。但是,这个协议并没有保护证明者的知识:验证者可以从证明信息中暴力反推多项式系数(毕竟现实场景下系数的组合还不算多)。

版本5 - ZK(零知识)

为了保护证明信息,也就是保护 c 0 , c 1 . . . c d c_0, c_1 ... c_d c0,c1...cd信息。还是利用“偏移”,在 g p 和 g p ′ g^p 和 g^{p'} gpgp都“乘”上一个随机系数 δ \delta δ。即使验证者能枚举出 ( δ c 0 , δ c 1 , δ c 2 . . . δ c d ) (\delta c_0, \delta c_1, \delta c_2 ... \delta c_d) (δc0,δc1,δc2...δcd),也非常难获取 ( c 0 , c 1 , . . . c d ) (c_0, c_1, ... c_d) (c0,c1,...cd)

版本6 - 无交互

之前所有的协议都是交互式的。交互式协议有些问题:

  • 验证者可以和证明者串通,伪造证明
  • 验证者,自己生成证明
  • 在整个交互过程中,验证者必须保存 α \alpha α t ( s ) t(s) t(s)。可能会造成其他攻击的可能。

配对函数和双线性映射

到目前为止,验证者需要验证如下的两个等式:

g p = ( g h ) t ( s ) g^p = (g^{h})^{t(s)} gp=(gh)t(s)

( g p ) α = g p ′ (g^p)^\alpha = g^{p'} (gp)α=gp

假设,验证者不存储 α \alpha α t ( s ) t(s) t(s),而存储对应的加密数据。这样在验证的时候, g h g^h gh g t ( s ) g^{t(s)} gt(s)两个加密结果“相乘“, g p g^p gp g α g^\alpha gα”相乘“。从同态加密的定义,我们发现两个加密结果不能相乘。于是引入了新的计算特性:双线性映射。

e ( g a , g b ) = e ( g , g ) a b e(g^a, g^b) = e(g, g)^{ab} e(ga,gb)=e(g,g)ab

双线性映射的核心性质,可以表达成如下的等式:

e ( g a , g b ) = e ( g b , g a ) = e ( g a b , g 1 ) = e ( g 1 , g a b ) = e ( g 1 , g a ) b = e ( g 1 , g 1 ) a b e(g^a, g^b) = e(g^b, g^a) = e(g^{ab}, g^1) = e(g^1, g^{ab}) = e(g^1, g^a)^b = e(g^1, g^1)^{ab} e(ga,gb)=e(gb,ga)=e(gab,g1)=e(g1,gab)=e(g1,ga)b=e(g1,g1)ab

在这里插入图片描述

值的一提的是,e配对函数也具有加法同态:

e ( g a , g b ) ⋅ e ( g c , g d ) = e ( g 1 , g 1 ) a b ⋅ e ( g 1 , g 1 ) c d = e ( g 1 , g 1 ) a b + c d e(g^a, g^b)\cdot e(g^c, g^d) = e(g^1, g^1)^{ab} \cdot e(g^1, g^1)^{cd} = e(g^1, g^1)^{ab+cd} e(ga,gb)e(gc,gd)=e(g1,g1)abe(

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值