Bulletproof范围证明之原理

主页

微信公众号:密码应用技术实战
博客园首页:https://www.cnblogs.com/informatics/
GIT地址:https://github.com/warm3snow

简介

在《门罗币隐私保护之机密交易》中,我们提到了Bulletproof范围证明技术,用于证明交易金额(Pedersen密文形式)在一个合理的范围内。Bulletproof范围证明是一种零知识范围证明技术。通常称为 Zero Knowledge Range Proof,简称 ZKRP。ZKRP与通用的零知识证明技术相比,具有如下特点:

  • 高效性:ZKRP证明的大小和验证时间都比较小
  • 通用性:ZKRP通用性较差,主要用于证明某个值在一个合理的范围内的场景,如:机密交易、身份验证、隐私投票、隐私竞拍等。

ZKRP实现方案很多,除了通用的ZKP技术外,还有Bulletproof、ZK Set Membership、Hash chains等技术。但由于Bulletproof范围证明具有效率高、透明设置、可聚合性,与Pedersen承诺的兼容性等特点,在实践中最受欢迎。Bulletproof范围证明及其优化涉及到多个技术细节,如:内积证明、折半算法、非交互式证明等。

本文将对Bulletproof范围证明技术中的内积证明进行详细介绍,包括基本构造、证明生成和验证流程等。

本文内容组织如下:

  • 术语定义
  • 范围证明形式化表示
  • 向量内积表示
  • 范围证明多项式表达
  • Bulletproof交互式范围证明
  • 结语
  • 参考文献

术语定义

  • pq:分别表示两个大素数
  • Zp:表示模p的整数环
  • Zp:表示模p的整数环中的所有与p互素的元素, 即非零元素
  • G:阶为p的循环群, 如果:gG,G={1,g,g2,...,gp1}Zp, 则gG的生成元
  • GnZpn:分别表示群G上的n维向量空间和Zp上的n维向量空间
  • hrgx = hri=1ngixi=hrg1x1g2x2...gnxn: 表示向量x的Pedersen承诺值
  • a,b=ab=i=1naibi: 表示向量ab的内积。
  • ab=(a1b1,a2b2,...,anbn): 表示向量ab的哈达玛积。
  • p(X)=i=0dpiXiZp[X]: 表示模p的向量多项式,其中piZpn
  • l(X),r(X)=i=0dj=0ili,rjXi+j: 表示向量多项式l(X)r(X)的内积。
  • t(X)=l(X),r(X): 令t(X)等于向量多项式l(X)r(X)的内积,则xZp,t(x)=l(x),r(x)
  • a[:n]=(a1,a2,...,an)Fna[n:]=(an+1,an+2,...,an)Fnn: 表示向量a的前n个元素和后nn个元素。
  • kn=(k0,k1,k2,...,kn1): 表示长度为n的向量k,其中kiZp
  • PV: 分别表示证明生成者Prover和证明验证者Verifier

Bulletproof范围证明

Bulletproof范围证明依赖于承诺方案,因此流程上与承诺方案类似,包含:

  • 承诺:Prover生成承诺,并发送给Verifier
  • 挑战:Verifier生成挑战数,并发送给Prover
  • 打开/响应:Prover揭示明文或者证明,并发送给Verifier
  • 验证:Verifier验证Prover提供的证明是否正确

Bulletproof关键流程如下:

image

  • 步骤1:范围证明转换为多项式表达,转换过程包含:形式化表示、向量内积表示、多项式表达等
  • 步骤2:承诺
  • 步骤3:挑战
  • 步骤4:响应
  • 步骤5:验证

下面我们针对每个步骤进行详细介绍。

范围证明形式化表示

下面我们以证明v[0,2n1]为例,介绍Bulletproof范围证明的构造和验证流程。首先,我们先对范围证明问题进行形式化表示。为了方便描述范围证明问题,我们将范围证明问题形式化表示如下:

{(g,hG,V,γ;v,γZp:V=gvhγv[0,2n1])}

其中,ghG生成元,Vv的Pedersen承诺,γ是随机数,v是需要证明的数值。从上述公式可以看出:

  • 范围证明问题被转换成了两个部分:v的Pedersen承诺和v的范围大小
  • v的Pedersen承诺:V=gvhγ,与标准的Pedersen承诺形式一致
  • v的范围大小:v[0,2n1],保证了v的值在一个合理的范围内。其中n是一个固定的数值,通常为64。

同时为了更方便的进行范围证明构造,Bulletproof会将范围证明问题转换为以下等式:

(1)v=i=0nai2iandaR=aL1nandaLaR=0n

分析以上以上几个等式,可以很容易得出结论:

  • 结论1:等式v=i=0nai2i实际上是v二进制表达
  • 结论2:等式aR=aL1n和等式aLaR=0n限制了aL中元素ai的取值范围必须为01

由于aLaR=aL(aL1n)=0n,因此i[0,n],ai(ai1)=0, 即ai的值为0或1,因此结论2成立。

向量内积表示

Bulletproof范围证明会将等式(1)转换为向量内积形式,并将多个向量内积证明转换为一个向量内积证明问题。具体转换过程如下:

  1. 将等式(1)转换为向量内积形式

(2)v=aL,2nandaL1naR,yn=0andaL,aRyn=0

其中,y=(y0,y1,y2,...,yn1)是长度为n的向量,y是一个随机数。由于0向量与任意向量的内积为0,显然以上等式与(1)等价。

  1. 将多个向量内积证明转换为一个向量内积证明问题

通过引入另一个随机数z,我们可以将等式(2)合并为:

z2aL,2n+zaL1naR,yn+aL,aRyn=z2v

为了方便后面范围证明的构造和验证,我们将上述等式展开为:

(3)aLz1n,yn(aR+z1n)+z22n=z2v+δ(y,z)

其中,δ(y,z)=(zz2)1n,ynz31n,2nZp,从上面等式上我们可以了解到:

  • 展开后的等式左边为向量内积形式
  • 等式右边为常量,通过(z,y,v)进行计算,计算过程不涉及aLaR

范围证明多项式表达

我们知道在零知识证明中,一般将证明问题转换为多项式形式,然后Prover的多项式的承诺可以通过Verifier在随机打开点上验证完成。在Bulletproof中,Prover会将等式(3)转换为多项式形式,并由Verifier验证多项式的承诺是否正确。
首先我们定义两个线性向量多项式l(X),r(X)Zpn[X], 和一个二次多项式t(X)Zp[X], 并定义如下:

l(X)=aLz1n+sLXZpn[X]

r(X)=yn(aR+z1n+sRX)+z22nZpn[X]

t(X)=l(X),r(X)=t0+t1X+t2X2Zp[X]

其中,sLsR是长度为n的随机向量,t0,t1,t2Zp

通过上述定义,我们可以将等式(3)转换为多项式t(X)的形式, 其中常数项t0等于z2v+δ(y,z), 即等式(3)右边部分。通过对多项式t(X)的承诺-挑战-打开-验证,我们可以间接证明等式(3)的正确性,即完成了对v[0,2n1]的范围证明。

Bulletproof交互式范围证明

承诺

Bulletproof首先会对关键参数(aL,aR)进行承诺。步骤如下:

  1. 计算承诺
    生成随机数α,ρ,τ1,τ2zp和随机向量sL, sRzpn, 并计算承诺C=(V,A,ST1,T2)

V=gvhγG

A=hαgaLhaRG

S=hρgsLhsRG

T1=gt1hτ1,T2=gt2hτ2G

需要说明的是:

  • aLaR与等式(2)中的对应。
  • AaLaR的Pedersen承诺
  • SsLsR的Pedersen承诺, 用于隐藏范围证明多项式表达中使用的aLaR的值(注: aLaRv强绑定,因此需要隐藏)
  • T1T2是对多项式t(X)的系数承诺
  1. Prover将承诺C发送给Verifier

挑战

Verifier生成随机挑战x,y,zZp,并发送给Prover, 其中:

  • x是对多项式承诺的挑战
  • y用于生成公式(2)中的y,是对v范围的挑战
  • z对应公式(3)中的z,是对等式(3)的挑战

打开/响应

Prover根据接收到的挑战y,z,计算多项式t(X)的值,并将响应发送给Verifier

  1. 计算多项式点打开l(x),r(x),t(x)

l=l(x)=aLz1n+sLxZpn

r=r(x)=yn(aR+z1n+sRx)+z22nZpn

t=l(x),r(x)=t0+t1x+t2x2Zp

  1. 计算随机响应τx,μ

τx=z2γ+τ1x+τ2x2Zp

μ=α+ρxZp

注:Prover在打开阶段时,计算的响应用到了承诺阶段的一些随机数和随机向量,如α,ρ,τ1,τ2,sL,sR等。

  1. Prover将(τx,μ,t,l,r)作为响应发送给Verifier

验证

Verifier接收到Prover的响应后,验证Prover提供的证明是否正确。Verifier需要验证多个等式是否成立:

  1. 验证t=t(x)=t0+t1x+t2x2,方式如下:
    gthτx=?Vz2gδ(y,z)T1xT2x2
  2. 验证lr是否正确,方式如下:
    P=?hμgl(h)r
    其中, P=ASxgz(h)zyn+z22n
    i[1,n],hi=hiyi+1 即:h=(h1,h2y1,h3y2,...,hnyn)
  3. 验证t是否正确
    t=?l,r

如果上述等式都成立,则Verifier接受Prover的范围证明,即v[0,2n1]; 否则Verifier拒绝Prover的证明。

正确性验证

  1. 验证t=t(x)=t0+t1x+t2x2

Vz2gδ(y,z)T1xT2x2

=(gvhγ)z2gδ(y,z)(gt1hτ1)x(gt2hτ2)x2

=gvz2hγz2gδ(y,z)gt1xhτ1xgt2x2hτ2x2

=gvz2+δ(y,z)+t1x+t2x2hγz2+τ1x+τ2x2

=gt0+t1x+t2x2hz2γ+τ1x+τ2x2

=gthτx

因此,gthτx=Vz2gδ(y,z)T1xT2x2成立,同时从上述推导中我们可以看到主要是验证了t=t(x)的正确性。

  1. 验证lr是否正确

P=ASxgz(h)zyn+z22n

=hαgaLhaR(hρgsLhsR)xgz(h)zyn+z22n

=hαgaLhaRhρxgsLxhsRxgz(h)zyn+z22n

=hα+ρxgaL+sLxz1nhaR+sRx(h)zyn+z22n

=hμglhaR+sRx(h)zyn+z22n

根据h的定义,我们可以得到:

hyn=(h1y0,(h2y1)y1,(h3y2)y2,...,(hnyn+1)yn1)

=(h1,h2,h3,...,hn)=h

因此P可以简化为:

P=hμglhaR+sRx(h)zyn+z22n

=hμgl(h)yn(aR+sRx)+zyn+z22n

=hμgl(h)yn(aR+z1n+sRx)+z22n

=hμgl(h)r

因此, P=hμgl(h)r成立,从上面公式我们可以看到主要是验证了lr的正确性。

  1. 验证t是否正确

t的正确性验证比较简单,由于Prover在打开阶段计算的t是多项式l(x)r(x)的内积,因此只需要Verifier重新计算l(x)r(x)的内积,然后与Prover提供的t进行比较即可。如果相等,则说明Prover提供的t是正确的。

结语

本文作为Bulletproof范围证明系列文章的第一篇,详细介绍了Bulletproof范围证明的多项式表达、承诺、挑战、打开、验证等流程。Bulletproof范围证明是一种零知识证明技术,主要用于证明某个值在一个合理的范围内。Bulletproof范围证明具有高效性、透明设置、可聚合性等特点,因此在实际应用中得到了广泛的应用。

本文未对Bulletproof范围证明的优化、聚合、批量验证等技术进行详细介绍,后续文章会逐步展开对Bulletproof的进一步介绍,展示Bulletproof备受欢迎的魅力所在。

posted @   warm3snow  阅读(364)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示