Commitment Scheme
利用承诺方案,当承诺者需要承诺一条消息m时,可以将该消息放入信封中,并在稍后打开信封,公开其承诺的信息
承诺方案具备两个性质
- 隐藏性:承诺方案不会揭示被承诺的消息
- 绑定性:承诺者无法将被承诺的消息揭示为两个不同的值,也即揭示阶段无法改变被承诺的值
常见承诺方案的基本流程:
【01】发送承诺:Sender选取随机数r,计算m的承诺值,构造C=Commit(m,r),将承诺值发送给Receiver
【02】打开承诺:发送m与r
【03】验证承诺:Receiver计算C′=Commit(m,r),判断C′=C
哈希承诺
【01】发送承诺:Sender选择一个明文m,计算承诺值C=H(m),将C发送给Receiver
【02】打开承诺:Sender公开明文m
【03】验证承诺:Receiver计算C′=H(m),判断C′=C
缺点:可能会存在哈希碰撞的问题
EIGamal承诺
基于离散对数问题的困难性假设构造的承诺方案。假设Gp是阶为q的循环群,g,h是生成元,m是明文
【01】发送承诺:Sender选择一个明文m和一个随机数r,计算承诺值C=(gr,m⋅hr),将C发送给Receiver
【02】打开承诺:Sender公开明文m和随机数r
【03】验证承诺:Receiver计算C=(gr,m⋅hr),判断C′=C
建立在发送方难以找到两个不同的(r1,m1)和(r2,m2)使得C=(gr1,m1⋅hr1)=(gr2,m2⋅hr2)
Pedersen承诺
基于离散对数问题的困难性假设构造的承诺方案。假设Gp是阶为q的乘法群,g,h是独立生成元,m是明文
【01】发送承诺:Sender选择一个明文m和一个随机数r,计算承诺值C=gm⋅hr,将C发送给Receiver
【02】打开承诺:Sender公开明文m和随机数r
【03】验证承诺:Receiver计算C′=gm⋅hr,判断C′=C
接收方无法通过承诺值C推导出明文m,发送方难以找到两个不同的(r1,m1)和(r2,m2)满足C=gm1⋅hr1=gm2⋅hr2
原因在于g,h是独立生成元,他们生成的子群是没有重叠的,意味着gm1−m2=hr2−r1只能当m1=m2,r1=r2的情况下才成立,故很难找到C满足以上式子
基于ECC构造
假设G和H是椭圆曲线上的点,m是明文,r是随机数
【01】发送承诺:Sender选择一个明文m和一个随机数r,计算承诺值C=mG+rH,将C发送给Receiver
【02】打开承诺:Sender公开明文m和随机数r
【03】验证承诺:Receiver计算C′=mG+rH,判断C′=C
Pedersen承诺的同态性:
两个Pedersen承诺的和=明文之和的Pederson承诺
C1=gm1⋅hr1和C2=gm2⋅hr2是两个Pederson承诺,m1,m2是明文,r1,r2是随机数,有
C1⋅C2=gm1⋅hr1⋅gm2⋅hr2=gm1+m2⋅hr1+r2
commmit(m1,r1)⋅commit(m2,r2)=commit(m1+m2,r1+r2)
基于ECC构造也有此性质
作用:能够保证密态的加法性。即直接验证承诺来检验消息是否为m1+m2和
零知识证明承诺
允许发送方向接收方证明自己拥有某个明文,而不透露明文的具体内容
Sigsma交互式零知识证明承诺
基于离散对数问题的困难性假设构造的零知识承诺方案。
【01】发送承诺:Sender选取随机数r,生成承诺C=r.G,发送C给Receiver
【02】发送挑战:Receiver发送一个随机挑战e给Sender
【03】发送挑战:Sender计算证明proof:z=m+er,并发送给Receiver
【04】承诺验证:Receiver验证Proof,验证Z.G==C+e.Q
正确性:
z.G=(r+e.m).G=r.G+e.m.G=C+e.Q
隐藏性:Receiver只知道C,不知道r的值
绑定性:无法找到多个r使得C=r1⋅G=r2⋅G
零知识性:Receiver只知道(Q,C,e,z),无法计算出m
Sigma非交互式零知识证明承诺
【01】发送承诺:Sender选取随机数r,生成承诺C=r⋅G
【02】生成挑战:Sender计算挑战e=H(Q,C),并计算证明z=r+e⋅m
【03】发送(e,z):Sender发送给挑战e和证明z给Receiver
【04】承诺验证:Receiver计算A=z⋅G−e⋅Q,并验证e==H(Q,A)
特点:无需交互,性能更好,发送数据量更小
Pedersen非交互式零知识证明承诺
【01】发送承诺:Sender选取随机数r,生成承诺C=m⋅G+r⋅H
【02】生成挑战:Sender计算两个随机数
【03】生成证明:Sender计算P=x⋅G+y⋅H,并计算h=H(P),然后计算x′=x+h⋅m和y′=y+h⋅r
【04】发送证明:Sender发送证明(P,x′,y′)给Receiver
【05】验证:Receiver计算h=H(P),并验证P+h⋅C==x′G+y′H
正确性:
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)在x=i的点上,f(i)=y
我们先给定两个椭圆曲线群G1、G2,均为循环群,每个椭圆曲线群的阶数p相同
取G1、G2分别为G1、G2的生成元,我们定义一个双线性映射e:G1∗G2→GT
可得到:
对任意的G1∈G1,G2∈G2,以及标量a,b∈Zp(模p的有限域)
都有 e(aG1,bG2)=ab⋅e(G1,G2)
我们再给定一个n次的多项式函数f(x):Zp→Zp,另an=0
f(x)=i=0∑naixi=a0+a1x+...+anxn
秘密参数τ由可信第三方随机生成,给出公开参数τ⋅G1,τ2⋅G1,τ3⋅G1,⋅⋅⋅,τn⋅G1生成后丢弃τ,τ的值发送方和接收方均未知
【01】发送方发送承诺C
发送方选定f(x),发送承诺
C=f(τ)⋅G1
我们推导一下:
C=[f(τ)]G1=[i=0∑naiτi]G1=i=0∑n[ai]([τi]G1)=i=0∑n[ai][τi]G1
由此,因为ai都已知,也有公开参数τi⋅G1,所有很容易可以在不知道τ的情况下计算出C
要想知道f(i)=y是否成立,我们可以给定假设,若f(i)=y成立,则有在x=i时,f(x)−y=0
所以由因式定理:对任意的i∈Zp,都有x−i能够整除f(x)−f(i)
构造出辅助多项式 hi(x):hi(x)=x−if(x)−f(i),hi(x)的次数为n−1,x=i为hi(x)的零点
故将π作为Proof:π=hiτ⋅G1
【02】发送方发送安全参数
π=hi(τ)⋅G1
推导如下:
π=hi(τ)⋅G1=[i=0∑n−1τ−if(τ)−f(i)]G1=i=0∑n−1G1−1⋅G1(τ−i)(f(τ)−f(i))⋅G1
分子部分同公式(6)处可以计算,分母部分G1−1由G1为G1的元素可知,G1必有逆元;G1(τ−i)可由公开参数计算。
【03】接收方验证安全参数与承诺
e(π,(τ−i)⋅G2)=e(C−y⋅G1,G2)
推导如下:
(π,(τ−i)⋅G2)=e(hi(τ)⋅G1,(τ−i)G2)=e(((f(τ)−f(i))⋅G1,G2)=e(C−y⋅G1,G2)
等式成立则可证在x=i处,f(i)=y
利用拉格朗日插值法
多项式
构造
I(x)=i=0∑n−1yij=0,j=i∏n−1xi−xjx−xj
例如当n=3时
f(x)=y0(x0−x1)(x0−x2)(x−x1)(x−x2)+y1(x1−x0)(x1−x2)(x−x0)(x−x2)+y2(x2−x0)(x2−x1)(x−x0)(x−x1)
只有当x=xi时,此时才有f(xi)=1⋅yi
从以上例子来看,可以以此实现批量验证,只需要传递多个x的位置信息,就能查询该点的f(x)值,而无需透露整个多项式的具体系数
由公式(7),我们能假设x0,x1,...,xn−1均为零点
可以给定一个零多项式
Z(x)=(x−x0)(x−x1)⋅⋅⋅(x−xn−1)
同上,能有f(x)−I(x)能被Z(x)整除
我们可以构造出辅助多项式q(x): q(x)=Z(x)f(x)−I(x)
那么同样的,可以给定proofπ=q(τ)⋅G1
接收方可以使用如下等式进行验证
e(π,Z(τ)⋅G2)=e(C−I(τ)⋅G1,G2)
向量
定义:对一个长度为q的有序序列(m1,...,mq)进行承诺,之后在特定位置揭示承诺值
只需要取一个n维向量a,在a中,a1存储着多项式f(x)在x=1处的值,本质上是用a来存储f(x)的函数值。
可以列出
f(x)=i=1∑nai⋅Ii,n(x)
其中的Ii,n(x)为拉格朗日函数,同公式(7)所示,当且仅当x=i时,Ii,n(x)=1,其余均为0
具体证明同上
更新承诺
C′:=C+(ai′−ai)⋅Ii,n(τ)⋅G1
若Ii,n(τ)⋅G1的所有值都已经缓存在服务器中,此时再更新承诺,就只需要在椭圆曲线G1进行一次乘法和一次加法,时间复杂度为O(1)
特殊方案-引入陷门trapdoor
Trapdoor Commitment
方案目标:确保消息内容保密的同时,允许承诺方灵活处理消息的承诺方案。
符号说明:
-
κ:保密参数-security parameter
-
cpp:公开参数-public parameter
-
tr:陷门参数-trapdoor
-
ϑ:随机数-random number
-
c:公开的承诺字符串-the commitment string
-
m:消息-message
C.setup(1κ)
- 输入:安全参数κ
- 输出:公开参数cpp与陷门tr
C.commit(cpp,m,ϑ)
- 输入:cpp,m,ϑ
- 输出:c
m为消息空间M中的值,c为承诺空间C中的值,这些都在公开参数cpp中
C.equivocal(cpp,c,(m,ϑ),m′,tr)
- 输入:cpp,c,m,ϑ,m′,tr
- 输出:ϑ′
C.decommit(cpp,c,m′,ϑ)
在这个阶段,发送方会公布消息m′、随机数ϑ′
接收方验证c=C.commit(cpp,m′,ϑ′),若成立则output(1)
优点:
1、可以有效抵御重放攻击、选择消息攻击、欺骗攻击以及后向欺骗攻击等
2、利用陷门tr将于原本承诺值c关联的消息m,更新为与消息m′关联,使得能够通过陷门将承诺值c与不同的消息进行匹配,相当于给发送方提供了在特殊情况下修改消息的渠道。
总结:
RSA方案实现
C.setup(1κ)
cpp取(n,e),门限tr当作私钥
C.commit(cpp,m,ϑ)
C.equivocal(cpp,c,(m,ϑ),m′,tr)
-
目标:生成新的随机数ϑ′,使得新承诺c′对新消息m′是有效的
-
发送方先解密承诺值c有:m+ϑ=ctrmodn
再生成新随机数ϑ′:ϑ′=(ctr−m′)modn
C.decommit(cpp,c,m′,ϑ′)