Findora密码原语之chaum-pedersen协议

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,证明过程如下:

img

在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,b2F,证明过程如下:

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,r3F
  • 计算 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) 通过FiatShamir变换计算β=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)b0,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) 通过FiatShamir变换计算β=hash(G,H,P,Q,c1,c2)
  • 随机选取 α 0 , α 1 ∈ F 随机选取\alpha_0,\alpha_1\in F 随机选取α0,α1F
  • 令 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=05kili ?=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

猜你喜欢

转载自blog.csdn.net/qq_34793644/article/details/126243462