github: https://github.com/FindoraNetwork/zei/blob/develop/crypto/src/basic/chaum_pedersen.rs
chaum_pedersen是一种零知识证明协议,设G、H是椭圆曲线上的两点, P = r G , Q = r H P=rG,Q=rH P=rG,Q=rH且P、Q公开,证明者Alice在不透漏r的情况下向Bob证明P、Q具有的相同的r,证明过程如下:
在Findora中,chaum_pedersen用来证明两个pedersen承诺具有相同的承诺值,设G、H(H=zG,但z不知)是椭圆曲线上的两点, P = v G + b 1 H , Q = v G + b 2 H , v , b 1 , b 2 ∈ F P=vG+b_1H,Q=vG+b_2H,v,b_1,b_2 \in F P=vG+b1H,Q=vG+b2H,v,b1,b2∈F,证明过程如下:
P r o v e c h a u m _ p e d e r s e n ( P , Q , v , b 1 , b 2 ) → ( c 1 , c 2 , s 1 , s 2 , s 3 ) : Prove_{chaum\_pedersen}(P,Q,v,b_1,b_2) \rightarrow (c_1,c_2,s_1,s_2,s_3): Provechaum_pedersen(P,Q,v,b1,b2)→(c1,c2,s1,s2,s3):
- 随机选取 r 1 , r 2 , r 3 ∈ F 随机选取r_1,r_2,r_3 \in F 随机选取r1,r2,r3∈F
- 计算 c 1 = r 1 G + r 2 H , c 2 = r 1 G + r 3 H 计算c_1 = r_1G+r_2H,c_2=r_1G+r_3H 计算c1=r1G+r2H,c2=r1G+r3H
- 通过 F i a t − S h a m i r 变换计算 β = h a s h ( G , H , P , Q , c 1 , c 2 ) 通过Fiat-Shamir变换计算\beta = hash(G,H,P,Q,c_1,c_2) 通过Fiat−Shamir变换计算β=hash(G,H,P,Q,c1,c2)
- 计算 s 1 = v ⋅ β + r 1 , s 2 = b 1 ⋅ β + r 2 , s 3 = b 2 ⋅ β + r 3 计算s_1 = v\cdot \beta+r_1,s_2=b_1\cdot \beta+r_2,s_3=b_2\cdot \beta+r_3 计算s1=v⋅β+r1,s2=b1⋅β+r2,s3=b2⋅β+r3
V e r i f y c h a u m _ p e d e r s e n ( P , Q , c 1 , c 2 , s 1 , s 2 , s 3 ) → b ∈ 0 , 1 : Verify_{chaum\_pedersen}(P,Q,c_1,c_2,s_1,s_2,s_3) \rightarrow b \in{0,1}: Verifychaum_pedersen(P,Q,c1,c2,s1,s2,s3)→b∈0,1:
- 通过 F i a t − S h a m i r 变换计算 β = h a s h ( G , H , P , Q , c 1 , c 2 ) 通过Fiat-Shamir变换计算\beta = hash(G,H,P,Q,c_1,c_2) 通过Fiat−Shamir变换计算β=hash(G,H,P,Q,c1,c2)
- 随机选取 α 0 , α 1 ∈ F 随机选取\alpha_0,\alpha_1\in F 随机选取α0,α1∈F
- 令 k = [ α 1 s 1 + α 0 s 1 , α 1 s 1 + α 0 s 1 , − α 0 β , − α 1 β , − α 0 , − α 1 ] 令k= [\alpha_1 s_1+ \alpha_0 s_1,\alpha_1 s_1+ \alpha_0 s_1,-\alpha_0 \beta,-\alpha_1 \beta,-\alpha_0,-\alpha_1] 令k=[α1s1+α0s1,α1s1+α0s1,−α0β,−α1β,−α0,−α1]
- 令 l = [ G , H , P , Q , c 1 , c 2 ] 令l= [G,H,P,Q,c_1,c_2] 令l=[G,H,P,Q,c1,c2]
- 验证 ∑ i = 0 5 k i ∗ l i ? = 0 验证\sum_{i=0}^{5}k_i *l_i \ ?= 0 验证∑i=05ki∗li ?=0
- 如果验证通过,则输出 1 ,否则输出 0 如果验证通过,则输出1,否则输出0 如果验证通过,则输出1,否则输出0
这里Proof和Verify中的生成证明和验证证是通过matrix_sigma算法来实现的,matrix_sigma是可以看作一个通用证明算法,Zei库中一些算法会构造成matrix形式通过matrix_sigma算法来进行证明,关于matrix_sigma算法更多信息可参考github:https://github.com/FindoraNetwork/zei/blob/develop/crypto/src/basic/matrix_sigma.rs。
实际上在上述验证过程,我们只需要验证两点:
- s 1 G + s 2 H ? = β ⋅ P + c 1 s_1G+s_2H \ ?=\beta \cdot P + c_1 s1G+s2H ?=β⋅P+c1
- s 1 G + s 3 H ? = β ⋅ Q + c 2 s_1G+s_3H \ ?=\beta \cdot Q + c_2 s1G+s3H ?=β⋅Q+c2