零知识证明大整理

  学的内容多了,就可以搞个总结整理了。
  慢慢填坑。

  推荐一个 2019 年的 camp 可以学到多数 ZKP 经典内容。
  其他参考资料:Sanjeev Arora 的经典教材《Computational Complexity: A Modern Approach》,以及各类密码学教材。

初始 Fundamental

  Princeton 的这个 lec15lec16 是非常好入门教程。

  怎么说明一个输入 xx 属于一个语言 LL 呢?通常来说,就是写出来一个数学证明(通常就是给出 xx 的 witness),谁想知道谁就来看。但缺点就是把 witness 公开出来了,有没有不公开的方法呢?比如有一个门禁,门禁里有一个大整数 nn,我的“钥匙”就是 nn 的质因数分解。如果我直接显式地输入 nn 的质因数分解,那就会被人偷看偷听了,有没有方法使得我既能让门禁相信我知道 nn 的质因数分解,又能不说出任何关于 nn 质因数分解的信息呢?

  零知识证明(Zero-Knowledge Proof, ZKP)是一个交互协议,交互双方为 Prover、Verifier,其中 Verifier 计算能力有限(通常假设它只有多项式时间)。它们会得到一个输入 xx,Prover 想让 Verifier 相信 xx 属于某个语言 LL。这个交互协议满足如下条件:

  • Completeness:如果 xLx \in L,那么 Verifier 以高概率接受;
  • Soundness:如果 x∉Lx \not \in L,那么 Verifier 以高概率拒绝;
  • Zero-Knowledge:Verifier 经过交互以后没有得到额外的信息,即,整个交互过程可以被 Verifier 自己模拟出来。更确切地说,存在一个算法 Simulator,它可以模拟出一个 Verifier 的 view,该 view 与真实交互中 Verifier 的 view 是不可区分的。(不可区分可以是完美/统计/计算不可区分)

  给非 CS 背景的人科普时可以举的通俗易懂的例子:如下图,Alice 想要给 Bob 证明她拥有这个门的钥匙,但不能直接把钥匙给她看。方法是,Bob 站在顶上通道处,每次随机喊“左”或“右”,Alice 就必须从下方走到对应位置。过程重复若干次,如果 Alice 总是能成功,Bob 就能确信 Alice 拥有钥匙了。但 Bob 没有亲自看到这把钥匙或是开门过程。

  给非 CS 背景的人科普时可以让他看的视频。(油管链接,需科学上网)

  给 CS 背景的人科普时可以举的例子:图同构。有两幅图 AABB,Prover 希望 Verifier 相信 AABB 同构。每次操作 Prover 给 Verifier 发送一个新图 CC(由 AA 点标号随机打乱而来),声称 A,B,CA,B,C 同构,Verifier 要么询问 AACC 之间的点标号映射,要么询问 BBCC 的点标号映射。操作重复若干次,Verifier 接受当且仅当每次 Prover 都能正确回答问题。
  如果 A,BA,B 真的同构,那么 Prover 总是能正确回答。如果 AABB 不同构,那么 Prover 每次最多只有 12\frac 12 的概率回答正确,重复若干次以后概率无限小。直观理解,Verifier 每次只是知道了 AABB 其中一幅图的点标号重排结果,从中并不能推断出更有用的信息。

  想要细学的话需要了解的例子:二次剩余、3-Coloring、哈密顿回路。

更多框架

随机自归约(Random Self-Reducible)问题的ZKP

  如果你发现二次剩余、离散对数、图同构的 ZKP 都长得很像,那么 [TW87] 这篇文章就可以告诉你,这不是巧合。它们都是 random self-reducible 的,于是可以设计出统一的 ZKP 框架,并且是 perfect ZKP 的:

  • 输入:xx,诚实的 Prover 拥有其 witness yy
  • Prover 随机生成一个 r{0,1}r \in \{0,1\}^*,将 (x,y)(x,y)rr 随机归约成 (x,y)(x',y'),发送 xx'
  • Verifier 发送一个随机提问 bR{0,1}b \gets_R \{0,1\}
  • b=0b=0,Prover 发送 rr,Verifier 检验“xxrr 归约成 xx'”;若 b=1b=1,Prover 发送 yy',Verifier 检验“yy'xx' 的 witness”。

  例如,在二次剩余中,xy2(modn),xxr2(modn),yyr(modn)x \equiv y^2 \pmod n, x' \equiv x \cdot r^2 \pmod n, y' \equiv yr \pmod n;在离散对数中,xgy,xgy+r,yy+rx \equiv g^y, x' \equiv g^{y+r}, y' \equiv y+r

  其实不仅是 random self-reducible,只要能把 AA 问题随机归约到 BB 问题,就能对 AA 问题采用这个框架。

  这个东西的一个很重要的意义在于,结合后续一系列推导(包括 SZKcoAM\mathsf{SZK \subseteq coAM}NPcoAMpolynomial hierarchy collapses\mathsf{NP\subseteq coAM} \Rightarrow \text{polynomial hierarchy collapses}),可以得到 NPC\mathsf{NPC} 问题不能拥有 SZK,又或者拥有 SZK 的问题(比如 random self-reducible 的问题)不能是 NPC\mathsf{NPC}

\sum-Protocol

带各种特性的零知识证明

常数轮零知识证明 Constant-Round Zero-Knowledge Proof

  传统的 ZKP 是把一个协议串行执行很多次来降低 soundness,因此自然会想如果把它改成并行,就变成常数轮了。但简单的并行会使得 simulator 的时间复杂度爆炸。(例如很多 ZKP 是让 verifier 发送两种询问中的一种,simulator 原本只需要期望 22 步猜对询问然后往下走,现在 nn 个询问并行,那么就变成期望 2n2^n 步才能同时猜对然后往下走。)
  [GK96] 的 idea 是:还是并行,但让 verifier 先把询问加密发送给 prover,再执行原协议,到该询问的时候让 verifier 解密。这样 simulator 就不用猜询问了,一直发垃圾等 verifier 自己解密了询问再时间倒流即可。具体来说(以哈密顿回路的 3 轮协议为例):

  • Verifier 将询问串用 computationally binding, perfectly hiding 的 commitment scheme 加密发送给 Prover。
  • Prover 发送原协议第一步的消息。
  • Verifier 解密询问串。
  • Prover 回答。

细节分析很复杂,因为要考虑各种不遵守协议 halt 的情况,如果不明白某些步骤的意义,可以参考 《Tutorials on the Foundations of Cryptography》6.5.4 节的讲解。

  [GK96] 的缺点就是不遵守协议 halt 的情况太复杂,其中有一个分析就是由于 simulator 会倒车,导致 verifier 有至少两次解密询问,如果每次成功解密的概率不一样,就会使得 simulator 期望倒车次数爆炸。
  [Ros04] 这篇仍然是让 verifier 先发送询问(假设叫 σ\sigma),但是额外生成了 σi0,σi1\sigma_i^0,\sigma_i^1 使得 σi0σi1=σ\sigma_i^0 \oplus \sigma_i^1=\sigma。它让 prover 解密 σi0,σi1\sigma_i^0,\sigma_i^1 中的其中一个,这对 prover 来说是没有用的,但是 simulator 可以在这里倒车获得询问,这样就没有“每次成功解密的概率不一样”的问题,因而期望倒车次数是常数。
  由于发送询问的方式更复杂了,所以轮数变成了 7 轮,没有达到最优,但是分析简单了很多。

非交互零知识证明 Non-Interactive Zero-Knowledge Proof

  把 ZKP 做成非交互的当然是一个美好的愿景了,这样可以大大提升 ZKP 的效率,从而提高实用性。

  但如果就简单地只是让 Prover 发条消息给 Verifier,这是不可能的。

Lemma: 如果问题 LL 存在一个 ZKP 只是让 Prover 发一条消息给 Verifier,那么 LBPPL \in \mathsf{BPP}

  证明:对于输入 xx,直接让 simulator 模拟一个 Prover 消息,用 Verifier 验证,这就得到了 LL 的概率多项式算法。

  事实上,不只是一轮不行,参考 Lower Bound of ZKP,黑盒 simulator 的情况下三轮都不行。

  因此要实现非交互,必须借助一些外部工具。一个可行的方法就是 Common Reference String (CRS),从天上来了一个可信第三方,给出了一个符合特定分布的字符串,Prover 和 Verifier 都无条件相信这个字符串是符合特定分布的。这个信任,就可以用来实现非交互。
  下表是使用 CRS 的一些经典方法的总结。

PaperProblemExtra PropertyCRS representsAssumptionCompletenessSoundnessZKlen of CRS
[KT92]3-Coloring2 numbers for each edgehardness of Quadratic Residuosity1100computational16k16k
[FLS99]Hamiltonian-a cycleOne-Way Permutation with hard-core predicate11negnegcomputationaln7k2mn^7k^2m
[FLS99]HamiltonianargumentOne-Way Trapdoor Permutation
[FLS99]NPC\mathsf{NPC}multiple proversrandom yy and original CRSPsseudorandom Generator (from nn-bit to 2n2n-bit)2n+CRS2n + \vert CRS \vert
[KP98]3-SAT-5wild strings and random stringsHidden Bit Model1neg1-negnegnegcomputationalO(knlog(n/ϵ))O(kn \log (n/\epsilon))
[GOS12]circuit SATcommitment schemeHomomorphic Commitment Scheme1100computationalO(1)O(1)
[WP22]Linear Problems, circuit SATcommitment scheme in matrixNC1L/poly\mathsf{NC^1 \subsetneq \oplus L/poly}1100NC1\mathsf{NC^1} computationalλ2\lambda^2

  另一种方法是 Fiat-Shamir Transform,即如果 verifier 发的消息全都是随机字符串,那么就用一个伪随机函数来代替掉它,伪随机函数的输入就是之前的所有消息。

非黑盒零知识证明 Non-Black-Box Zero-Knowledge Proof

理论相关

Lower Bound of ZKP

ZKP and One-Way Function

  [Ost91] 及后续工作 [Ost93] 提出的思路,我猜是在考虑怎么用 simulator 产生的 view 来设计判定 xLx \in L 的算法的时候,捣鼓出了这个玩意。
  如果一个问题 LL 是属于 SZK\mathsf{SZK} 的,并且是 hard on average 的,那么就可以通过这个 SZK 构造出 one-way function。这个 one-way function 的输入是 SZK 里的 simulator 所需的 random tape,输出是 simulator 产生的 view of verifier。
  证明大致是,假设这个函数不是 one-way 的,即输入 view 可以快速求出 random tape。那么用 simulator 充当 prover,与 verifier 交互(每得到一条 verifier 的消息就重新算 random tape,再用 simulator 计算出 prover 要发的消息),这样就得到了 LL 的快速判定算法,从而 LL 不是 hard on average。
  为什么限定是 SZK 呢?因为 SZK 证明 correctness 的时候会方便很多。后续论文 [Ost93] 把这个思想拓展到一般 ZKP 上了。
  为什么是 hard on average 呢?我认为这个条件是不准确的,它用反证法推翻的结论是“LL 没有高效的概率算法”,所以应该跟 [ZKP-OWF] 一样,是“不属于 BPP\mathsf{BPP}”。

SZK\mathsf{SZK} and coAM\mathsf{coAM}

Reference

  • [FLS99] Uriel Feige, Dror Lapidot, and Adi Shamir. Multiple noninteractive zero knowledge proofs under general assumptions. In SIAM Journal on computing 1999.
  • [GK96] Oded Goldreich, and Ariel Kahan. How to Construct Constant-Round Zero-Knowledge Proof Systems for NP. In Journal of Cryptography 1996.
  • [GOS12] Jens Groth, Rafail Ostrovsky, and Amit Sahai. New techniques for noninteractive zero-knowledge. In Journal of the ACM 2012.
  • [KP98] Joe Kilian, and Erez Petrank. An efficient noninteractive zero-knowledge proof system for NP with general assumptions. In Journal of Cryptology 1998.
  • [KT92] Kaoru Kurosawa, and Kenichi Takai. A comment on NIZK for 3 colorability. In ICCS/ISITA `92.
  • [Ost91] Rafail Ostrovsky. One-Way Functions, Hard on Average Problems, and Statistical Zero-Knowledge Proofs. In CCC 1991.
  • [Ost93] Rafail Ostrovsky, and Avi Wigderson. One-Way Functions are Essential for Non-Trivial Zero-Knowledge. In Israel Symposium on Theory and Computing Systems 1993.
  • [Ros04] Alon Rosen. A Note on Constant-Round Zero-Knowledge Proofs for NP. In Theory of Cryptography 2004.
  • [TW87] Martin Tompa, and Heather Woll. Random Self-Reducibility and Zero Knowledge Interactive Proofs of Possession of Information. In STOC 1987.
  • [WP22] Yuyu Wang, and Jiaxin Pan. Non-Interactive Zero-Knowledge Proofs with Fine-Grained Security. In EUROCRYPT 2022.