Once exposed, a secret loses all its power.
一旦泄露,秘密就失去了全部威力。
—— Ann Aguirre
回顾 探索零知识证明系列(二):从「模拟」理解零知识证明:平行宇宙与时光倒流
追到这里的读者想必已对零知识证明有了一个大概的认识。你是否想过这个问题:零知识证明为何可行?这里请大家思考一下(比如系列一(初识「零知识」与「证明」) 中的地图三染色问题的流程) …… (此处停留三分钟)下面两个要素 似乎 必不可少:
「交互」:验证者通过多次反复挑战,把证明者作弊概率降低到一个极小的值
「隐藏随机性」:验证者产生让证明者无法预测的随机数进行挑战
然而对于非交互式零知识证明—— NIZK 来说,如何实现上面两点?在系列四(亚瑟王的「随机」挑战:从交互到非交互式零知识证明) 我们介绍了如何采用「随机预言机」来扮演一个虚拟的「第三方」角色,实现虚拟的「交互」与「随机挑战」。本文将深入讲述另一种方法,如何通过一段共享的字符串去除「交互」与「隐藏随机性」。这个字符串必须事先由「第三方」来随机产生,这就是传说中的「公共参考串」(Common Reference String,简称 CRS)。 CRS 的前世今生BPP
(Bounded-error Probabilistic Polynomial time),而这个复杂度类大家一般猜想可能等价于 P
(但还悬而未决,没有被证明!BPP
可以理解为 P
+ Randomness
)。NP
类问题。大家都知道,P
问题是「确定性图灵机」多项式时间内可以求解的复杂类,它的执行路径对于输入 x
是一个线性的状态转移。而 NP
问题是「不确定性图灵机」多项式时间可以求解的问题类。所谓的不确定性图灵机,就是它每次往前走一步是不确定的,有很多个选择,只要任何一个执行路径能到达终止状态,就表示它解决了该问题 x
。换句话说,它的执行轨迹是一棵树。那么如果我们把不确定性图灵机每一步的路径选择记录下来(这个执行路径的记录叫做 witness
,也就是我们反复提到的「知识」),那么把(x, witness)
交给一个确定性图灵机,那么它也能在多项式时间内解决掉 x
问题。NP
问题中存在着不想「泄露」给验证者的知识 witness
,这时,在一个交互式证明系统中,证明者和验证者在「知识」的掌握程度上是不对等的。witness
啊,怎么能让他们不对等呢?上一篇我们介绍了「随机预言机」,我们通过允许让模拟器可以绑架「随机预言精灵」的方式制造不平等。本篇将讲述如何利用 CRS 来制造不平等。
CRS 的使命就是让「模拟器」与「验证者」不平等。怎么做呢?隐藏一些「秘密」进去。
n^4
超长的 CRS,其中 n
是要证明的「命题」的长度。k * n^5
,这里 k
是安全参数。k * n^2
。后来 J. Groth 继续优化 ,把 CRS 的长度缩小到了大约 k*n
[Groth10a]。k
。对于模拟器而言,它可以通过超能力,拿到这个公钥所对应的陷门,从而能够实现密封任何信息,但得到相同的密文;对于抽取器而言,它可以用超能力拿到公钥对应的私钥,从而能够解密证明得到「知识」。g^x^n, g^⍺x^n
) 构成,被用来实现「知识承诺」。其中 x
与 ⍺
是两个随机数,在产生完 CRS 之后,必须被「遗忘」。有些人把这部分需要遗忘的随机数叫做「Toxic Wastes」,这容易误导读者。他们不仅无毒无害,而且非常有用。他们是被藏入 CRS 的「秘密」,是模拟器的武器。如果模拟器得到了 x
与 ⍺
,就能伪造证明,从而保证证明的零知识。而对于抽取器,他能直接通过 KEA 假设内建的抽取函数来抽取知识。哈密尔顿环路问题
poly(n)
多项式时间内寻找。
V * V
的矩阵来表示这个地图,凡是两个城市(A, B)
有公路相连接,那么就在(A, B)
和 (B, A)
里面填上 1
,否则填 0
。这个矩阵被称为「邻接矩阵」,我们可以把这个邻接矩阵拍扁,就变成了一个 0/1
比特串。poly(n)
多项式时间内找到环路。但是,计算机可以在多项式时间内检验一个路径是否是「哈密尔顿环路」。比如这个地图中就有一个带方向的哈密尔顿环路,我们一眼就能验证这个环路确实穿过了每一个城市。如果一个地图有哈密尔顿环路,那么它的矩阵一定是满足下面的特征:每一行一定有一个1
,每一列一定也有一个1
。
ZK-HAM 协议Sigma
协议,Alice 向 Bob 证明她「知道」上面这个地图 G
的哈密尔顿环路。
G
为一个有 6 个顶点的地图,表示为一个 6*6
的邻接矩阵G
的哈密尔顿环路 C
(图中橙色的公路)Perm(.)
,然后通过这个置换,产生一个新的图 G'
;然后 Alice 把G'
矩阵的每一个单元加密,产生一个新的矩阵发送给 Bob。G'
,比如上图左侧的两个图。经过置换变换的图前后是 同构 的。其中下图中,每一个顶点上角括号中的标号为拖动之前该顶点在上图中的编号。形式化一点可以这么定义:Perm()是一个 {1, V} 到 {1, V}的双射函数
新图 G'
的邻接矩阵,[perm(i), perm(i+1) ]=1
当且仅当[i, i+1]=1
,其中 i
是顶点编号,V
是顶点个数 。b in {0, 1}
进行挑战。b=0
,那么 Alice 发送置换函数 Perm()
,并且揭示完整的图 G'
。而 Bob 则确认 G'
是否是原图 G
经过置换无误。b=1
,那么 Alice 只揭示 G'
中的哈密尔顿环路 C'
即可。而 Bob 需要验证 C'
是否是一个哈密尔顿环路Commit
,证明者 Alice 需要把手里的答案进行同态变换,产生一个新答案,然后把每一条边都锁起来,交给 Bob;0
,那么Alice 打开第一步的承诺,表示自己在第一步没有作弊;如果 Bob 挑战 1
,那么 Alice 只解密暴露出哈密尔顿环路的边(公路),其它边则不需解密。Bob 可以轻易地检查地图上露出来的那些边是否构成了一个不重复地经过所有城市的环路。ZK-HAM 的变形:ZK-HAM-2
C
是 图 G
的子图,C <= G
那么说明 G
包含哈密尔顿环路。G
的补集 !G
是环路子图 C
的补集 !C
的子图。G
包含一个环路子图C
,那么G
矩阵中所有值为 0
的单元集合 必然被 C
矩阵中所有值为0
的单元集合包含。可以表示为 !G <= !C
。G
,表示为 6*6
的邻接矩阵G
的哈密尔顿环路 C
(图中橙色的公路)Perm(.)
,并且通过C
构造一个哈密尔顿环路子图 C'=Perm(C)
;C'
的每一个单元,把解密后的结果发送给 Bob。b in {0, 1}
进行挑战b=0
,Alice 揭示完整的 C'
,而 Bob 验证这个 C'
是否确实是一个哈密尔顿环路子图。b=1
,Alice 发送 Perm()
,同时按照 G'=Perm(G)
中的所有含 0
单元所在的位置,揭示 C'
中所对应的单元;Bob 验证 C'
所有被揭示单元是否全部为 0
。C
进行置换变换,产生一个新的哈密尔顿子图 C'
,加密后交给 Bob;0
或者 1
;0
,那么 Alice 打开第一步的承诺,展示一个带有唯一环路的图;如果 Bob 挑战 1
,Alice 则按照 G'
中的 0
单元的位置打开承诺,展示承诺中被打开的位置全部为 0
。G
无关的!b=0
这个分支,因为可信的第三方是诚实的,他一定是事先准备好一个正确的环路子图。这样,由于 Bob 只需要发送 1
挑战分支,那么这一步也可以去除。ZK-HAM-2
协议的第一步和第二步推到一个事先准备的字符串中,然后只让 Alice 发送第三步的内容给 Bob。如下图所示:云中的秘密:Hidden BitsC
。接下来,我们要解释一个新概念:「隐藏比特」(Hidden Bits)[FLS90]。Hidden Bits 是这样一串随机比特,它们对于验证者 Bob 隐藏,但是对于证明者 Alice 公开。然后在证明过程中,Alice 可以选择性地揭示一部分比特展示给 Bob 看。这是构造 NIZK 证明系统的一个利器,下面我们需要再继续深入 ……0
就是 1
,然后 Alice (证明者)带着一个「超级眼镜」,于是能够看到云后面所有的随机比特串,但是 Bob (验证者)却看不到。同时 Alice 手里还有一个「超级手电筒」,她可以打开手电筒用激光穿透云层,让 Bob 也能看见其中某个或某些比特。当然,Bob 能看到的比特的选择权完全在 Alice 手中。ZK-HAM-2
协议的功能。在 ZK-HAM-2
中的第一步,Alice 产生一个随机的置换 Perm()
,然后通过 G
中的哈密尔顿环路子图 C
产生一个变换后的环路子图 C'=Perm(C)
。这等价于,事先由任何人产生一个随机的哈密尔顿环路子图 C'
,然后 Alice 根据 C
和 C'
计算得出一个相应的 Perm()
。C'
,编码成「邻接矩阵」比特串,放到云朵后面。假设 V
为顶点(城市)的个数,E
为边(公路)的条数。这个邻接矩阵的编码需要一个 V*V
长度的比特串,可以解释成一个 V*V
的矩阵,其中每一行只包含一个 1
,每一列也只包含一个 1
,矩阵的其它单元都为 0
。
C'
,然后计算得到一个置换 Perm()
,使得 Perm(C)=C'
。Perm()
来计算出一个换后的图 G'=Perm(G)
Perm()
(2)G'
的邻接矩阵中所有值为 0
的单元坐标所对应的 C'
矩阵的值,相当于 Alice 需要用「超级手电筒」给 Bob 揭示的隐藏比特。Perm()
是否是一个合法的置换 V -> V
,比如不能出现两个顶点映射到同一个顶点的情况。G
中的每一条「非边」,经过置换之后,Bob 抬头看天上对应的「隐藏比特」,比特值必须为 0
G
置换后的非边集合都已被揭示,且全为 0
,那么可以得出结论,!G <= !C
,即G
的非边集合是环路子图 C
的非边集合的子集。这等价于,C <= G
,也就是说 G
包含一个哈密尔顿环路。这里请注意,这个可靠性概率是 100%。C'
。然后当 Bob 得到 Perm()
之后,就能通过 Perm()
反算出 C
,于是 Bob 就相当于变身成了一个「抽取器」(Extractor),在理想世界中,它能把 Alice 要证明的知识给成功抽取出来。0
Perm()
0
;或者他和 Bob 串谋,直接把这个比特串给 Bob 看。这个协议看起来不错,但是很难实用。我们接下来要对这个简单协议进行升级。升级随机性
0
的个数和 1
出现的概率大概接近。那么接下来一个难题是如何让随机比特串中能出现一个随机的哈密尔顿环路子图矩阵。方法非常简单粗暴:产生一个足够长的随机串,然后从头扫描,直到找到一个随机的哈密尔顿环路为止。5log(V)
的长度进行切分,然后如果每一个分片中的所有比特全为 1
,那么我们把这个片段被视为邻接矩阵中的一个值为 1
的单元,否则视为一个值为 0
的单元。这样每一个矩阵单元出现 1
的概率为 1/(V^5)
。V^6
个片段,构成一个 V^3 * V^3
的大矩阵。如果大矩阵中包含一个 V*V
的哈密尔顿环路矩阵,并且其他单元(总共 V^6 - V^2
个) 都为 0
。那么我们称这个大矩阵为「有用」。1/[V^(3/2)]
。M
,Alice 公开 M
的所有单元。M
,这意味着 Alice 得到了一个随机的 哈密尔顿环路 C'
,然后 Alice 参照上一节的步骤进行证明即可。M
,那么 Bob 就检查这个 M
是否「无用」。如果 M
无用,就认为证明有效;否则拒绝。Perm()
,X
)这样的证明,那么 Bob 按照上一节的验证方法进行验证。G
,否则 Alice 就可以作弊。如果一个证明者选择证明的「命题」与 CRS 无关,那么这个证明者被称为 Non-adaptive Adversary。FLS 变换:从 Hidden Bits 到 NIZK
F(x)
,x
是一个集合 S
中的元素,然后函数 F(x)
把x
映射到 S
中的另一个元素 y
。同时 F(x)
满足单向性,即通过 y
很难反算出 x
;但是如果谁拥有陷门 t
,就能实现反向计算F^(-1)(t,y)=x
。陷门置换还可以匹配一个 Hardcore Predicate,h(x)=0/1
,它能根据 S
集合中的元素产生一个一致性分布的 0/1
比特。介绍完毕,大家是不是有点晕,没关系,晕一晕就习惯了。总之一句话,陷门置换可以对公共参考串和Hidden Bits 进行相互转换。,
列表中的每一项都是集合 S中的元素。然后通过 Hardcore Predicate 产生 Hidden Bits 中的每一个比特位。
但是请注意,这里不能直接通过 h(y)=b来产生 Hidden Bits,因为这样一来 Bob 就能自己算出所有的 Hidden Bits,这违反了上一节的协议。为了保证对 Bob 隐藏,我们需要用公共参考串的原象,也就是
x1, x2, x3, ..., xn来产生 Hidden Bits,
h(x)=b。
Bob 虽然不能自己计算b1, b2, b3, ..., bn,
但是一旦得到一个x,他就能检验F(x)?=y来判断是否x是和公共参考串对应,同时再计算h(x)=b得到被揭示的 Hidden Bits,
b。
(F, h, t)
xi = F^(-1)(t, yi)
x
,分别为 xr1, xr2, xr3, ... xrl ,连同(F, h)
,和证明一起并发给 Bob。(F, h)
是否为一个合法的 Trapdoor Permutation。L
中的每一个元素 xr,计算出被揭示的 Hidden Bits bi=h(F(xr)),然后按照上一节的协议检查证明。(proof, {r}, {b})
r
,模拟器从集合 S
中随机选择一个 xr,使得 h(xr)=br,这里 br就是 {b}
中对应 r
;然后把 yr=F(xr) 作为假参考串的一部分。{r}
无关,那么模拟器随机选一个 y
即可y
拼在一起,得到一个假CRS。(F,h,t)
,Alice 可以挑选一个对自己有利,甚至作弊的 (F, h, t)
,使得她可以控制一次协议运行的 Hidden Bits {b}
的结果。对于本节升级后的新协议而言,需要重复很多遍,以致于虽然 Alice 可以控制一次协议运行的 Hidden Bits,但是她对其它若干次协议运行的 Hidden Bits 无能为力。换句话说,Alice 无论如何挑选 (F, h, t)
都无法完全掌控多次的协议运行。寻找理想的 Trapdoor Permutation
F()
是否是一个「完美」的置换。问题来了, Bob 怎么能在多项式时间内检查出来呢?如果 Bob 不能检查,那么 Alice 就可以抽样一个不完美的 Permutation(比如一个「多对一」的函数),从而可能作弊,破坏「Soundness」这个性质,Bellare 和 Yung 发表在 1996 年的论文最早注意到了这一点,但是并没有完全解决这个问题[BY96]。NIZK Proofs 与 NIZK Arguments
NP
问题中的 witness
。只要 Bob 算力够强,他就可以把证明解密。对于「抽取器」而言,它也需要在没有交互的情况下抽取 witness
。证明最短的 NIZK Proofs 当属 Greg Gentry 等人采用「全同态加密」技术构造的 NIZK 方案了 [GGI+14],证明长度只是稍稍大于 witness 的长度。AR
正是指代 Argument。O(1)
常数级长度的证明,即与 witness
的长度无关。然而这需要隐藏更多的秘密到 CRS 中。没有秘密的世界
A person who proves P == NP would walk home from the Clay Institute not with one million-dollar check but with seven.
如果谁能证明 P = NP,那么他不会只拿着一张百万美元支票回家,而是七张。
—— Lance Fortnow (2004)
自指论证:如果 P = NP 是事实,那么这个证明会比较容易被发现;但是如果 P != NP,那么这个证明会比较难发现。所以相信 P != NP 看起来会让 数学现实 更一致一些。
—— Scott Aaronson (2006)
未完待续 All human beings have three lives: public, private, and secret. 每个人都有三种生活,公开的,私人的,以及秘密的。 —— Gabriel García Márqueel
致谢:感谢陈宇,丁晟超,张宇鹏,胡红钢,刘巍然,何德彪等老师的专业建议和指正,感谢安比实验室小伙伴(p0n1, even, valuka, Vawheter, yghu, mr)的修改建议。本文内容不代表他们观点。 最后附上漫画书的链接:http://panelsyndicate.com/comics/tpeye 作者甚至把创作过程的邮件和草图都放了出来,大家可以体验一下窥视制作过程的快感。 参考文献
[Aar06] Aaronson, Scott. Reasons to believe, 2006. https://www.scottaaronson.com/blog/?p=122
[BFM88] Blum, Manuel, Paul Feldman, and Silvio Micali. "Non-interactive zero-knowledge and its applications." STOC'88. 1988.
[BG90] Bellare, Mihir, and Shafi Goldwasser. "New paradigms for digital signatures and message authentication based on non-interactive zero knowledge proofs." Conference on the Theory and Application of Cryptology. Springer, New York, NY, 1989.
[BGN05] Boneh, Dan, Eu-Jin Goh, and Kobbi Nissim. "Evaluating 2-DNF formulas on ciphertexts." Theory of Cryptography Conference. Springer, Berlin, Heidelberg, 2005.
[BGRV09] Brakerski, Zvika, Shafi Goldwasser, Guy N. Rothblum, and Vinod Vaikuntanathan. "Weak verifiable random functions." In Theory of Cryptography Conference, pp. 558-576. Springer, Berlin, Heidelberg, 2009.
[BY96] Bellare, Mihir, and Moti Yung. "Certifying permutations: Noninteractive zero-knowledge based on any trapdoor permutation." Journal of Cryptology 9.3 (1996): 149-166.
[CHK03] Canetti, Ran, Shai Halevi, and Jonathan Katz. "A forward-secure public-key encryption scheme." International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2003.
[CHMMVW19] Chiesa, Alessandro, et al. Marlin: Preprocessing zksnarks with universal and updatable srs. Cryptology ePrint Archive, Report 2019/1047, 2019, https://eprint.iacr.org/2019/1047, 2019.
[DN00] Dwork, Cynthia, and Moni Naor. "Zaps and their applications." Proceedings 41st Annual Symposium on Foundations of Computer Science. IEEE, 2000.
[FLS90] Feige, Uriel, Dror Lapidot, and Adi Shamir. "Multiple non-interactive zero knowledge proofs based on a single random string." Proceedings [1990] 31st Annual Symposium on Foundations of Computer Science. IEEE, 1990.
[For04] Fortnow, Lance. "What if P = NP?". 2004. https://blog.computationalcomplexity.org/2004/05/what-if-p-np.html
[For09] Fortnow, Lance. "The status of the P versus NP problem." Communications of the ACM 52.9 (2009): 78-86.
[Groth10a] Groth, Jens. "Short non-interactive zero-knowledge proofs." International Conference on the Theory and Application of Cryptology and Information Security. Springer, Berlin, Heidelberg, 2010.
[Groth10b] Groth, Jens. "Short pairing-based non-interactive zero-knowledge arguments." International Conference on the Theory and Application of Cryptology and Information Security. Springer, Berlin, Heidelberg, 2010.
[GOS06] Groth, Jens, Rafail Ostrovsky, and Amit Sahai. "Perfect non-interactive zero knowledge for NP." Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2006.
[GWC19] Gabizon, Ariel, Zachary J. Williamson, and Oana Ciobotaru. PLONK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge. Cryptology ePrint Archive, Report 2019/953, 2019.
[KP98] Kilian, Joe, and Erez Petrank. "An efficient noninteractive zero-knowledge proof system for NP with general assumptions." Journal of Cryptology 11.1 (1998): 1-27.
[MBK+19] Maller, Mary, et al. "Sonic: Zero-Knowledge SNARKs from Linear-Size Universal and Updateable Structured Reference Strings." IACR Cryptology ePrint Archive 2019 (2019): 99.
[RL18] Ran Canetti and Amit Lichtenberg. "Certifying trapdoor permutations, revisited." Theory of Cryptography Conference. Springer, Cham, 2018.
[Wil12]Gasarch, William I. "Guest Column: The Third P=? NP Poll." ACM SIGACT News 50.1 (2019): 38-59.
[Yao82] Yao, Andrew C. "Theory and application of trapdoor functions." 23rd Annual Symposium on Foundations of Computer Science (sfcs 1982). IEEE, 1982.
往期回顾 从零开始学习 zk-SNARK(二)——多项式的非交互式零知识证明 零知识证明 Learn by Coding:libsnark 入门篇 长按二维码添加微信进群讨论零知识证明 info@secbit.io 安比(SECBIT)实验室
Scan to Follow