基于Sigma protocol实现的零知识证明protocol集锦

1. 背景知识

Sigma protocols,又称为 3 phase protocols,用于证明knowledge of values in some relation,但是又不泄露values的具体值。

如用于证明knowledge of discrete log:given g g g and y y y,prove knowledge of x x x 满足 g x = y g^x=y gx=y without revealing x x x

本文将介绍如何构建Sigma protocols来证明各种关系,如:

  • knowledge of discrete log
  • equality of discrete log
  • inequality of 2 given discrete logs
  • knowledge of multiple discrete logs
  • composition of many Sigma protocols
  • knowledge of message and randomness in a Pedersen commitment
  • equality of message in 2 Pedersen commitments

同时提供了Python 代码示例,用于说明在elliptic curves 上如何实现相应的构建。

1.1 零知识证明中的术语

  • Witness:the value being proven knowledge of。待证明的信息,仅Prover知道,不对Verifier泄露。目的就是:在不将witness泄露给Verifier的情况下,Prover知道满足某关系的witness并提供相应的proof,使Verifier根据proof和instance信息确信“Prover确实知道满足指定关系的witness”。对adversary而言,由于其不知道相应的witness,由adversary提供的proof应总是被验证失败。
  • Instance:描述关系中除witness外的所有其它元素,均统称为instance。instance为public information,对于Prover和Verifier均已知。
  • Prover: the entity proving the knowledge of the witness。用于证明其知道witness的一方叫做Prover,Prover提供proof。
  • Verifier:the other party that the prover needs to convince of the knowledge of witness。验证proof的一方叫做Verifier。

以proof of knowledge of discrete log 为例:( y = g x y=g^x y=gx)
Witness: x x x
Instance: y y y g g g

1.2 Sigma protocol

Sigma protocol可分三步描述:

  • 1)Commitment:
    The prover generates a random number, creates a commitment to that randomness and sends the commitment to the verifier.

  • 2)Challenge:
    After getting the commitment, the verifier generates a random number as a challenge and sends it to the prover. It is important that the verifier does not send the challenge before getting the commitment or else the prover can cheat.

  • 3)Response:
    The prover takes the challenge and creates a response using the random number chosen in step 1), the challenge and the witness. The prover will then send the response to the verifier who will do some computation and will or will not be convinced of the knowledge of the witness.

以上描述的Sigma protocol为interactive protocol,要求Prover和Verifier必须同时在线,且能相互发送消息来完成整个流程。利用Fiat-Shamir heuristic,可将其转化为non-interactive:即不需要Verifier在第2步中发送challenge,Prover自己模拟一个challenge(by using a hash function to hash something specific to this protocol execution. 该hash函数的输入可为:如第1步中生成的commitment以及其它instance数据。)在non-interactive protocol中,Prover可以创建proof,而任意的Verifier都可以verify the proof。

仍以proof of knowledge of discrete log 为例:( y = g x y=g^x y=gx)【该协议也可称为Schnorr identification protocol或Schnorr protocol。】

  • 1)Commitment:
    Prover选择随机数 r r r,创建commitment t = g r t=g^r t=gr,将 t t t值发送给Verifier。

  • 2)Challenge:
    Verifier存储 t t t值,生成随机challenge c c c,将 c c c值发送给Prover。

  • 3)Response:
    Prover根据收到的challenge c c c值,创建response s = r + x ∗ c s=r+x*c s=r+xc,将 s s s值发送给Verifier。

Verifier只需要验证 g s = y c ∗ t g^s=y^c*t gs=yct成立,即可相信Prover确实知道相应的 x x x使得 y = g x y=g^x y=gx成立。

1.2.1 注意事项一:Prover应每次使用新的随机数 r r r

每次生成proof时,Prover都应选择不同的新的随机数 r r r,否则会造成 x x x泄露。
具体为:

  • 1.1)Prover:选择随机数 r r r,计算 t = g r t=g^r t=gr,将 t t t发送给Verifier;

  • 1.2)Verifier:存储 t t t,发送challenge c 1 c_1 c1给Prover;

  • 1.3)Prover:根据 r r r c 1 c_1 c1,计算response s 1 = r + c 1 ∗ x s_1=r+c_1*x s1=r+c1x,将 s 1 s_1 s1发送给Verifier。

  • 2.1)Prover:仍然选择相同的随机数 r r r,计算 t = g r t=g^r t=gr,将 t t t发送给Verifier;

  • 2.2)Verifier:存储 t t t,发送challenge c 2 c_2 c2给Prover;

  • 2.3)Prover:根据 r r r c 1 c_1 c1,计算response s 2 = r + c 2 ∗ x s_2=r+c_2*x s2=r+c2x,将 s 1 s_1 s1发送给Verifier。

若Prover采用了相同的随机数 r r r,则Verifier根据收到的 s 1 s_1 s1 s 2 s_2 s2,可计算出 x = ( s 1 − s 2 ) / ( c 1 − c 2 ) x=(s_1-s_2)/(c_1-c_2) x=(s1s2)/(c1c2),从而造成 witness x x x 的泄露。

1.2.2 注意事项二:Prover应无法预测challenge c c c

Prover应无法预测challenge c c c,否则Prover可在不知道witness x x x的情况下,伪造证明使Verifier信服。
正常情况下,若Prover应无法预测challenge c c c,Verifier根据其收到的 s ( = r + c ∗ x ) s(=r+c*x) s(=r+cx),验证 g s = y c ∗ t g^s=y^c*t gs=yct成立,则可认为Prover确实知道witness x x x 使得 y = g x y=g^x y=gx成立。

但是,若Prover可预测到challenge c c c值,则其在构建 t t t时不再是基于随机数 r r r,而是可以直接计算 t = y − c ∗ g s t=y^{-c}*g^s t=ycgs(不需要 x x x参与计算),使得 g s = y c ∗ t g^s=y^c*t gs=yct恒成立。

1.2.3 make the protocol non-interactive

利用Fiat-Shamir heuristic,Prover使用hash function Hash 来生成相应的challenge c c c(应保证Prover无法预测Hash函数的输出,否则如1.2.2节所示Prover可以作弊。)。
non-interactive protocol可让Verifier不再需要生成随机数 c c c,使得Verifier的实现更简单。
non-interactive的详细实现为:

  • 1)Prover:Prover生成随机数 r r r,创建commitment t = g r t=g^r t=gr;Prover将 g , t , y g,t,y g,t,y作为hash函数输入计算challenge c ( = H a s h ( g , y , t ) ) c(=Hash(g,y,t)) c(=Hash(g,y,t));Prover计算response s = r + c ∗ x s=r+c*x s=r+cx。Prover将 ( t , s ) (t,s) (t,s)发送给Verifier。

Verifier根据收到的 t t t和instance g , y g,y g,y,利用相同的Hash函数计算 c = H a s h ( g , y , t ) c=Hash(g,y,t) c=Hash(g,y,t),再结合收到的 s s s,验证 g s = y c ∗ t g^s=y^c*t gs=yct是否成立即可。

实际实现时, t t t的size可能要远远大于 c c c s s s的size(注意: t t t为group element, c 和 s c和s cs 为field element)。为了降低传输压力,Prover发送 ( t , s ) (t,s) (t,s)可改为发送 ( c , s ) (c,s) (c,s)。调整为:

  • 1)Prover:Prover生成随机数 r r r,创建commitment t = g r t=g^r t=gr;Prover将 g , t , y g,t,y g,t,y作为hash函数输入计算challenge c ( = H a s h ( g , y , t ) ) c(=Hash(g,y,t)) c(=Hash(g,y,t));Prover计算response s = r + c ∗ x s=r+c*x s=r+cx。Prover将 ( c , s ) (c,s) (c,s)发送给Verifier。

Verifier根据收到的 ( c , s ) (c,s) (c,s),假设 g s = y c ∗ t g^s=y^c*t gs=yct成立,计算 t ( = g s ∗ y − c ) t(=g^s*y^{-c}) t(=gsyc),利用 t , g , y t,g,y t,g,y作为相同hash函数的输入,计算 c ’ = h a s h ( g , y , t ) c’=hash(g,y,t) c=hash(g,y,t),验证 c = c ’ c=c’ c=c是否成立即可。

以上non-interactive protocol即是Schnorr signatures的核心思想。可将Schnorr signature看作是proof of knowledge of secret key corresponding to a public key ( x x x in g x g^x gx),而被签名的消息 m m m增加作为hash函数的输入,以此来生成challenge。(the message being signed is just hashed in the challenge in addition to other stuff we saw above.)
(可参见博客 Schnorr signature (Schnorr 签名)数学原理

2. 基于Sigma protocol实现基础协议

以下罗列了一些基于Sigma protocol实现的基础关系证明,主要针对的是non-interactive场景。

2.1 Protocol 1. Equality of discrete logs

证明Prover知道witness x x x,使得 g x = y 且 h x = z g^x=y且h^x=z gx=yhx=z
Witness: x x x
Instance: g , h , y , z g,h,y,z g,h,y,z
Relation: g x = y g^x=y gx=y h x = z h^x=z hx=z

具体实现可为:
1)Prover:

  • 生成随机数 r r r,采用相同的 r r r创建2个commitment t 1 = g r , t 2 = h r t_1=g^r,t_2=h^r t1=gr,t2=hr
  • g , h , y , z , t 1 , t 2 g,h,y,z,t_1,t_2 g,h,y,z,t1,t2为输入,生成challenge c = H a s h ( g , h , y , z , t 1 , t 2 ) c=Hash(g,h,y,z,t_1,t_2) c=Hash(g,h,y,z,t1,t2)
  • 创建response s = r + c ∗ x s=r+c*x s=r+cx
  • 发送 ( t 1 , t 2 , s ) (t_1,t_2,s) (t1,t2,s) 给Verifier。

2)Verifier:

  • 验证 g s = y c ∗ t g^s=y^c*t gs=yct h s = z c ∗ t h^s=z^c*t hs=zct是否同时成立即可。

2.2 Protocol 2. Conjunction (AND) of discrete logs

证明Prover知道witness a , b a,b a,b,使得 g a = P 且 h b = Q g^a=P且h^b=Q ga=Phb=Q
Witness: a , b a,b a,b
Instance: g , h , P , Q g,h,P,Q g,h,P,Q
Relation: g a = P 且 h b = Q g^a=P且h^b=Q ga=Phb=Q

具体实现可为:【相当于并行执行2个 ”knowledge of discrete log” protocol】
1)Prover:

  • 生成随机数 r 1 , r 2 r_1,r_2 r1,r2,分别创建2个commitment t 1 = g r 1 , t 2 = h r 2 t_1=g^{r_1},t_2=h^{r_2} t1=gr1,t2=hr2
  • g , h , P , Q , t 1 , t 2 g,h,P,Q,t_1,t_2 g,h,P,Q,t1,t2为输入,生成challenge c = H a s h ( g , h , P , Q , t 1 , t 2 ) c=Hash(g,h,P,Q,t_1,t_2) c=Hash(g,h,P,Q,t1,t2)
  • 创建response s 1 = r 1 + c ∗ x , s 2 = r 2 + c ∗ x s_1=r_1+c*x,s_2=r_2+c*x s1=r1+cx,s2=r2+cx
  • 发送 ( t 1 , t 2 , s 1 , s 2 ) (t_1,t_2,s_1,s_2) (t1,t2,s1,s2) 给Verifier。

2)Verifier:

  • 验证 g s 1 = y c ∗ t 1 g^{s_1}=y^c*t_1 gs1=yct1 h s 2 = z c ∗ t 2 h^{s_2}=z^c*t_2 hs2=zct2是否同时成立即可。

2.3 Protocol 3. Disjunction (OR) of discrete logs

证明Prover知道witness a a a使得 g a = P g^a=P ga=P,或者,知道witness b b b使得 h b = Q h^b=Q hb=Q,但是,无法同时知道 a , b a,b a,b使得 g a = P 且 h b = Q g^a=P且h^b=Q ga=Phb=Q同时成立。
不能暴露Prover到底知道的是 a a a还是 b b b

假设Prover仅知道 a a a使得 g a = P g^a=P ga=P【<1>,可诚信证明】,而不知道 b b b使得 h b = Q h^b=Q hb=Q【<2>,需伪造证明】,具体实现可为:
1)Prover:

  • 生成用于证明<1>随机数 r 1 r_1 r1,构建第1个commitment t 1 = g r 1 t_1=g^{r_1} t1=gr1
  • 生成用于证明<2>的challenge c 2 c_2 c2和随机response s 2 s_2 s2,(由于Prover由于不知道 b b b,只能随机生成,采用1.2.2节中的方式来伪造证明),构建第2个commitment t 2 = h s 2 ∗ Q − c 2 t_2=h^{s_2}*Q^{-c_2} t2=hs2Qc2
  • 计算hash值 c = H a s h ( g , h , P , Q , t 1 , t 2 ) c=Hash(g,h,P,Q,t_1,t_2) c=Hash(g,h,P,Q,t1,t2),计算用于证明<1>的challenge c 1 = c − c 2 c_1=c-c_2 c1=cc2
  • 计算用于证明<1>的response s 1 = r 1 + a ∗ c 1 s_1=r_1+a*c_1 s1=r1+ac1
  • 发送 ( ( t 1 , c 1 , s 1 ) , ( t 2 , c 2 , s 2 ) ) ((t_1,c_1,s_1),(t_2,c_2,s_2)) ((t1,c1,s1),(t2,c2,s2)) 给Verifier。

2)Verifier:
可同时验证 g s 1 = P c 1 ∗ t 1 g^{s_1}=P^{c_1}*t_1 gs1=Pc1t1 h s 2 = Q c 2 ∗ t 2 h^{s_2}=Q^{c_2}*t_2 hs2=Qc2t2均成功,由于Verifier 可计算 c = H a s h ( g , h , P , Q , t 1 , t 2 ) c=Hash(g,h,P,Q,t_1,t_2) c=Hash(g,h,P,Q,t1,t2),其收到的 c 1 , c 2 c_1,c_2 c1,c2满足 c 1 + c 2 = c c_1+c_2=c c1+c2=c,相比于2.2节的AND proof,Verifier可确信Prover确实知道 a a a OR b b b

Jan Camenisc等人1997年论文《Proof Systems for General Statements about Discrete Logarithms》中,也有一些证明方案(参见博客 密码学中的sigma-protocol 第2节中提到的OR证明。),其中的OR证明【repsonse格式改为 s = r − c ∗ x s=r-c*x s=rcx格式】,Prover发送给Verifier的内容调整为了 ( c 1 , c 2 , s 1 , s 2 ) (c_1,c_2,s_1,s_2) (c1,c2,s1,s2);Verifier计算 t 1 = g s 1 P c 1 , t 2 = h s 2 Q c 2 t_1=g^{s_1}P^{c_1},t_2=h^{s_2}Q^{c_2} t1=gs1Pc1,t2=hs2Qc2,同时验证 c 1 + c 2 = H ( g , h , P , Q , t 1 , t 2 ) c_1+c_2=H(g,h,P,Q,t_1,t_2) c1+c2=H(g,h,P,Q,t1,t2)是否成立即可。具体为:
1)Prover:

  • 生成用于证明<1>随机数 r 1 r_1 r1,构建第1个commitment t 1 = g r 1 t_1=g^{r_1} t1=gr1
  • 生成用于证明<2>的challenge c 2 c_2 c2和随机response s 2 s_2 s2,(由于Prover由于不知道 b b b,只能随机生成,采用1.2.2节中的方式来伪造证明),构建第2个commitment t 2 = h s 2 ∗ Q c 2 t_2=h^{s_2}*Q^{c_2} t2=hs2Qc2
  • 计算hash值 c = H a s h ( g , h , P , Q , t 1 , t 2 ) c=Hash(g,h,P,Q,t_1,t_2) c=Hash(g,h,P,Q,t1,t2),计算用于证明<1>的challenge c 1 = c − c 2 c_1=c-c_2 c1=cc2
  • 计算用于证明<1>的response s 1 = r 1 − a ∗ c 1 s_1=r_1-a*c_1 s1=r1ac1
  • 发送 ( ( c 1 , s 1 ) , ( c 2 , s 2 ) ) ((c_1,s_1),(c_2,s_2)) ((c1,s1),(c2,s2)) 给Verifier。

2)Verifier:
计算 t 1 = g s 1 P c 1 , t 2 = h s 2 Q c 2 t_1=g^{s_1}P^{c_1},t_2=h^{s_2}Q^{c_2} t1=gs1Pc1,t2=hs2Qc2,同时验证 c 1 + c 2 = H ( g , h , P , Q , t 1 , t 2 ) c_1+c_2=H(g,h,P,Q,t_1,t_2) c1+c2=H(g,h,P,Q,t1,t2)是否成立即可。相比于2.2节的AND proof,Verifier可确信Prover确实知道 a a a OR b b b

2.4 Protocol 4. Knowledge of the opening of Pedersen commitment

Pedersen commitment: P = C o m ( m ; r ) = g m h r P=Com(m;r)=g^mh^r P=Com(m;r)=gmhr,其中 ( m , r ) (m,r) (m,r)称为the opening of the commitment。
证明Prover知道witness ( m , r ) (m,r) (m,r),使得 P = g m ∗ h r P=g^m*h^r P=gmhr
Witness: m , r m,r m,r
Instance: g , h , P g,h,P g,h,P
Relation: P = g m ∗ h r P=g^m*h^r P=gmhr

具体实现可为:
1)Prover:

  • 生成随机数 r 1 , r 2 r1,r_2 r1,r2,创建commitment t = g r 1 ∗ h r 2 t=g^{r_1}*h^{r_2} t=gr1hr2
  • 构建challenge c = H a s h ( g , h , P , t ) c=Hash(g,h,P,t) c=Hash(g,h,P,t)
  • 计算response s 1 = r 1 + m ∗ c , s 2 = r 2 + r ∗ c s_1=r_1+m*c,s_2=r_2+r*c s1=r1+mc,s2=r2+rc
  • ( t , s 1 , s 2 ) (t,s_1,s_2) (t,s1,s2)发送给Verifier。

2)Verifier:

  • 验证 t ∗ P c = g s 1 ∗ h s 2 t*P^c=g^{s_1}*h^{s_2} tPc=gs1hs2是否成立即可。

若将上述流程用于证明vector Pedersen commitment P = g 1 m 1 ∗ g 2 m 2 ∗ ⋯ ∗ g n m n ∗ h r P=g_1^{m_1}*g_2^{m_2}*\cdots *g_n^{m_n}*h^r P=g1m1g2m2gnmnhr,则相应Prover发送给Verifier的内容长度为 Θ ( n ) \Theta(n) Θ(n)—— ( t , s 1 , s 2 , ⋯   , s n , s n + 1 ) (t,s_1,s_2,\cdots,s_n,s_{n+1}) (t,s1,s2,,sn,sn+1)

2.5 Protocol 5. Equality of the opening of 2 Pedersen commitment

证明Prover知道witness ( a , b ) (a,b) (a,b),使得 P = g 1 a ∗ h 1 b 且 Q = g 2 a ∗ h 2 b P=g_1^a*h_1^b且Q=g_2^a*h_2^b P=g1ah1bQ=g2ah2b
Witness: a , b a,b a,b
Instance: g 1 , h 1 , g 2 , h 2 , P , Q g_1,h_1,g_2,h_2,P,Q g1,h1,g2,h2,P,Q
Relation: P = g 1 a ∗ h 1 b 且 Q = g 2 a ∗ h 2 b P=g_1^a*h_1^b且Q=g_2^a*h_2^b P=g1ah1bQ=g2ah2b

具体实现可为:
1)Prover:

  • 生成随机数 r 1 , r 2 r1,r_2 r1,r2,创建commitment t 1 = g 1 r 1 ∗ h 1 r 2 , t 2 = g 2 r 1 ∗ h 2 r 2 t_1=g_1^{r_1}*h_1^{r_2},t_2=g_2^{r_1}*h_2^{r_2} t1=g1r1h1r2,t2=g2r1h2r2
  • 构建challenge c = H a s h ( g 1 , h 1 , g 2 , h 2 , P , Q , t 1 , t 2 ) c=Hash(g_1,h_1,g_2,h_2,P,Q,t_1,t_2) c=Hash(g1,h1,g2,h2,P,Q,t1,t2)
  • 计算response s 1 = r 1 + a ∗ c , s 2 = r 2 + b ∗ c s_1=r_1+a*c,s_2=r_2+b *c s1=r1+ac,s2=r2+bc
  • ( t 1 , t 2 , s 1 , s 2 ) (t_1,t_2,s_1,s_2) (t1,t2,s1,s2)发送给Verifier。

2)Verifier:

  • 验证 t 1 ∗ P c = g 1 s 1 ∗ h 1 s 2 且 t 2 ∗ Q c = g 2 s 1 ∗ h 2 s 2 t_1*P^c=g_1^{s_1}*h_1^{s_2}且t_2*Q^c=g_2^{s_1}*h_2^{s_2} t1Pc=g1s1h1s2t2Qc=g2s1h2s2是否成立即可。

(?没想明白,咋用于vector Pedersen commitment或more than 2 Pedersen commitments呢??)

2.6 Protocol 6. Equality of message in 2 Pedersen commitment

证明Prover知道witness ( a , b , d ) (a,b,d) (a,b,d),使得 P = g 1 a ∗ h 1 b 且 Q = g 2 a ∗ h 2 d P=g_1^a*h_1^b且Q=g_2^a*h_2^d P=g1ah1bQ=g2ah2d
Witness: a , b , d a,b,d a,b,d
Instance: g 1 , h 1 , g 2 , h 2 , P , Q g_1,h_1,g_2,h_2,P,Q g1,h1,g2,h2,P,Q
Relation: P = g 1 a ∗ h 1 b 且 Q = g 2 a ∗ h 2 d P=g_1^a*h_1^b且Q=g_2^a*h_2^d P=g1ah1bQ=g2ah2d

具体实现可为:
1)Prover:

  • 生成随机数 r 1 , r 2 , r 3 r1,r_2,r_3 r1,r2,r3,创建commitment t 1 = g 1 r 1 ∗ h 1 r 2 , t 2 = g 2 r 1 ∗ h 2 r 3 t_1=g_1^{r_1}*h_1^{r_2},t_2=g_2^{r_1}*h_2^{r_3} t1=g1r1h1r2,t2=g2r1h2r3
  • 构建challenge c = H a s h ( g 1 , h 1 , g 2 , h 2 , P , Q , t 1 , t 2 ) c=Hash(g_1,h_1,g_2,h_2,P,Q,t_1,t_2) c=Hash(g1,h1,g2,h2,P,Q,t1,t2)
  • 计算response s 1 = r 1 + a ∗ c , s 2 = r 2 + b ∗ c , s 3 = r 3 + d ∗ c s_1=r_1+a*c,s_2=r_2+b *c,s_3=r_3+d*c s1=r1+ac,s2=r2+bc,s3=r3+dc
  • ( t 1 , t 2 , s 1 , s 2 , s 3 ) (t_1,t_2,s_1,s_2,s_3) (t1,t2,s1,s2,s3)发送给Verifier。

2)Verifier:

  • 验证 t 1 ∗ P c = g 1 s 1 ∗ h 1 s 2 且 t 2 ∗ Q c = g 2 s 1 ∗ h 2 s 3 t_1*P^c=g_1^{s_1}*h_1^{s_2}且t_2*Q^c=g_2^{s_1}*h_2^{s_3} t1Pc=g1s1h1s2t2Qc=g2s1h2s3是否成立即可。

注意:whenever we prove some witness values are the same across different relations, the same random value is used in their corresponding commitments。如上,P和Q的 a a a相同,则构建的commitment t 1 和 t 2 t_1和t_2 t1t2中的 r 1 r_1 r1应相同。

可参看博客 Hyrax: Doubly-efficient zkSNARKs without trusted setup学习笔记 3.3节中的“proof of commitment to the same value”,所构建的证明算法proof size更小:
在这里插入图片描述

2.7 Protocol 7. Inequality of discrete logs

该协议首次在Jan Camenisch和Victor Shoup 2003年论文《Practical Verifiable Encryption and Decryption of Discrete Logarithms∗》中第6节提及。
证明Prover知道witness ( a ) (a) (a),使得 P = g a , Q = h b , 且 a ≠ b P=g^a,Q=h^b,且a\neq b P=gaQ=hba=b
Witness: a a a
Instance: g , h , P , Q g,h,P,Q g,h,P,Q
Relation: P = g a , Q = h b , 且 a ≠ b P=g^a,Q=h^b,且a\neq b P=gaQ=hba=b

具体实现可为:
1)Prover:

  • 生成随机数 r r r,创建commitment C = h a ∗ r ∗ Q − r = h α ∗ Q β C=h^{a*r}*Q^{-r}=h^{\alpha}*Q^{\beta} C=harQr=hαQβ;【若 a ≠ b a\neq b a=b,Prover仅需证明 h α ∗ Q β = C , C ≠ 1 且 g α ∗ P β = 1 h^{\alpha}*Q^{\beta}=C,C\neq 1且g^{\alpha}*P^{\beta}=1 hαQβ=CC=1gαPβ=1。可将 1 1 1 C C C看成是Pedersen commitments to message α \alpha α和randomness β \beta β with different generators h , Q , g , P h,Q,g,P h,Q,g,P。可参照2.5节的Protocol 5方式执行,获得相应的 ( t 1 , t 2 , s 1 , s 2 ) (t_1,t_2,s_1,s_2) (t1,t2,s1,s2)
  • ( C , t 1 , t 2 , s 1 , s 2 ) (C,t_1,t_2,s_1,s_2) (C,t1,t2,s1,s2)发送给Verifier。

2)Verifier:

  • 验证 C ≠ 1 C\neq 1 C=1且按Protocol 5验证程序执行是否均成立即可。

示例代码 中,采用的Elliptic curve,其中 1 1 1对应的是the identity element (the point at infinity) on the curve。

def verify_discrete_log_inequality(g, h, P, Q, C, t1s1, t2s2):
	    if C.is_identity:
	        return False
	

	    # iden is the identity element so adding or subtracting it from something makes no difference
	    iden = C - C
	    return verify_knowledge_and_eq_of_opening_of_pedersen_commitments(g, P, h, Q, iden, C, t1s1, t2s2)

2.8 Argument of Knowledge of Commitment Openings

详情见Groth 2009年论文《Linear Algebra with Sub-linear Zero-Knowledge Arguments》中附录A,
Witness: x ⃗ 1 , ⋯   , x ⃗ m ∈ Z p n \vec{x}_1,\cdots,\vec{x}_m\in\mathbb{Z}_p^n x 1,,x mZpn r 1 , ⋯   , r m ∈ Z p r_1,\cdots,r_m\in\mathbb{Z}_p r1,,rmZp
Instance: c 1 , ⋯   , c m ∈ G c_1,\cdots,c_m\in\mathbb{G} c1,,cmG
Relation: c i = C o m ( x i ; r i ) c_i=Com(x_i;r_i) ci=Com(xi;ri)

具体实现为:

  • Prover:生成随机数 x ⃗ 0 ← Z p n , r 0 ← Z p \vec{x}_0\leftarrow \mathbb{Z}_p^n, r_0\leftarrow \mathbb{Z}_p x 0Zpn,r0Zp,计算commitment c 0 = c o m ( x ⃗ 0 ; r 0 ) c_0=com(\vec{x}_0;r_0) c0=com(x 0;r0),将 c 0 ∈ G c_0\in\mathbb{G} c0G发送给Verifier。
  • Verifier:给Prover发送random challenge e ← Z p e\leftarrow \mathbb{Z}_p eZp
  • Prover:计算 z ⃗ = ∑ i = 1 m e i x ⃗ i \vec{z}=\sum_{i=1}^{m}e^i\vec{x}_i z =i=1meix i s = ∑ i = 1 m e i r i s=\sum_{i=1}^{m}e^ir_i s=i=1meiri,将 z ⃗ ∈ Z p n \vec{z}\in\mathbb{Z}_p^n z Zpn s ∈ Z p s\in\mathbb{Z}_p sZp发送给Verifier。
  • Verifier:验证 ∏ i = 0 m c i e i = c o m ( z ⃗ ; s ) \prod_{i=0}^{m}c_i^{e^i}=com(\vec{z};s) i=0mciei=com(z ;s)是否成立即可。

2.9 knowledge of commitment opening product relation or multiplication relation

参见博客 Hyrax: Doubly-efficient zkSNARKs without trusted setup学习笔记
Wahby 等人2018年论文《Hyrax: Doubly-efficient zkSNARKs without trusted setup》中Figure 5。
证明Prover 知道witness x , y x,y x,y使得 X = g x , Y = g y , Z = g x y X=g^x,Y=g^y,Z=g^{xy} X=gx,Y=gy,Z=gxy
Witness: x , y ∈ Z p x,y\in\mathbb{Z}_p x,yZp
Instance: X , Y , Z , g ∈ G X,Y,Z,g\in\mathbb{G} X,Y,Z,gG
Relation: X = g x ∧ Y = g y ∧ Z = g x y X=g^x\wedge Y=g^y\wedge Z=g^{xy} X=gxY=gyZ=gxy

具体实现为:

  • Prover:生成随机数 b 1 , b 3 ∈ R Z p b_1,b_3\in_R\mathbb{Z}_p b1,b3RZp,,计算commitment α = g b 1 , β = g b 3 , δ = X b 3 \alpha=g^{b_1},\beta=g^{b_3}, \delta=X^{b_3} α=gb1,β=gb3,δ=Xb3,将 α , β , δ ∈ G \alpha,\beta,\delta\in\mathbb{G} α,β,δG发送给Verifier。
  • Verifier:给Prover 发送 random challenge c ∈ R Z p c\in_R\mathbb{Z}_p cRZp
  • Prover:计算 z 1 = b 1 + c x , z 3 = b 3 + c y z_1=b_1+cx,z_3=b_3+cy z1=b1+cx,z3=b3+cy,将 z 1 , z 3 ∈ Z p z_1,z_3\in\mathbb{Z}_p z1,z3Zp发送给Verifier。
  • Verifier:验证 α ⋅ X c = g z 1 且 β ⋅ Y c = g z 3 且 δ ⋅ Z c = X z 3 \alpha\cdot X^c=g^{z_1}且\beta\cdot Y^c=g^{z_3} 且 \delta\cdot Z^c=X^{z_3} αXc=gz1βYc=gz3δZc=Xz3 成立即可。

在这里插入图片描述

2.10 batch schnorr 证明

Gennaro等人2004年论文[25]《Batching Schnorr identification scheme with applications to privacy-preserving authorization and low-bandwidth communication devices》:
在这里插入图片描述
在这里插入图片描述

2.11 ∑ \sum -protocol for commitment to 0 or 1

Groth和Kohlweiss 2015年论文《One-out-of-Many Proofs: Or How to Leak a Secret and Spend a Coin》中关注的场景为:

  • public info:commitment c c c
  • private info: m , r m,r m,r
  • relation: m ∈ { 0 , 1 } m\in\{0,1\} m{0,1}

核心思想为:
m ∈ { 0 , 1 } m\in\{0,1\} m{0,1},则 m ( 1 − m ) = 0 m(1-m)=0 m(1m)=0成立。

相应的证明为:
在这里插入图片描述

2.12 ∑ \sum -protocol for one out of N N N commitments containing 0

Groth和Kohlweiss 2015年论文《One-out-of-Many Proofs: Or How to Leak a Secret and Spend a Coin》中针对的场景为:

  • public info: N N N个commitments c 0 , ⋯   , c N − 1 c_0,\cdots,c_{N-1} c0,,cN1
  • private info: l ∈ { 0 , ⋯   , N − 1 } l\in\{0,\cdots,N-1\} l{0,,N1} 以及 r ∈ Z q r\in\mathbb{Z}_q rZq
  • relation: c l = C o m c k ( 0 ; r ) c_l=Com_{ck}(0;r) cl=Comck(0;r)

核心思想为:
若one of the commitments contains 0,等价为 存在an index l l l 使得 ∏ i = 0 N − 1 c i δ i l \prod_{i=0}^{N-1}c_i^{\delta_{il}} i=0N1ciδil为a commitment to 0,其中 δ i l \delta_{il} δil为Kronecker’s delta,即 δ l l = 1 \delta_{ll}=1 δll=1 and δ i l = 0 \delta_{il}=0 δil=0 for i ≠ l i\neq l i=l

假设 N = 2 n N=2^n N=2n,将 i , l i,l i,l以二进制表示: i = i 1 ⋯ i n , l = l 1 ⋯ l n i=i_1\cdots i_n, l=l_1\cdots l_n i=i1in,l=l1ln,则 δ i l \delta_{il} δil可表示为 δ i l = ∏ j = 1 n δ i j l j \delta_{il}=\prod_{j=1}^{n}\delta_{i_jl_j} δil=j=1nδijlj,从而转换为证明 ∏ i = 0 N − 1 c i ∏ j = 1 n δ i j l j \prod_{i=0}^{N-1}c_i^{\prod_{j=1}^{n}\delta_{i_jl_j}} i=0N1cij=1nδijlj 为 a commitment to 0:

  • Prover:make commitments c l 1 , ⋯   , c l n c_{l_1},\cdots,c_{l_n} cl1,,cln to the bits l 1 , ⋯   , l n l_1,\cdots,l_n l1,,ln
    然后执行图1的 n n n parallel ∑ \sum -protocol来 prove knowledge of openings of these commitments to values l j ∈ { 0 , 1 } l_j\in\{0,1\} lj{0,1}
    在证明 l j ∈ { 0 , 1 } l_j\in\{0,1\} lj{0,1} ∑ \sum -protocols中,Prover会reveal f 1 , ⋯   , f n f_1,\cdots,f_n f1,,fn of the form f j = l j x + a j f_j=l_jx+a_j fj=ljx+aj
    假设 f j , 1 = f j = l j x + a j = δ 1 l j x + a j , f j , 0 = x − f j = ( 1 − l j ) x − a j = δ 0 l j x − a j f_{j,1}=f_j=l_jx+a_j=\delta_{1l_j}x+a_j, f_{j,0}=x-f_j=(1-l_j)x-a_j=\delta_{0l_j}x-a_j fj,1=fj=ljx+aj=δ1ljx+aj,fj,0=xfj=(1lj)xaj=δ0ljxaj,则对于每个 i i i,the product ∏ j = 1 n f j , i j \prod_{j=1}^{n}f_{j,i_j} j=1nfj,ij可表示为如下多项式:
    ∏ j = 1 n f j , i j = p i ( x ) = ∏ j = 1 n ( δ i j l j x ) + ∑ k = 0 n − 1 p i , k x k = δ i l x n + ∑ k = 0 n − 1 p i , k x k \prod_{j=1}^{n}f_{j,i_j}=p_i(x)=\prod_{j=1}^{n}(\delta_{i_jl_j}x)+\sum_{k=0}^{n-1}p_{i,k}x^k=\delta_{il}x^n+\sum_{k=0}^{n-1}p_{i,k}x^k j=1nfj,ij=pi(x)=j=1n(δijljx)+k=0n1pi,kxk=δilxn+k=0n1pi,kxk …… (1)
    其中 p i , k p_{i,k} pi,k为Prover witness。
    c i c_i ci为底, p i ( x ) p_i(x) pi(x)为幂,有:
    c i p i ( x ) = c i ∏ j = 1 n f j , i j = ( c i δ i l ) x n ⋅ ∏ k = 0 n − 1 ( c i p i , k ) x k c_i^{p_i(x)}=c_i^{\prod_{j=1}^{n}f_{j,i_j}}=(c_i^{\delta_{il}})^{x^n}\cdot \prod_{k=0}^{n-1} (c_i^{p_{i,k}})^{x^k} cipi(x)=cij=1nfj,ij=(ciδil)xnk=0n1(cipi,k)xk
    再次转换为:
    ∏ i = 0 N − 1 c i p i ( x ) = ∏ i = 0 N − 1 c i ∏ j = 1 n f j , i j = ∏ i = 0 N − 1 ( c i δ i l ) x n ⋅ ∏ k = 0 n − 1 ∏ i = 0 N − 1 ( c i p i , k ) x k \prod_{i=0}^{N-1}c_i^{p_i(x)}= \prod_{i=0}^{N-1} c_i^{\prod_{j=1}^{n}f_{j,i_j}}=\prod_{i=0}^{N-1} (c_i^{\delta_{il}})^{x^n} \cdot \prod_{k=0}^{n-1} \prod_{i=0}^{N-1} (c_i^{p_{i,k}})^{x^k} i=0N1cipi(x)=i=0N1cij=1nfj,ij=i=0N1(ciδil)xnk=0n1i=0N1(cipi,k)xk …… (2)
    由于 p i , k p_{i,k} pi,k为Prover witness,for k = 0 , ⋯   , n − 1 k=0,\cdots, n-1 k=0,,n1,Prover需计算 c d k = ∏ i = 0 N − 1 ( c i p i , k ) ⋅ C o m c k ( 0 ; ρ k ) c_{d_k}= \prod_{i=0}^{N-1} (c_i^{p_{i,k}})\cdot Com_{ck}(0;\rho_k) cdk=i=0N1(cipi,k)Comck(0;ρk)【其中 ρ k \rho_k ρk用于blinding p i , k p_{i,k} pi,k】,并将 c d 0 , ⋯   , c d n − 1 c_{d_0},\cdots,c_{d_{n-1}} cd0,,cdn1发送给Verifier。

对公式(2)再次转换有:
∏ i = 0 N − 1 ( c i δ i l ) x n = c l x n = ∏ i = 0 N − 1 c i ∏ j = 1 n f j , i j ⋅ ∏ k = 0 n − 1 ( c d k ) − x k \prod_{i=0}^{N-1} (c_i^{\delta_{il}})^{x^n}=c_l^{x^n}=\prod_{i=0}^{N-1} c_i^{\prod_{j=1}^{n}f_{j,i_j}}\cdot \prod_{k=0}^{n-1}(c_{d_k})^{-x^k} i=0N1(ciδil)xn=clxn=i=0N1cij=1nfj,ijk=0n1(cdk)xk

即证明 c l c_l cl为a commitment to 0,等价为证明 ∏ i = 0 N − 1 c i ∏ j = 1 n f j , i j ⋅ ∏ k = 0 n − 1 ( c d k ) − x k \prod_{i=0}^{N-1} c_i^{\prod_{j=1}^{n}f_{j,i_j}}\cdot \prod_{k=0}^{n-1}(c_{d_k})^{-x^k} i=0N1cij=1nfj,ijk=0n1(cdk)xk为a commitment to 0。Prover仅需将相应的blinding factor z d z_d zd发送给Verifier即可。
详细的“ ∑ \sum -protocol for one out of N N N commitments containing 0”证明为:
在这里插入图片描述

2.13 commitment to 0

参见博客 Zero-Knowledge Argument for Polynomial Evaluation with Application to Blacklists 代码解析 中的membership argument 中的场景:

  • public info:commitment c v c_v cv
  • witness: r r r
  • relation: c v = g 0 h r = h r c_v=g^0h^r=h^r cv=g0hr=hr

证明过程为:

  • Prover:选择random z z z,计算 t = h z t=h^z t=hz,将 t t t发送给Verifier;
  • Verifier:发送challenge x x x
  • Prover:发送 s = z + x ⋅ r s=z+x\cdot r s=z+xr
  • Verifier:验证 h s = t ⋅ c v x h^s=t\cdot c_v^x hs=tcvx 是否成立即可。

2.14 commitment to 非0

参见博客 Zero-Knowledge Argument for Polynomial Evaluation with Application to Blacklists 代码解析 中的Non-membership argument 中的场景:

  • public info:commitment c v c_v cv
  • witness: v , r v,r v,r
  • relation: c v = g v h r c_v=g^vh^r cv=gvhr v ≠ 0 v\neq 0 v=0

核心思想为:
v ≠ 0 v\neq 0 v=0,则 v − 1 v^{-1} v1 值存在。

证明思路为:

  • Prover:选择random y , z y,z y,z,计算 t = c v y h − z t=c_v^yh^{-z} t=cvyhz,将 t t t发送给Verifier;
  • Verifier:发送challenge x x x
  • Prover:计算 s 1 = y + x ⋅ v − 1 , s 2 = z + v − 1 ⋅ x ⋅ r s_1=y+x\cdot v^{-1}, s_2=z+v^{-1}\cdot x\cdot r s1=y+xv1,s2=z+v1xr,将 s 1 , s 2 s_1,s_2 s1,s2发送给Verifier;
  • Verifier:验证 c v s 1 = t ⋅ g x ⋅ h s 2 c_v^{s_1}=t\cdot g^x\cdot h^{s_2} cvs1=tgxhs2 即可。

2.15 commitment to multiple sequences of bits, exactly one 1 in each sequence

参见Bootle等人2015年论文《Short Accountable Ring Signatures Based on DDH》第5章内容,具体场景为:【 m m m n n n列,每行元素为0或1,每行元素之和为1。】

  • public info:commitment B B B
  • witness: b 0 , 0 , ⋯   , b m − 1 , n − 1 , r b_{0,0},\cdots,b_{m-1,n-1},r b0,0,,bm1,n1,r
  • relation: ∀ i , j : b j , i ∈ { 0 , 1 } \forall i,j:b_{j,i}\in\{0,1\} i,j:bj,i{0,1} ∀ j : ∑ i = 0 n − 1 b j , i = 1 \forall j: \sum_{i=0}^{n-1}b_{j,i}=1 j:i=0n1bj,i=1 B = C o m c k ( b 0 , 0 , ⋯   , b m − 1 , n − 1 ; r ) B=Com_{ck}(b_{0,0},\cdots,b_{m-1,n-1};r) B=Comck(b0,0,,bm1,n1;r)

核心思想为证明: b j , i ( 1 − b j , i ) = 0 b_{j,i}(1-b_{j,i})=0 bj,i(1bj,i)=0 for all i , j i,j i,j 以及 ∑ i = 0 n − 1 b j , i = 1 \sum_{i=0}^{n-1}b_{j,i}=1 i=0n1bj,i=1

详细的证明思路为:

  • Prover:选择随机数 r A , r B , r C , a j , 1 , ⋯   , a j , n − 1 ← Z q r_A,r_B,r_C,a_{j,1},\cdots,a_{j,n-1}\leftarrow \mathbb{Z}_q rA,rB,rC,aj,1,,aj,n1Zq,对 ∀ j \forall j j,设置 a j , 0 = − ∑ i = 1 n − 1 a j , i a_{j,0}=-\sum_{i=1}^{n-1}a_{j,i} aj,0=i=1n1aj,i。计算 A = C o m c k ( a 0 , 0 , ⋯   , a m − 1 , n − 1 ; r A ) , B = C o m c k ( { a j , i ( 1 − 2 b j , i ) } j , i = 0 m − 1 , n − 1 ; r C ) , C = C o m c k ( − a 0 , 0 2 , ⋯   , − a m − 1 , n − 1 2 ; r D ) A=Com_{ck}(a_{0,0},\cdots,a_{m-1,n-1};r_A), B=Com_{ck}(\{a_{j,i}(1-2b_{j,i})\}_{j,i=0}^{m-1,n-1};r_C), C=Com_{ck}(-a_{0,0}^2,\cdots,-a_{m-1,n-1}^2;r_D) A=Comck(a0,0,,am1,n1;rA),B=Comck({aj,i(12bj,i)}j,i=0m1,n1;rC),C=Comck(a0,02,,am1,n12;rD),将 A , C , D A,C,D A,C,D均发送给Verifier;
  • Verifier:发送challenge x x x
  • Prover:计算 ∀ j , i : f j , i = b j , i x + a j , i \forall j,i: f_{j,i}=b_{j,i}x+a_{j,i} j,i:fj,i=bj,ix+aj,i 以及 z A = r x + r A , z C = r C x + r D z_A=rx+r_A,z_C=r_Cx+r_D zA=rx+rA,zC=rCx+rD,将 f 0 , 1 , f 1 , 1 , ⋯   , f m − 1 , n − 1 , z A , z C f_{0,1},f_{1,1},\cdots,f_{m-1,n-1},z_A,z_C f0,1,f1,1,,fm1,n1,zA,zC 发送给Verifier;
  • Verifier:验证 ∀ j : f j , 0 = x − ∑ i = 1 n − 1 f j , i \forall j: f_{j,0}=x-\sum_{i=1}^{n-1}f_{j,i} j:fj,0=xi=1n1fj,i 【证明 ∑ i = 0 n − 1 b j , i = 1 \sum_{i=0}^{n-1}b_{j,i}=1 i=0n1bj,i=1 】以及 B x A = C o m c k ( f 0 , 0 , ⋯   , f m − 1 , n − 1 ; z A ) B^xA=Com_{ck}(f_{0,0},\cdots,f_{m-1,n-1};z_A) BxA=Comck(f0,0,,fm1,n1;zA) 以及 C x D = C o m c k ( { f j , i ( x − f j , i ) } j , i = 0 m − 1 , n − 1 ; z C ) C^xD=Com_{ck}(\{f_{j,i}(x-f_{j,i})\}_{j,i=0}^{m-1,n-1};z_C) CxD=Comck({fj,i(xfj,i)}j,i=0m1,n1;zC)【证明 b j , i ( 1 − b j , i ) = 0 b_{j,i}(1-b_{j,i})=0 bj,i(1bj,i)=0 for all i , j i,j i,j

在这里插入图片描述

2.16 a list EIGamal ciphertexts c 0 , ⋯   , c N − 1 c_0,\cdots,c_{N-1} c0,,cN1 containing an encryption of 1

参见Bootle等人2015年论文《Short Accountable Ring Signatures Based on DDH》第5章内容。
采用的为EIGamal encryption机制为:【其中 g k gk gk为the group description, c r s = ( c k , e k ) crs=(ck,ek) crs=(ck,ek)为the common reference string,其中 c k ← C G e n ( g k ) , ( e k , τ ) ← P K E G e n ( g k ) ck\leftarrow CGen(gk), (ek,\tau)\leftarrow PKEGen(gk) ckCGen(gk),(ek,τ)PKEGen(gk) and e k = g τ ek=g^{\tau} ek=gτ for τ ← Z q ∗ \tau\leftarrow \mathbb{Z}_q^* τZq c k ck ck用于Pedersen commitment scheme, e k ek ek用于EIGamal encryption scheme。】
在这里插入图片描述
EIGamal encryption具有乘法同态属性。
考虑的场景为:

  • public info:a list of N N N EIGamal ciphertexts ( c 0 , ⋯   , c N − 1 ) (c_0,\cdots,c_{N-1}) (c0,,cN1)
  • witness: l , r l, r l,r
  • relation: ∀ i , c i ∈ G 2 \forall i, c_i\in\mathbb{G}^2 i,ciG2 l ∈ { 0 , ⋯   , N − 1 } l\in\{0,\cdots,N-1\} l{0,,N1} c l = E n c e k ( 1 ; r ) c_l=Enc_{ek}(1;r) cl=Encek(1;r)

【核心思想在于 1 x m = 1 1^{x^m}=1 1xm=1 恒成立。】
由于可pad the list with copies of the last ciphertext (at little extra cost in the protocol),因此可假设 N = n m N=n^m N=nm。【不同的 n n n取值,相应的实现效率有差别。】
核心思想为 prove knowledge of an index l l l for which the product ∏ i = 0 N − 1 c i δ l , i \prod_{i=0}^{N-1}c_i^{\delta_{l,i}} i=0N1ciδl,i is an encryption of 1 1 1,where as usual δ l , i = 1 \delta_{l,i}=1 δl,i=1 when i = l i=l i=l and δ l , i = 0 \delta_{l,i}=0 δl,i=0 otherwise。
δ l , i = ∏ j = 0 m − 1 δ l j , i j \delta_{l,i}=\prod_{j=0}^{m-1}\delta_{l_j,i_j} δl,i=j=0m1δlj,ij,其中 l = ∑ j = 0 m − 1 l j n j , i = ∑ j = 0 m − 1 i j n j l=\sum_{j=0}^{m-1}l_jn^j, i=\sum_{j=0}^{m-1}i_jn^j l=j=0m1ljnj,i=j=0m1ijnj 为 the n n n-ary representations of l l l and i i i respectively。

  • Prover:首先commit to m m m sequences of n n n bits ( δ l j , 0 , ⋯   , δ l j , n − 1 ) (\delta_{l_j,0},\cdots,\delta_{l_j,n-1}) (δlj,0,,δlj,n1),然后运行 “2.15 commitment to multiple sequences of bits, exactly one 1 in each sequence” 中的协议以证明that the commitment is well-formed。
    当收到challenge x x x时,Prover发送 f j , i = δ l j , i x + a j , i f_{j,i}=\delta_{l_j,i}x+a_{j,i} fj,i=δlj,ix+aj,i。注意for every i ∈ { 0 , ⋯   , N − 1 } i\in\{0,\cdots,N-1\} i{0,,N1}, the product ∏ j = 0 m − 1 f j , i j \prod_{j=0}^{m-1}f_{j,i_j} j=0m1fj,ij is the evaluation at x x x of the polynomial p i ( x ) = ∏ j = 0 m − 1 ( δ l j , i x + a j , i ) p_i(x)=\prod_{j=0}^{m-1}(\delta_{l_j,i}x+a_{j,i}) pi(x)=j=0m1(δlj,ix+aj,i)。For 0 ≤ i ≤ N − 1 0\leq i\leq N-1 0iN1,有:
    p i ( x ) = ∏ j = 0 m − 1 ( δ l j , i j x ) + ∑ k = 0 m − 1 p i , k x k = δ l , i x m + ∑ k = 0 m − 1 p i , k x k p_i(x)=\prod_{j=0}^{m-1}(\delta_{l_j,i_j}x)+\sum_{k=0}^{m-1}p_{i,k}x^k=\delta_{l,i}x^m+\sum_{k=0}^{m-1}p_{i,k}x^k pi(x)=j=0m1(δlj,ijx)+k=0m1pi,kxk=δl,ixm+k=0m1pi,kxk …… (1)
    其中的系数 p i , k p_{i,k} pi,k 取决于 l l l a j , i a_{j,i} aj,i。注意,系数 p i , k p_{i,k} pi,k可由Prover独立计算与 x x x值无关,且 p l ( x ) p_l(x) pl(x)为the only degree m m m polynomial amongst p 0 ( x ) , ⋯   , p N − 1 ( x ) p_{0}(x),\cdots, p_{N-1}(x) p0(x),,pN1(x)
    根据这些系数和some random noise values ρ k \rho_k ρk,Prover可计算ciphertexts G k = ∏ i = 0 N − 1 c i p i , k ⋅ E n c e k ( 1 ; ρ k ) G_k=\prod_{i=0}^{N-1}c_i^{p_{i,k}}\cdot Enc_{ek}(1;\rho_k) Gk=i=0N1cipi,kEncek(1;ρk),并将这些 G 0 , ⋯   , G m − 1 G_0,\cdots,G_{m-1} G0,,Gm1值发送给Verifier。这些 G 0 , ⋯   , G m − 1 G_0,\cdots,G_{m-1} G0,,Gm1值可用于公式(1)中cancel out the low degree terms。若 c l c_l cl为an encryption of 1,则如下product也为an encryption of 1 for any x x x
    ∏ i = 0 N − 1 c i ∏ j = 0 m − 1 f j , i j ⋅ ∏ k = 0 m − 1 G k − x k = ( ∏ i = 0 N − 1 c i δ l , i ) x m \prod_{i=0}^{N-1}c_i^{\prod_{j=0}^{m-1}f_{j,i_j}}\cdot\prod_{k=0}^{m-1}G_k^{-x^k}=(\prod_{i=0}^{N-1}c_i^{\delta_{l,i}})^{x^m} i=0N1cij=0m1fj,ijk=0m1Gkxk=(i=0N1ciδl,i)xm

在这里插入图片描述

2.17 correct EIGamal signature

参见Bootle等人2015年论文《Short Accountable Ring Signatures Based on DDH》第5章内容。
采用的为EIGamal encryption机制为:【其中 g k gk gk为the group description, c r s = ( c k , e k ) crs=(ck,ek) crs=(ck,ek)为the common reference string,其中 c k ← C G e n ( g k ) , ( e k , τ ) ← P K E G e n ( g k ) ck\leftarrow CGen(gk), (ek,\tau)\leftarrow PKEGen(gk) ckCGen(gk),(ek,τ)PKEGen(gk) and e k = g τ ek=g^{\tau} ek=gτ for τ ← Z q ∗ \tau\leftarrow \mathbb{Z}_q^* τZq c k ck ck用于Pedersen commitment scheme, e k ek ek用于EIGamal encryption scheme。】
在这里插入图片描述
EIGamal encryption具有乘法同态属性。
考虑的场景为:

  • public info: e k , p k , m , R = { v k 0 , ⋯   , v k N − 1 } , c ek,pk,m,R=\{vk_0,\cdots,vk_{N-1}\},c ek,pk,m,R={vk0,,vkN1},c
  • witness: s k , r sk,r sk,r
  • relation: s k ∈ Z q sk\in\mathbb{Z_q} skZq v k = g s k ∈ R ⊂ G ∗ vk=g^{sk}\in R\subset \mathbb{G}^* vk=gskRG c = E n c p k ( v k ; r ) c=Enc_{pk}(vk;r) c=Encpk(vk;r)

核心思想为:Prover构建 d = E n c e k ( g s k ; t ) d=Enc_{ek}(g^{sk};t) d=Encek(gsk;t),将 d d d发送给Verifier,Prover和Verifier都构建 c 0 = d ⋅ E n c e k ( v k 0 − 1 ; 0 ) , ⋯   , c N − 1 = d ⋅ E n c e k ( v k N − 1 − 1 ; 0 ) c_0=d\cdot Enc_{ek}(vk_0^{-1};0),\cdots,c_{N-1}=d\cdot Enc_{ek}(vk_{N-1}^{-1};0) c0=dEncek(vk01;0),,cN1=dEncek(vkN11;0),这样就转换为“## 2.16 a list EIGamal ciphertexts c 0 , ⋯   , c N − 1 c_0,\cdots,c_{N-1} c0,,cN1 containing an encryption of 1” 的证明。
详细实现为:
在这里插入图片描述

2.18 correct EIGamal encryption opening

参见Bootle等人2015年论文《Short Accountable Ring Signatures Based on DDH》第5章内容。
采用的为EIGamal encryption机制为:【其中 g k gk gk为the group description, c r s = ( c k , e k ) crs=(ck,ek) crs=(ck,ek)为the common reference string,其中 c k ← C G e n ( g k ) , ( e k , τ ) ← P K E G e n ( g k ) ck\leftarrow CGen(gk), (ek,\tau)\leftarrow PKEGen(gk) ckCGen(gk),(ek,τ)PKEGen(gk) and e k = g τ ek=g^{\tau} ek=gτ for τ ← Z q ∗ \tau\leftarrow \mathbb{Z}_q^* τZq c k ck ck用于Pedersen commitment scheme, e k ek ek用于EIGamal encryption scheme。】
在这里插入图片描述
针对的场景为:
在这里插入图片描述

相应的证明为:
在这里插入图片描述

3. Generalization of Sigma protocols

Dan Boneh 的视频解说 Discrete Log based Zero-Knowledge Proofs 中提到,可将Sigma protocol看成是prove knowledge of a homomorphism pre-image (其中 p r e − i m a g e pre-image preimage为函数输入, i m a g e image image为函数输出)。
homomorphism同态性,如 g a + b = g a ∗ g b g^{a+b}=g^a*g_b ga+b=gagb可认为具有加法同态性。

homomorphism可定义为a function f f f,where f ( a ) = g a f(a)=g^a f(a)=ga. To prove the knowledge of a a a, given common input f ( a ) f(a) f(a)(如 g a g^a ga),则具体的protocol可描述为:
1)Prover:生成随机数 r r r,发送 f ( r ) = g r f(r)=g^r f(r)=gr给Verifier;
2)Verifier:发送challenge c c c给Prover;
3)Prover:发送response s = r + c ∗ a s=r+c*a s=r+ca
4)Verifier:计算 f ( s ) = g s f(s)=g^s f(s)=gs,验证 f ( s ) = f ( r ) ∗ f ( a ) c f(s)=f(r)*f(a)^c f(s)=f(r)f(a)c是否成立即可。

3.1 Protocol 8. Equality of discrete logs

定义homomorphism函数为 f ( a ) = ( g a , h a ) f(a)=(g^a,h^a) f(a)=(ga,ha)
证明Prover知道witness x x x,使得 g x = y 且 h x = z g^x=y且h^x=z gx=yhx=z
Witness: x x x
Instance: g , h , y , z g,h,y,z g,h,y,z
Relation: g x = y g^x=y gx=y h x = z h^x=z hx=z

具体实现可为:
1)Prover:生成随机数 r r r,发送 f ( r ) = ( g r , h r ) f(r)=(g^r,h^r) f(r)=(gr,hr) 给Verifier;
2)Verifier:发送challenge c c c给Prover;
3)Prover:发送response s = r + c ∗ a s=r+c*a s=r+ca
4)Verifier:计算 f ( s ) = ( g s , h s ) f(s)=(g^s,h^s) f(s)=(gs,hs),验证 f ( s ) = f ( r ) ∗ f ( a ) c f(s)=f(r)*f(a)^c f(s)=f(r)f(a)c是否成立即可。

3.2 Protocol 9. Conjunction (AND) of discrete logs

定义homomorphism函数为 f ( a , b ) = ( g a , h b ) f(a,b)=(g^a,h^b) f(a,b)=(ga,hb)
证明Prover知道witness a , b a,b a,b,使得 g a = P 且 h b = Q g^a=P且h^b=Q ga=Phb=Q
Witness: a , b a,b a,b
Instance: g , h , P , Q g,h,P,Q g,h,P,Q
Relation: g a = P 且 h b = Q g^a=P且h^b=Q ga=Phb=Q

具体实现可为:【相当于并行执行2个 ”knowledge of discrete log” protocol】
1)Prover:生成2个随机数 r 1 , r 2 r_1,r_2 r1,r2,发送 f ( r 1 , r 2 ) = ( g r 1 , h r 2 ) f(r_1,r_2)=(g^{r_1},h^{r_2}) f(r1,r2)=(gr1,hr2)给Verifier;
2)Verifier:发送challenge c c c给Prover;
3)Prover:发送response ( s 1 , s 2 ) (s_1,s_2) (s1,s2),其中 s 1 = r 1 + c ∗ a , s 2 = r 2 + c ∗ b s_1=r_1+c*a,s_2=r_2+c*b s1=r1+ca,s2=r2+cb
4)Verifier:计算 f ( s 1 , s 2 ) = ( g s 1 , h s 2 ) f(s_1,s_2)=(g^{s_1},h^{s_2}) f(s1,s2)=(gs1,hs2),验证 f ( s 1 , s 2 ) = f ( r 1 , r 2 ) ∗ f ( a , b ) c f(s_1,s_2)=f(r_1,r_2)*f(a,b)^c f(s1,s2)=f(r1,r2)f(a,b)c是否成立即可。

3.3 Protocol 10. Knowledge of opening of Pedersen commitment

定义homomorphism函数为 f ( m , r ) = g m ∗ h r f(m,r)=g^m*h^r f(m,r)=gmhr
证明Prover知道witness ( m , r ) (m,r) (m,r),使得 P = g m ∗ h r P=g^m*h^r P=gmhr
Witness: m , r m,r m,r
Instance: g , h , P g,h,P g,h,P
Relation: P = g m ∗ h r P=g^m*h^r P=gmhr

具体实现可为:
1)Prover:生成2个随机数 r 1 , r 2 r1,r_2 r1,r2,发送 f ( r 1 , r 2 ) = g r 1 ∗ h r 2 f(r_1,r_2)=g^{r_1}*h^{r_2} f(r1,r2)=gr1hr2给Verifier;
2)Verifier:发送challenge c c c给Prover;
3)Prover:发送response ( s 1 , s 2 ) (s_1,s_2) (s1,s2),其中 s 1 = r 1 + c ∗ m , s 2 = r 2 + c ∗ r s_1=r_1+c*m,s_2=r_2+c*r s1=r1+cm,s2=r2+cr
4)Verifier:计算 f ( s 1 , s 2 ) = g s 1 ∗ h s 2 f(s_1,s_2)=g^{s_1}*h^{s_2} f(s1,s2)=gs1hs2,验证 f ( s 1 , s 2 ) = f ( r 1 , r 2 ) ∗ f ( m , r ) c f(s_1,s_2)=f(r_1,r_2)*f(m,r)^c f(s1,s2)=f(r1,r2)f(m,r)c是否成立即可。

3.4 Homomorphism preimage proof for R1CS

在这里插入图片描述

3.5 Schnorr in a group of unkown order

Dan Boneh 在2019年 2nd ZKProof Workshop 上的视频解说 Discrete Log based Zero-Knowledge Proofs

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考资料:

[1] Lovesh Harchandani 在medium的博客Zero Knowledge Proofs with Sigma Protocols
[2] Dan Boneh 的视频解说 Discrete Log based Zero-Knowledge Proofs

  • 26
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
以下是用C语言实现的Schnorr签名协议的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <openssl/sha.h> #include <openssl/ec.h> #include <openssl/ecdsa.h> #include <openssl/obj_mac.h> #define MSG_LEN 16 int main() { // 生成椭圆曲线参数 EC_GROUP *curve = EC_GROUP_new_by_curve_name(NID_secp256k1); EC_POINT *G = EC_GROUP_get0_generator(curve); BIGNUM *n = BN_new(); EC_GROUP_get_order(curve, n); // 生成密钥对 EC_KEY *key = EC_KEY_new(); EC_KEY_set_group(key, curve); EC_KEY_generate_key(key); const EC_POINT *pk = EC_KEY_get0_public_key(key); const BIGNUM *sk = EC_KEY_get0_private_key(key); // 签名 uint8_t msg[MSG_LEN] = "Hello, world!"; uint8_t digest[SHA256_DIGEST_LENGTH]; SHA256(msg, MSG_LEN, digest); ECDSA_SIG *sig = ECDSA_do_sign(digest, SHA256_DIGEST_LENGTH, key); const BIGNUM *r = sig->r; const BIGNUM *s = sig->s; // 验证 int ret = ECDSA_do_verify(digest, SHA256_DIGEST_LENGTH, sig, key); printf("Verification: %s\n", ret == 1 ? "PASS" : "FAIL"); // 释放资源 ECDSA_SIG_free(sig); EC_KEY_free(key); BN_free(n); EC_GROUP_free(curve); return 0; } ``` 以上代码使用了OpenSSL库来生成椭圆曲线参数、密钥对,以及实现签名和验证操作。在测试部分,我们对一条消息进行签名和验证,如果验证通过,则表示Schnorr签名协议在椭圆曲线上的方案可以正确地工作。 需要注意的是,上述代码中的`MSG_LEN`表示消息长度,可以根据实际需要进行修改。另外,为了简化代码,省略了错误处理等细节,实际使用时需要进行适当的补充。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值