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): Proofpedersen−elgamal(m,r,pk,e1,e2,comm)→(c1,c2,c3,s1,s2):
- 随机选取 r 1 , r 2 ∈ F 随机选取r_1,r_2 \in F 随机选取r1,r2∈F
- 计算 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) 通过Fiat−Shamir变换计算β=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\}: Verifypedersen−elgamal(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) 通过Fiat−Shamir变换计算β=hash(G,H,pk,e1,e2,comm,c1,c2,c3)
- 随机选取 α 0 , α 1 , α 2 ∈ F 随机选取\alpha_0,\alpha_1,\alpha_2\in F 随机选取α0,α1,α2∈F
- 令 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=08ki∗li ?=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 s2⋅G ?=β⋅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 s1⋅G+s2⋅pk ?=β⋅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 s1⋅G+s2⋅H ?=β⋅comm+c3