Sigma零知识证明,知道秘密ω,且与公开输入Q满足离散对数关系Q=ωG
Sigma零知识证明协议
设关系R⊆X∗Y, 那么<P, V> 构建在R上的一个Sigma 协议为:
P是一个叫证明的交互式协议,其输入为一个witness-statement对(x,y)∈R.
V是一个叫验证的交互式协议,其输入为一个statement,y∈R
P和V交互过程为:
-
首先,P计算一个承诺(commitment) t ,将其发送给V;
-
在收到来自P的消息后,V在有限的挑战空间C中随机选取一个挑战元素(challenge) c,并将其发送给P ;
-
在接收到来自V的挑战后, P计算出一个反馈(response) z ,将其发送给V
-
在收到了来自P的反馈后, V输出accept或者reject。
例子
1)P计算h=gxmod p作为秘密
2)P选择随机数r∈zq,计算a=grmodp, P将a值发送给V
3)V选择随机数challenge e,V将e值发送给P;
4) P计算z=r+ex modp, 将z值发送给V,
5) V判断gz=?=ahemodp是否成立,同时检验e的哈希结果是否正确,都通过后,则V接受认为P确实知道正确的x.
正确性(completeness)
在上面的协议中,正确性意味着如果每个人都遵守协议,那么协议正常执行。在Sigma协议的中,这意味着P和V这么做,V最后应该接受状态。
公平性(special soundness)
公平性意味着P不能证明一个错误的陈述statement. Sigma协议实现公平的。准确地说,特殊公平性!特殊公平性是说,如果P能让V在挑战中找到两个挑战,那么这两个挑战分别是(e,z)和(e′,z′)。通过代数计算【幂除法】可以得到d=(e−e′),x=d(s−s′)。这样计算出x那么只能满足其中一个等式。
零知识性 (special honest verifier zk)
V既不能从协议中知道x的值,而且还不能向第三者,证明V知道这个秘密(即V无法冒充P)。也就是V从协议中什么也没学到(除了P知道x之外)。
sigma协议又称为诚实验证者的(特殊)零知识证明。即假设验证者是诚实的
交互式方式有其应用局限,比如得双方或多方同时在线等。Fiat-Shamir变换,又叫Fiat-Shamir Heurisitc(启发式),或者Fiat-Shamir Paradigm(范式),是Fiat和Shamir在1986年提出的一个变换,其特点是可以将交互式零知识证明转换为非交互式零知识证明。这样就通过减少通信步骤而提高了通信的效率!
该算法允许将交互步骤中随机挑战替换为非交互随机数预言机(Random oracle)。
1)P计算h=gxmod p作为秘密
2)P选择随机数r∈zq,计算a=grmodp, P将a值发送给V
3)P计算e=Hash(h,a)
4) P计算z=r+ex modp, 将z值发送给V,
5) V判断gz=?=ahemodp是否成立,同时检验e的哈希结果是否正确,都通过后,则V接受认为P确实知道正确的x.
Sigma协议应用到ElGamal同态加密
同态密文运算
密钥生成:A,B,C,D的私钥和公钥分别是:
A:(α1,g1),g1=gα1B:(α2,g2),g2=gα2C:(α3,g3),g3=gα1D:(α4,g4),g4=gα2
余额初始状态:
-
A余额初始状态密文为[C0,D0],其中C0=gr0,D0=gm0g1r0
-
B余额初始状态密文为[C0′,D0′],其中C0′=gr0′,D0′=gm0′g1r0′
-
C,D起始状态金额为0
A支付给C金额数量为m1,使用ElGamal同态加密生成密文[C1,D1],[C1′,D1′]并生成零知识证明zkProof和范围证明BulletProof
- A选择随机数r1,基于C的公钥g3,生成[C1,D1]
- A选择随机数r1,基于自己的公钥g1,生成[C1′,D1′]
C1=gr1, D1=gm1g3r1C1′=gr1′,D1′=gm1′g3r1′ZK{r1,r1′,m1,m1′,m1=m1′∣C1,D1,C1′,D1′}BulletProof{0≤m0−m1≤232,0≤m1≤232}
A对交易单签名;矿工验证签名、零知识证明和范围证明。然后:
- 更新C金额记作[C1,D1],则C能够解密获得m1并进行支付,解密过程:gm1=D1/(C1)α3
- 更新A的金额状态记为[C0/C1′,D0/D1′],则A能过够解密获得m0−m1并进行支付。解密过程:gm0−m1′=(D0/D1′)/(C0/C1′)α1
C余额增加m1,A余额减少m1′
B支付给C金额为m2,使用ElGamal同态加密生成密文[C2,D2],[C2′,D2′],并生成零知识证明zkProof和范围证明BulletProof
C2=gr2, D2=gm2g3r2C2′=gr2′,D2′=gm2′g3r2′ZK{r2,r2′,m2,m2′,m2=m2′∣C2,D2,C2′,D2′}BulletProof{0≤m0−m2≤232,0≤m2≤232}
B对交易单签名;矿工验证签名、零知识证明和范围证明。然后:
- 更新C金额记作[C1C2,D1D2],则C能够解密获得m1+m2并进行支付,解密过程:gm1+m2=D1D2/(C1C2)α3
- 更新A的金额状态记为[C0/C2′,D0/D2′],则A能过够解密获得m0′−m2并进行支付。解密过程:gm0′−m2′=(D0′/D2′)/(C0/C2′)α2
C支付给D金额数量为m3,使用ElGamal同态加密生成密文[C3,D3],[C3′,D3′],并生成零知识证明zkProof和范围证明BulletProof
C3=gr3, D3=gm3g4r3C3′=gr3′,D3′=gm3′g3r3′ZK{r3,r3′,m3,m3′,m3=m3′∣C3,D3,C3′,D3′}BulletProof{0≤m1+m2−m3≤232,0≤m3≤232}
C对交易单签名;矿工验证签名、零知识证明和范围证明。然后:
- 更新C金额记作[C1C2/C3′,D1D2/D3′],则C能够解密获得m1+m2−m3并进行支付,解密过程:gm1+m2−m3=(D1D2/D3′)/(C1C2/C3)α3
- 更新A的金额状态记为[C3,D3],则A能过够解密获得m3并进行支付。解密过程:gm3=(D3)/(C3)α4
Sigma 零知识证明确保:支付方的减少额 == 接收方的增加额。