云中「秘密」:构建非交互式零知识证明---探索零知识证明系列(五)

本文作者:郭宇

Once exposed, a secret loses all its power. 一旦泄露,秘密就失去了全部威力 ― Ann
Aguirre

这已经是本系列的第五篇文章了,这一篇继续深入非交互式零知识证明。 本文约 12,000 字。

系列一:初识「零知识」与「证明」

系列二:理解「模拟」

系列三:寻找「知识」

系列四:随机「挑战」

追到这里的读者想必已对零知识证明有了一个大概的认识。你是否想过这个问题:零知识证明为何可行?这里请大家思考一下(比如系列一 中的地图三染色问题的流程) …… (此处停留三分钟)下面两个要素 似乎 必不可少:

  1. 「交互」:验证者通过多次反复挑战,把证明者作弊概率降低到一个极小的值
  2. 「隐藏随机性」:验证者产生让证明者无法预测的随机数进行挑战

然而对于非交互式零知识证明—— NIZK 来说,如何实现上面两点?在 系列四 我们介绍了如何采用「随机预言机」来扮演一个虚拟的「第三方」角色,实现虚拟的「交互」与「随机挑战」。本文将深入讲述另一种方法,如何通过一段共享的字符串去除「交互」与「隐藏随机性」。这个字符串必须事先由「第三方」来随机产生,这就是传说中的「公共参考串」(Common Reference String,简称 CRS)。

CRS 的前世今生

假如我们不借助任何其它手段,限定证明者 Prover 和验证者 Verifier 只能进行「一次交互」来实现「零知识证明」,那么他们只能证明「平凡」问题,也就是计算复杂类 BPP(Bounded-error Probabilistic Polynomial time),而这个复杂度类大家一般猜想可能等价于 P(但还悬而未决,没有被证明!BPP 可以理解为 P + Randomness)。

注:如果 Prover 与 Verifier 只做一次交互,在这样的 NIZK 系统中,我们很容易能构造一个 Decision Procedure —— Verify(x, Sim(x)),来证明和证伪定理,因此只能证明平凡问题 BPP。

平凡问题虽然也可以零知识证明,但没有意义!怎么理解呢?因为验证者直接可以在多项式时间内根据「输出」求解出「秘密输入」,虽然验证者能够求解,但是「证明」本身并没有额外为验证者提供更多的「知识」。换句话说,不需要证明者出示证明,验证者就知道命题为真,于是证明过程也是零知识的。

因此,当我们讨论「零知识证明」时,要考虑带「知识」的 NP 类问题。大家都知道,P 问题是「确定性图灵机」多项式时间内可以求解的复杂类,它的执行路径对于输入 x是一个线性的状态转移。而 NP 问题是「不确定性图灵机」多项式时间可以求解的问题类。所谓的不确定性图灵机,就是它每次往前走一步是不确定的,有很多个选择,只要任何一个执行路径能到达终止状态,就表示它解决了该问题 x。换句话说,它的执行轨迹是一棵树。那么如果我们把不确定性图灵机每一步的路径选择记录下来(这个执行路径的记录叫做 witness,也就是我们反复提到的「知识」),那么把(x, witness)交给一个确定性图灵机,那么它也能在多项式时间内解决掉 x 问题。

再强调一下,「知识」能提高图灵机的解决问题的能力。

NP 问题中存在着不想「泄露」给验证者的知识 witness,这时,在一个交互式证明系统中,证明者和验证者在「知识」的掌握程度上是不对等的。

为了保证证明过程的「零知识」,我们需要保证:模拟器与验证者的不对等。可是,模拟器没有 witness啊,怎么能让他们不对等呢?上一篇我们介绍了「随机预言机」,我们通过允许让模拟器可以绑架「随机预言精灵」的方式制造不平等。本篇将讲述如何利用 CRS 来制造不平等。

CRS 是一个在证明之前就已经公开的,并且在证明者与验证者之间共享的,随机字符串。我们怎么来使用 CRS 呢?直觉上,一串双方都「知道」的信息,并不会增加「知识」不对等的情况。

首先大家会想,能不能直接用 CRS 作为随机挑战数呢?可不可以让 CRS 来代替「随机预言精灵」的角色?答案是不行!

为什么?这是因为 CRS 是在证明之前就已经产生了,如果证明者 Prover 提前知道了所有的随机挑战数,那么很显然这个随机挑战也就失去了意义。

注:请大家回想下「随机预言机」是如何保证证明者无法提前预测「随机挑战数」的?没想明白的你,请重读系列(四)。

CRS 的使命就是让「模拟器」与「验证者」不平等。怎么做呢?隐藏一些「秘密」进去。

如果进一步追问,隐藏了「秘密」有什么用呢?当然有用啦,在「理想世界」中,模拟器与抽取器才能很开心地玩耍起来(获取某些超能力) ……

1988年,Manuel Blum,Paul Feldman 和 Silvio Micali 三位先驱发表的论文 「Non-Interactive Zero-Knowledge and Its Applications」(『非交互式零知识证明及其应用』[BFM88])展示了「交互」与「隐藏随机性」的不必要性。他们给出了一个地图三染色问题的 NIZK 证明系统,在一段共享的随机产生的字符串(即CRS)的帮助下。

不过,……,我不会告诉你这个方案需要共享大概 n^4 超长的 CRS,其中 n是要证明的「命题」的长度。

1990 年,Uriel Feige,Dror Lapidot 与 Adi Shamir 三人提出了另一种构造 NP 语言的 NIZK 方案 [FLS90]。与 [BFM88] 不一样的是,这个 NIZK 方案不再基于特定的数论假设,而是基于一个密码学工具 Trapdoor Permutation。在这个方案中,FLS 提出了「隐藏比特」(Hidden Bits)的概念,然后把 Hidden Bits 藏入了 CRS。对于模拟器而言,就可以通过修改 CRS 中的 Hidden Bits 来达到模拟的效果,从而体现出对验证者 Verifier 的优越性。不过,这个方案需要共享更长的 CRS,超过 k * n^5,这里 k 是安全参数。

此后,Hidden Bits 的思路被很多人采用,值得一提的是,Kilian 与 Petrank 采用了一种更巧妙的方法来使用 Hidden Bits [KP98](这里空间太小,写不下:),成功地把 CRS 的长度缩减到了 k * n^2。后来 J. Groth 继续优化 ,把 CRS 的长度缩小到了大约 k*n[Groth10a]。

除了 Hidden Bits,J. Groth,R. Ostrovsky 与 A. Sahai [GOS06] 使用了同态加密方案 Boneh-Goh-Nissim [BGN05] 或 Boneh-Boyen-Shacham 来实现 NIZK,他们把加密方案的「公钥」当做是 CRS,同时 Prover 加密作为证明,然后利用同态性质来证明另一个 NP-Complete 问题——布尔电路的可满足性问题。这个方案的最大优点,就是 CRS 长度是固定的,因为只是一个密钥而已,长度只有 k。对于模拟器而言,它可以通过超能力,拿到这个公钥所对应的陷门,从而能够实现密封任何信息,但得到相同的密文;对于抽取器而言,它可以用超能力拿到公钥对应的私钥,从而能够解密证明得到「知识」。

Jens Groth 在 2010 年基于 KEA(Knowledge of Exponent Assumption) 假设与 Pairing 提出了一种新的 NIZK Arguments 方案[Gorth10b],这也是后续许许多多 zkSNARKs 方案的起点。这里的 CRS 由一对对的 (gxn, g⍺xn) 构成,被用来实现「知识承诺」。其中 x 与 ⍺ 是两个随机数,在产生完 CRS 之后,必须被「遗忘」。有些人把这部分需要遗忘的随机数叫做「Toxic Wastes」,这容易误导读者。他们不仅无毒无害,而且非常有用。他们是被藏入 CRS 的「秘密」,是模拟器的武器。如果模拟器得到了 x 与 ⍺,就能伪造证明,从而保证证明的零知识。而对于抽取器,他能直接通过 KEA 假设内建的抽取函数来抽取知识。

最新的 Sonic 方案[MBK+19]又在 [Groth10b] 的基础上实现了 Updateable CRS。如果任何人担心 CRS 中的秘密已经被泄露了,他就可以在原有 CRS 基础上打一个补丁,继续往里藏一个秘密,这样就能保证 CRS 的安全性。这里的 CRS 还是「Universal 全局」 的,即 CRS 只需要生成一次,就可以应付所有的命题证明。 这个方案后续被最新的 Plonk[GWC19],Marlin[CHMMVW19] 等方案采用。

接下来,我们就从一个简单的例子开始,理解如何基于 CRS 来构造 NIZK。在这之前,我们需要介绍一个 NP-Complete 问题——哈密尔顿环路问题。

哈密尔顿环路问题

想象出一个地图中有若干个城市,城市与城市间可以有公路。

假如给你一副地图,让你找出一条路径,不重复地走遍所有的公路(假设每条公路都是风景美如明信片的 Parkway,或许你想不重复地吃遍每条公路边上的麦当劳,出于某种情怀)。相信你会马上兴奋起来,这不就是小时候学过的「一笔画」么?判断一个地图能否一笔画,这是小学生做的数学题,我们可以计算每个城市连接的公路个数,根据奇偶性分成「奇点」与「偶点」。如果一个地图中存在两个奇点城市,那么你只能从一个奇点城市出发,遍历所有的公路,并且最终到达另一个奇点城市。这条路径就被称为「欧拉路径」(Euler’s Path)。

如果一个地图中所有的城市都是偶点,那么你可以从任意一个城市出发,轻松地找出一条路径,不重复地遍历所有的公路,并且回到起点。这个环路被称为「欧拉环路」(Euler’s Circuit)。

而如果地图存在超过2个以上的奇点,那么就不存在欧拉回路,比如著名的哥德斯堡七桥问题。

著名的哥德斯堡七桥问题就是这么描述,如果不重复地穿过下面七座桥。

在这里插入图片描述

哥德斯堡七桥地图显然存在多个奇点,不存在欧拉路径。如果给定任何一个地图,是否存在一个欧拉环路,这是一个 P 问题,也就是一个计算机可以在 poly(n) 多项式时间内寻找。

注:欧拉环路的寻找算法被称为 Fleury算法。

对于这样一个 P 问题, 如果一个证明者 Prover 证明他知道一个欧拉回路,那么他可以直接发送回路的明文,然后验证者 Verifier 验证回路正确与否。请注意,这个过程仍然是零知识的。因为,Verifier 并没有通过 Prover 发送的信息获得任何 额外的知识。换

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值