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

Posted mutourend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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的详细实现为: