Findora密码原语之pedersen-elgamal算法

github: https://github.com/FindoraNetwork/zei/blob/develop/crypto/src/basic/pedersen_elgamal.rs

关于elgamal算法介绍可以参考之前的博文:elgamal算法

pedersen-elgamal:
给定由 ( m , r ) ∈ F (m,r)\in F (m,r)F生成的pesersen承诺 c o m m = m G + r H comm = mG+rH comm=mG+rH、elgamal密文 ( e 1 , e 2 ) = (e_1,e_2) = (e1,e2)= E n c e l g a m a l ( p k , m , r ) Enc_{elgamal}(pk,m,r) Encelgamal(pk,m,r),pedersen-elgamal算法可以生成一个证明,用来证明隐藏在 c o m m comm comm中的承诺值m、盲化因子r和隐藏在elgamal密文 ( e 1 , e 2 ) (e_1,e_2) (e1,e2)中的m、r相同,证明过程是零知识的,所以验证者除了相信他们相等之外,不能获取关于m、r的任何信息。


P r o o f p e d e r s e n − e l g a m a l ( m , r , p k , e 1 , e 2 , c o m m ) → ( c 1 , c 2 , c 3 , s 1 , s 2 ) : Proof_{pedersen-elgamal}(m,r,pk,e_1,e_2,comm) \rightarrow (c_1,c_2,c_3,s_1,s_2): Proofpedersenelgamal(m,r,pk,e1,e2,comm)(c1,c2,c3,s1,s2):

  • 随机选取 r 1 , r 2 ∈ F 随机选取r_1,r_2 \in F 随机选取r1,r2F
  • 计算 c 1 = r 2 G 计算c_1 = r_2G 计算c1=r2G
  • 计算 c 2 = r 1 G + r 2 p k 计算c_2=r_1G+r_2pk 计算c2=r1G+r2pk
  • 计算 c 3 = r 1 G + r 2 H 计算c_3=r_1G+r_2H 计算c3=r1G+r2H
  • 通过 F i a t − S h a m i r 变换计算 β = h a s h ( G , H , p k , e 1 , e 2 , c o m m , c 1 , c 2 , c 3 ) 通过Fiat-Shamir变换计算\beta = hash(G,H,pk,e_1,e_2,comm,c_1,c_2,c_3) 通过FiatShamir变换计算β=hash(G,H,pk,e1,e2,comm,c1,c2,c3)
  • 计算 s 1 = m ⋅ β + r 1 计算s_1 = m\cdot \beta+r_1 计算s1=mβ+r1
  • 计算 s 2 = r ⋅ β + r 2 计算s_2=r\cdot \beta+r_2 计算s2=rβ+r2


V e r i f y p e d e r s e n − e l g a m a l ( p k , e 1 , e 2 , c o m m , c 1 , c 2 , c 3 , s 1 , s 2 ) → b ∈ { 0 , 1 } : Verify_{pedersen-elgamal}(pk,e_1,e_2,comm,c_1,c_2,c_3,s_1,s_2) \rightarrow b \in\{0,1\}: Verifypedersenelgamal(pk,e1,e2,comm,c1,c2,c3,s1,s2)b{ 0,1}:

  • 通过 F i a t − S h a m i r 变换计算 β = h a s h ( G , H , p k , e 1 , e 2 , c o m m , c 1 , c 2 , c 3 ) 通过Fiat-Shamir变换计算\beta = hash(G,H,pk,e_1,e_2,comm,c_1,c_2,c_3) 通过FiatShamir变换计算β=hash(G,H,pk,e1,e2,comm,c1,c2,c3)
  • 随机选取 α 0 , α 1 , α 2 ∈ F 随机选取\alpha_0,\alpha_1,\alpha_2\in F 随机选取α0,α1,α2F
  • 令 k = [ α 1 s 1 + α 0 s 2 + α 2 s 1 , α 2 s 2 , α 1 s 2 , − α 0 β , − α 1 β , − α 2 β , − α 0 , − α 1 , − α 2 ] 令k= [\alpha_1 s_1+ \alpha_0 s_2+\alpha_2 s_1,\alpha_2 s_2,\alpha_1 s_2,-\alpha_0 \beta,-\alpha_1 \beta,-\alpha_2 \beta,-\alpha_0,-\alpha_1,-\alpha_2] k=[α1s1+α0s2+α2s1,α2s2,α1s2,α0β,α1β,α2β,α0,α1,α2]
  • 令 l = [ G , H , p k , e 1 , e 2 , c o m m , c 1 , c 2 , c 3 ] 令l= [G,H,pk,e_1,e_2,comm,c_1,c_2,c_3] l=[G,H,pk,e1,e2,comm,c1,c2,c3]
  • 验证 ∑ i = 0 8 k i ∗ l i   ? = 0 验证\sum_{i=0}^{8}k_i *l_i \ ?= 0 验证i=08kili ?=0
  • 如果验证都通过,则输出 1 ,否则输出 0 如果验证都通过,则输出1,否则输出0 如果验证都通过,则输出1,否则输出0


这里Proof和Verify是通过matrix_sigma算法来生成证明和验证证明的。

撇开matrix_sigma,在验证过程中,我们只需要验证以下三点:

  • s 2 ⋅ G   ? = β ⋅ e 1 + c 1 s_2\cdot G \ ?=\beta \cdot e_1 +c_1 s2G ?=βe1+c1
  • s 1 ⋅ G + s 2 ⋅ p k   ? = β ⋅ e 2 + c 2 s_1\cdot G +s_2 \cdot pk \ ?=\beta \cdot e_2 +c_2 s1G+s2pk ?=βe2+c2
  • s 1 ⋅ G + s 2 ⋅ H   ? = β ⋅ c o m m + c 3 s_1\cdot G +s_2 \cdot H \ ?=\beta \cdot comm +c_3 s1G+s2H ?=βcomm+c3

猜你喜欢

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