Commitment Scheme

利用承诺方案,当承诺者需要承诺一条消息mm时,可以将该消息放入信封中,并在稍后打开信封,公开其承诺的信息

承诺方案具备两个性质

  • 隐藏性:承诺方案不会揭示被承诺的消息
  • 绑定性:承诺者无法将被承诺的消息揭示为两个不同的值,也即揭示阶段无法改变被承诺的值

常见承诺方案的基本流程:

https://www.cnblogs.com/informatics/p/18428017

【01】发送承诺:Sender选取随机数r,计算m的承诺值,构造C=Commit(m,r)C=Commit(m,r),将承诺值发送给Receiver

【02】打开承诺:发送m与r

【03】验证承诺:Receiver计算C=Commit(m,r)C'=Commit(m,r),判断C=CC'=C

哈希承诺

【01】发送承诺:Sender选择一个明文m,计算承诺值C=H(m)C=H(m),将C发送给Receiver

【02】打开承诺:Sender公开明文m

【03】验证承诺:Receiver计算C=H(m)C'=H(m),判断C=CC'=C

缺点:可能会存在哈希碰撞的问题

EIGamal承诺

基于离散对数问题的困难性假设构造的承诺方案。假设GpG_p是阶为qq的循环群,g,hg,h是生成元,mm是明文

【01】发送承诺:Sender选择一个明文mm和一个随机数rr,计算承诺值C=(gr,mhr)C=(g^r,m·h^r),将C发送给Receiver

【02】打开承诺:Sender公开明文m和随机数r

【03】验证承诺:Receiver计算C=(gr,mhr)C=(g^r,m·h^r),判断C=CC'=C

建立在发送方难以找到两个不同的(r1,m1)(r_1,m_1)(r2,m2)(r_2,m_2)使得C=(gr1,m1hr1)=(gr2,m2hr2)C=(g^{r_1},m_1·h^{r_1})=(g^{r_2},m_2·h^{r_2})

Pedersen承诺

基于离散对数问题的困难性假设构造的承诺方案。假设GpG_p是阶为qq的乘法群,g,hg,h是独立生成元,mm是明文

【01】发送承诺:Sender选择一个明文mm和一个随机数rr,计算承诺值C=gmhrC=g^m·h^r,将CC发送给Receiver

【02】打开承诺:Sender公开明文m和随机数r

【03】验证承诺:Receiver计算C=gmhrC'=g^m·h^r,判断C=CC'=C

接收方无法通过承诺值C推导出明文m,发送方难以找到两个不同的(r1,m1)(r_1,m_1)(r2,m2)(r_2,m_2)满足C=gm1hr1=gm2hr2C={g^{m_1}}·{h^{r_1}}={g^{m_2}}·{h^{r_2}}

原因在于g,hg,h是独立生成元,他们生成的子群是没有重叠的,意味着gm1m2=hr2r1g^{m_1-m_2}=h^{r_2-r_1}只能当m1=m2,r1=r2m_1=m_2,r_1=r_2的情况下才成立,故很难找到CC满足以上式子

基于ECC构造

假设GGHH是椭圆曲线上的点,mm是明文,rr是随机数

【01】发送承诺:Sender选择一个明文mm和一个随机数rr,计算承诺值C=mG+rHC=mG+rH,将CC发送给Receiver

【02】打开承诺:Sender公开明文m和随机数r

【03】验证承诺:Receiver计算C=mG+rHC'=mG+rH,判断C=CC'=C


Pedersen承诺的同态性:

两个Pedersen承诺的和=明文之和的Pederson承诺

C1=gm1hr1C_1={g^{m_1}}·{h^{r_1}}C2=gm2hr2C_2={g^{m_2}}·{h^{r_2}}是两个Pederson承诺,m1,m2m_1,m_2是明文,r1,r2r_1,r_2是随机数,有

C1C2=gm1hr1gm2hr2=gm1+m2hr1+r2C_1·C_2={g^{m_1}}·{h^{r_1}}·{g^{m_2}}·{h^{r_2}}={g^{m_1+m_2}}·{h^{r_1+r_2}}

commmit(m1,r1)commit(m2,r2)=commit(m1+m2,r1+r2)commmit(m_1,r_1)·commit(m_2,r_2)=commit(m_1+m_2,r_1+r_2)

基于ECC构造也有此性质

作用:能够保证密态的加法性。即直接验证承诺来检验消息是否为m1+m2m_1+m_2

零知识证明承诺

允许发送方向接收方证明自己拥有某个明文,而不透露明文的具体内容

  • 交互式零知识证明承诺:发送方和接收方之间需要交互,发送方向接收方发送证明,接收方验证证明

  • 非交互式零知识证明承诺:发送方可以在不与接收方交互的情况下生成证明,接收方可以验证证明

Sigsma交互式零知识证明承诺

基于离散对数问题的困难性假设构造的零知识承诺方案。

【01】发送承诺:Sender选取随机数rr,生成承诺C=r.GC=r.G,发送CC给Receiver

【02】发送挑战:Receiver发送一个随机挑战ee给Sender

【03】发送挑战:Sender计算证明proof:z=m+erproof:z=m+er,并发送给Receiver

【04】承诺验证:Receiver验证ProofProof,验证Z.G==C+e.QZ.G==C+e.Q

正确性

z.G=(r+e.m).G=r.G+e.m.G=C+e.Qz.G=(r+e.m).G=r.G+e.m.G=C+e.Q

隐藏性:Receiver只知道C,不知道r的值

绑定性:无法找到多个rr使得C=r1G=r2GC=r_1·G=r_2·G

零知识性:Receiver只知道(Q,C,e,z)(Q,C,e,z),无法计算出mm

Sigma非交互式零知识证明承诺

img

【01】发送承诺:Sender选取随机数rr,生成承诺C=rGC=r·G

【02】生成挑战:Sender计算挑战e=H(Q,C)e=H(Q,C),并计算证明z=r+emz=r+e·m

【03】发送(e,z)(e,z):Sender发送给挑战ee和证明zz给Receiver

【04】承诺验证:Receiver计算A=zGeQA=z·G-e·Q,并验证e==H(Q,A)e==H(Q,A)

特点:无需交互,性能更好,发送数据量更小

Pedersen非交互式零知识证明承诺

383528-20240923220956953-1454115823.png (1538×1344)

【01】发送承诺:Sender选取随机数rr,生成承诺C=mG+rHC=m·G+r·H

【02】生成挑战:Sender计算两个随机数

【03】生成证明:Sender计算P=xG+yHP=x·G+y·H,并计算h=H(P)h=H(P),然后计算x=x+hmx'=x+h·my=y+hry'=y+h·r

【04】发送证明:Sender发送证明(P,x,y)(P,x',y')给Receiver

【05】验证:Receiver计算h=H(P)h=H(P),并验证P+hC==xG+yHP+h·C==x'G+y'H

正确性

P+hC=(xG+yH)+h(mG+rH)=x.G+y.H+hmG+hrH=(x+hm)P+h·C=(x·G+y·H)+h·(m·G+r·H)=x.G+y.H+h·m·G+h·r·H=(x+h·m)

KZG Commitment

目标:验证某个函数在某些特定点上的值是否正确,即在不暴露整个函数细节的基础上,对函数的值进行验证

  • 验证多项式f(x)f(x)x=ix=i的点上,f(i)=yf(i)=y

我们先给定两个椭圆曲线群G1\mathbb{G}_1G2\mathbb{G}_2,均为循环群,每个椭圆曲线群的阶数pp相同

G1G_1G2G_2分别为G1\mathbb{G}_1G2\mathbb{G}_2的生成元,我们定义一个双线性映射e:G1G2GTe:\mathbb{G}_1*\mathbb{G}_2\rightarrow\mathbb{G}_T

可得到:

​ 对任意的G1G1,G2G2G_1\in\mathbb{G}_1,G_2\in\mathbb{G}_2,以及标量a,bZpa,b\in\mathbb{Z}_p(模pp的有限域)

​ 都有 e(aG1,bG2)=abe(G1,G2)e(aG_1,bG_2)=ab·e(G_1,G_2)

我们再给定一个nn次的多项式函数f(x):ZpZpf(x):\mathbb{Z}_p\rightarrow\mathbb{Z}_p,另an0a_n\neq0

f(x)=i=0naixi=a0+a1x+...+anxnf(x)=\sum_{i=0}^{n} a_i x^i=a_0+a_1x+...+a_nx^n

秘密参数ττ由可信第三方随机生成,给出公开参数τG1,τ2G1,τ3G1,,τnG1\tau \cdot G_1,\tau^2 \cdot G_1,\tau^3 \cdot G_1,···,\tau^n \cdot G_1生成后丢弃ττττ的值发送方和接收方均未知

【01】发送方发送承诺C

发送方选定f(x)f(x),发送承诺

C=f(τ)G1C=f(τ)·G_1

我们推导一下:

C=[f(τ)]G1=[i=0naiτi]G1=i=0n[ai]([τi]G1)=i=0n[ai][τi]G1\begin{aligned} C=[f(τ)]G_1 &=[\sum_{i=0}^{n}a_iτ^i]G_1\\ &=\sum_{i=0}^{n}[a_i]([τ^i]G_1)\\ &=\sum_{i=0}^{n}[a_i][τ^i]G_1 \end{aligned}

由此,因为aia_i都已知,也有公开参数τiG1\tau^i\cdot G_1,所有很容易可以在不知道ττ的情况下计算出CC


要想知道f(i)=yf(i)=y是否成立,我们可以给定假设,若f(i)=yf(i)=y成立,则有在x=ix=i时,f(x)y=0f(x)-y=0

所以由因式定理:对任意的iZpi\in\mathbb{Z}_p,都有xix-i能够整除f(x)f(i)f(x)-f(i)

构造出辅助多项式 hi(x)h_i(x):hi(x)=f(x)f(i)xih_i(x) = \frac{f(x) - f(i)}{x - i}hi(x)h_i(x)的次数为n1n-1x=ix=ihi(x)h_i(x)的零点

故将π\pi作为Proof:π=hiτG1\pi=h_i{τ}·G_1

【02】发送方发送安全参数

π=hi(τ)G1\pi=h_i(τ)·G_1

推导如下:

π=hi(τ)G1=[i=0n1f(τ)f(i)τi]G1=i=0n1(f(τ)f(i))G1G11G1(τi)\begin{aligned} \pi&=h_i(τ)·G_{1}\\ &=[\sum_{i=0}^{n-1}\frac{f(τ) - f(i)}{τ - i}]G_1\\ &=\sum_{i=0}^{n-1}\frac{(f(τ)-f(i))·G_1}{G_1^{-1}·{G_1}(τ-i)} \end{aligned}

分子部分同公式(6)处可以计算,分母部分G11G_1^{-1}G1G_1G1\mathbb{G}_1的元素可知,G1G_1必有逆元;G1(τi){G_1}(τ-i)可由公开参数计算。

【03】接收方验证安全参数与承诺

e(π,(τi)G2)=e(CyG1,G2)e(\pi,(τ-i)·G_2)=e(C-y·G_1,G_2)

推导如下:

          (π,(τi)G2)=e(hi(τ)G1,(τi)G2)=e(((f(τ)f(i))G1,G2)=e(CyG1,G2)\begin{aligned} &\;\;\;\;\;(\pi,(τ-i)·G_2)\\&=e(h_i(τ)·G_1,(τ-i)G_2)\\&=e(((f(τ)-f(i))·G_1,G_2)\\&=e(C-y·G_1,G_2) \end{aligned}

等式成立则可证在x=ix=i处,f(i)=yf(i)=y

利用拉格朗日插值法

多项式

构造

I(x)=i=0n1yij=0,jin1xxjxixjI(x)=\sum_{i=0}^{n-1}y_i\prod_{j=0,j \neq i}^{n-1} \frac{x -x_j}{x_i-x_j}

例如当n=3n=3

f(x)=y0(xx1)(xx2)(x0x1)(x0x2)+y1(xx0)(xx2)(x1x0)(x1x2)+y2(xx0)(xx1)(x2x0)(x2x1)f(x)=y_0 \frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}+y_1\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}+y_2\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}

只有当x=xix=x_i时,此时才有f(xi)=1yif(x_i)=1·y_i

从以上例子来看,可以以此实现批量验证,只需要传递多个xx的位置信息,就能查询该点的f(x)f(x)值,而无需透露整个多项式的具体系数

由公式(7),我们能假设x0,x1,...,xn1x_0,x_1,...,x_{n-1}均为零点

可以给定一个零多项式

Z(x)=(xx0)(xx1)(xxn1)Z(x)=(x-x_0)(x-x_1)···(x-x_{n-1})

同上,能有f(x)I(x)f(x)-I(x)能被Z(x)Z(x)整除

我们可以构造出辅助多项式q(x)q(x): q(x)=f(x)I(x)Z(x)q(x)=\frac{f(x)-I(x)}{Z(x)}

那么同样的,可以给定proof  π=q(τ)G1proof\;\pi=q(τ)·G_1

接收方可以使用如下等式进行验证

e(π,Z(τ)G2)=e(CI(τ)G1,G2)e(\pi,Z(τ)·G_2)=e(C-I(τ)·G_1,G_2)

向量

定义:对一个长度为q的有序序列(m1,...,mq)(m_1,...,m_q)进行承诺,之后在特定位置揭示承诺值

只需要取一个n维向量a\vec{a},在a\vec{a}中,a1a_1存储着多项式f(x)f(x)x=1x=1处的值,本质上是用a\vec{a}来存储f(x)f(x)的函数值。

可以列出

f(x)=i=1naiIi,n(x)f(x)=\sum_{i=1}^{n}a_i·I_{i,n}(x)

其中的Ii,n(x)I_{i,n}(x)为拉格朗日函数,同公式(7)所示,当且仅当x=ix=i时,Ii,n(x)=1I_{i,n}(x)=1,其余均为0

具体证明同上

更新承诺

C:=C+(aiai)Ii,n(τ)G1C':=C+(a_i'-a_i)⋅I_{i,n}(τ)⋅G_1

Ii,n(τ)G1I_{i,n}(τ)·G_1的所有值都已经缓存在服务器中,此时再更新承诺,就只需要在椭圆曲线G1\mathbb{G}_1进行一次乘法和一次加法,时间复杂度为O(1)

特殊方案-引入陷门trapdoor

Trapdoor Commitment

方案目标:确保消息内容保密的同时,允许承诺方灵活处理消息的承诺方案。

符号说明:

  • κκ:保密参数-security parameter

  • cppcpp:公开参数-public parameter

  • trtr:陷门参数-trapdoor

  • ϑ\vartheta:随机数-random number

  • cc:公开的承诺字符串-the commitment string

  • mm:消息-message

C.setup(1κ1^{κ})

  • 输入:安全参数κ
  • 输出:公开参数cppcpp与陷门trtr

C.commit(cpp,m,ϑcpp,m,\vartheta)

  • 输入:cpp,m,ϑcpp,m,\vartheta
  • 输出:c

mm为消息空间M\mathcal{M}中的值,cc为承诺空间C\mathcal{C}中的值,这些都在公开参数cppcpp

C.equivocal(cpp,c,(m,ϑ),m,trcpp,c,(m,\vartheta),m',tr)

  • 输入:cpp,c,m,ϑ,m,trcpp,c,m,\vartheta,m',tr
  • 输出:ϑ\vartheta'

C.decommit(cpp,c,m,ϑcpp,c,m',\vartheta)

在这个阶段,发送方会公布消息mm'、随机数ϑ\vartheta'

接收方验证c=C.commit(cpp,m,ϑ)c=C.commit(cpp,m',\vartheta'),若成立则output(1)output(1)

优点:

1、可以有效抵御重放攻击、选择消息攻击、欺骗攻击以及后向欺骗攻击等

2、利用陷门trtr将于原本承诺值c关联的消息mm,更新为与消息mm'关联,使得能够通过陷门将承诺值cc与不同的消息进行匹配,相当于给发送方提供了在特殊情况下修改消息的渠道。

总结:

  • 承诺方在拥有陷门trtr的条件下,可以选择是否修改承诺消息mm

  • 而对于mm是否已经被修改,这个问题不是接收方关心的,接收方只关心在decommit阶段,收到的消息mm'、随机数ϑ\vartheta'是否与cc匹配

RSA方案实现

C.setup(1κ1^{κ})

cpp取(n,e),门限tr当作私钥

C.commit(cpp,m,ϑcpp,m,\vartheta)

  • 发送方生成承诺c

    c=(m+ϑ)e  mod  nc=(m+\vartheta)^e\;mod\;n

C.equivocal(cpp,c,(m,ϑ),m,trcpp,c,(m,\vartheta),m',tr)

  • 目标:生成新的随机数ϑ\vartheta',使得新承诺cc'对新消息mm'是有效的

  • 发送方先解密承诺值cc有:m+ϑ=ctr  mod  nm+\vartheta=c^{tr}\;mod\;n

    再生成新随机数ϑ\vartheta':ϑ=(ctrm)  mod  n\vartheta'=(c^{tr}-m')\;mod\;n

C.decommit(cpp,c,m,ϑcpp,c,m',\vartheta')

  • 接收方计算cc'

    c=(m+ϑ)e  mod  nc'=(m'+\vartheta')^e\;mod\;n

    比较c=cc=c' 是否成立即可验证承诺。