simulationPart2
How To Simulate It – A Tutorial on the Simulation Proof Technique-Part2
Simulating the View of Malicious Adversaries– Zero Knowledge
零知识仿真考虑的是恶意对手(尤其是恶意验证者),他们的行为可能是任意的,不一定符合协议规范。零知识中没有私人输入或输出,模拟器需要在证明中生成验证者的观点,而不需要考虑输入和输出的额外复杂性。
恶意的验证者:在零知识证明系统中,确实主要考虑的是恶意的验证者,而不是恶意的证明者。这是因为零知识证明的目标是让证明者向验证者证明某件事情,而不泄露任何额外的信息。因此,系统需要确保即使验证者是恶意的,也无法从证明中获取任何额外的信息。证明者通常被假设为诚实的,因为如果证明者是恶意的,他们可以随意伪造证明,这样整个系统就失去了意义。
模拟器需要生成验证者在证明中的视图:这句话的意思是,模拟器需要生成一个与验证者在实际证明过程中看到的内容相同的视图。具体来说,模拟器需要生成验证者在与证明者交互时所看到的所有消息和数据,但不依赖于任何实际的秘密信息。这是为了证明即使验证者是恶意的,他们也无法从证明中获取任何额外的信息,因为模拟器可以在没有任何秘密信息的情况下生成相同的视图。
Defining Zero Knowledge
Notation
:概率多项式时间机器
:机器A在输入,辅助输入和随即磁带上的输出。
:语句的长度
:表示乙方在公共输入上与甲方交互执行的输出,其中甲方有辅助输入和随机磁带,乙方有辅助输入和随机磁带
:是 A(或B)在大小为的输入上使用的随机比特数。
The definition
语言的交互式证明系统包括一个证明者和一个验证者,在共同输入时,证明者试图让验证者相信。这样的证明系统具有以下两个特性:
- 完备性:这说明,当诚实的和就共同输入进行交互时,那么确信这一语句的正确性(但最多可忽略的概率除外)。
- 健全性:这说明当在共同输入上与任何(作弊的)证明者交互时,将以最多可忽略的概率被说服。(因此,不可能被骗去接受一个错误的陈述)。
如果存在一个模拟器,可以仅从语句生成验证者的观点,那么这个证明就是零知识。我们要指出的是,被破坏的验证者可以输出任何它想输出的东西,包括它的观点。
在本文定义中,我们仅考虑黑盒情况和语言情况
Definition 5.1 Let be an interactive proof system for an , and let be the associated . We say that is black-box computational zero knowledge if there exists a probabilistic-polynomial time oracle machine such that for every non-uniform probabilisticpolynomial time algorithm it holds that:
where is uniformly distributed, and where denotes the next-message function of the interactive machine when the common input , auxiliary input and random-tape are fixed (i.e., the next message function of receives a message history and outputs .
定义5.1:设 是一个 语言 的交互式证明系统, 是相关的 关系。如果存在一个概率多项式时间的预言机器 ,使得对于每一个非一致的概率多项式时间算法 ,都有以下等价关系成立:
其中 是均匀分布的, 表示当公共输入 、辅助输入 和随机带 固定时,交互式机器 的下一条消息函数(即 的下一条消息函数接收一个消息历史 并输出 )。
这段话的意思是,对于一个 语言的交互式证明系统 ,我们称它为黑盒计算零知识,如果存在一个概率多项式时间的预言机器 ,使得对于任何非一致的概率多项式时间算法 ,系统的输出与 机器的输出在计算上是不可区分的。这里的 “不可区分” 指的是,即使有一个强大的对手,也无法有效地区分两个输出集合的差异。
在这个定义中, 是证明者, 是验证者, 是一个可能的恶意验证者。 是公共输入, 是证明者的私有见证, 是辅助输入, 是随机带。预言机器 被用来模拟证明者 的行为,以产生一个与实际交互过程中验证者 观察到的输出在计算上不可区分的输出。
简而言之,这个定义说明了一个交互式证明系统是零知识的,如果存在一个模拟器 ,它可以在不知道证明者私有见证 的情况下,仅仅通过与恶意验证者 的交互,生成一个与真实交互过程中 观察到的输出在计算上不可区分的输出。这保证了即使验证者尝试作弊,也无法获得关于证明者私有见证的任何信息。
Preliminaries– Commitment Schemes
:通过使用随机字符串和安全参数对的承诺
perfect binding 是一个重要的概念,它确保了一个承诺方案(commitment scheme)的安全性。承诺方案允许一个人承诺一个值而不立即透露它,同时确保该值在未来可以被验证。
Computational hiding对于任何有限计算能力的攻击者来说,对不同字符串的承诺在计算上是无法区分的。换句话说,即使攻击者使用所有可用的计算资源,他们也无法确定承诺是对哪个字符串做出的。
LR-security of commitments
()的定义是通过向对手提供一个甲骨文来实现的,这个预言机接收两个等长输入,要么总是返回对第一个(左)输入的承诺,要么总是返回对第二个(右)输入的承诺。对手的任务就是确定它收到的是左承诺还是右承诺。
我们将其定义为
其中敌手要么被给予要么被给予并且要尝试能够区分这两个。
Experiement
- Choose a random
- Set
- Output 1 if and only
如果是一个非交互式完全约束承诺方案,对非均匀对手具有安全性,那么对于每个非均匀概率-多项式时间对手,都存在一个可忽略的函数,使得
我们将在下文中指出,非均匀安全性是必需的。
Non-Constant Round Zero Knowledge
考虑零知识证明中的三着色问题和汉密尔顿性。
这类协议通常包含着三部分:
- 发送承诺(commitment)
- 发送挑战(challenge),并要求打开承诺
- 发送合适的回应(decommitment)
考虑三色问题,这类问题要求证明,在一个图中,要求为中每一个顶点涂色,使得相邻两个顶点的颜色不同。证明者承诺一个随机的有效着色,验证者要求打开与一条边相关的颜色。图中必须至少有一条边能为证明者承诺着色的边的两个端点分配相同的颜色。如果验证者要求打开这条边的颜色,那么证明者就会被发现作弊。因此,证明者作弊的概率最多为,其中是边的合集
通过重复证明 次(其中是图的个数),我们可以得出证明者作弊的概率最多可以忽略不计。因此,这个证明是正确的。
对于这个问题的模拟器证明思路,如果模拟器提前知道要查询的边,那么它就可以在该边的端点上随机承诺不同的颜色,而在其他地方承诺垃圾颜色。根据承诺方案的隐藏特性,这将是无法区分的。我们将看到,模拟器只需重复猜测要提前查询的边,直到猜对为止。
The rewinding technique (with commitments as envelopes)
首先,我们将描述如何构建一个模拟器,当我们把承诺建模为完美的信封时,信封在打开之前什么也不会显示。
构建模拟器的关键工具是重绕(rewind)。
模拟器调用验证器,并猜测一条随机边,希望验证器能查询这条边。
然后,模拟器会向验证者发送着色承诺。
如果验证者回复边,那么模拟器就为中的节点打开信封,本次迭代的模拟就完成了。否则,模拟器会将验证器倒退到迭代的起点并再次尝试,这次选择一条新的随机边。如此反复,直到,模拟器就成功了。
这种倒退不同于一般的倒退,它存在一定的失忆性,也就是不会记录失败的情形,就如同虚拟机的快照功能,可以快速回到某个时刻的某种状态。不失一般性的情况下,模拟器选择边的概率是,期望次数为,当执行超过次rewinding后,能够确保模拟器以极大的概率最终通过挑战。
这种设计下,验证者在模拟中的视图分布与其在实际执行中的视图分布完全相同。两者之间的区别在于,在真实证明中没有rewinding。
模拟器是如何实现rewind功能的
具体来说,模拟器可以从Oracle中获取验证者的下一个信息函数。这意味着,它提供了一份传入信息的副本,并在具有输入、辅助输入、随机磁带和传入信息时,接收回发送的下一条信息。现在,倒带实质上就是用调用其甲骨文,然后再用调用,以此类推。
零知识属性与健全性不矛盾
模拟器可以在不知道证明者的情况下证明定理,作弊者不可以,因为模拟器拥有证明者所不具备的额外能力,rewind。
上述承诺模型过于简单,我们还需要证明:
首先,必须证明验证者的视图在模拟和实际执行中是不可分的。
需要证明模拟在次尝试内成功停止,除非概率可以忽略不计。
关于中止情况的处理
在模拟阶段,如果没有返回某条有效的边,可以让真正的验证者将任何无效回复解释为默认边。
Theorem:Let be a perfectly-binding commitment scheme with security for non-uniform adversaries. Then, the 3-coloring protocol of is black-box .
Proof:
是一个模拟器,给定一个图,以及对某个个概率多项式时间的访问
工作原理如下:
1.将消息历史副本初始化为空字符串
2.以下步骤重复次
(a)设置
(b)随机选择一条边并给两个点不同颜色。形式上,选择并且\phi(v_l)\in_R\{1,2,3\} \textbackslash {\phi(v_k)}。对于其余的v_i \in V \textbackslash {v_k,v_l},设置
(c)对于,计算
(d)发送给。形式上,查询与该向量连接的,并让作为回复
(e)如果,那么将承诺和发送给。形式上,更新字符串
(f)如果,那么设置。如果,则输出失败符号,否则返回第2b步。
3.输出的任何结果。
为了证明模拟器,我们构建一个新的模拟器,它每次都知道正确的着色方法。
我们强调并不是一个有效的模拟器,因为它得到的是。相反,它是用于证明的思想实验。
现在,的工作方式与完全相同,只是在每次迭代中,它都会在上随机选择一个置换,设置,并对所有计算,这与真正的证明者完全相同。
我们要首先证明,模拟器和的输出是一致的,即对于每个:
由于二者都是对有效着色的随机排列的承诺,因此两者的分布是相同的。唯一不同的是,提前选择了一条边,并且只有当发送的查询等与时才结束迭代。
接下来证明,最多以可忽略的概率输出。在一次循环中,次都没选中的概率是
,对于轮循环中,概率不会超过,也就满足
最终,我们得到和是不可区分的:
假设存在一个概率多项式时间验证器、一个概率多项式时间区分器和一个多项式,对于一个无限序列
我们利用实验作为证明方法,攻击者接收作为辅助输入
1.输入,初始化
2.然后输入,但算法需要一些改动
(1)对于随机选择的边,生成承诺
(2)对于其他的所有点,攻击者以来询问,用作为返回值
3.当算法结束后,算法调用区分器并把的输出作为区分器的输入,区分器输出什么,算法输出什么
此时我们发现,当随机选择bit是1的时候,承诺与相同,0的时候,与相同。
于是我们有:
最终,我们得到:
关于证明技巧的讨论。
首先够造模拟器,然后找到模拟器与现实证明者之间的区别,如果这些区别能够一次证明不可区分,那就一步即可证明,如果不能的话,就将这些区别划分成多个能够证明的不可区分。然后逐步调整不同点,从模拟器到真实情况一点一点地变换过去。这种技术也被称为混合论证(hybrid argument)。除了模拟证明以外,还有一种经典的证明方式是游戏证明(game-based proof)。模拟证明与游戏证明的区别在于,模拟证明是从先构造模拟器,然后从理想情况一点点转移到真实情况中,而游戏证明是从真实情况一点点转移到一个理想的情况中。
Constant-Round Zero-Knowledge
我们将三着色问题进行修改,将其变成一个常数轮的协议。
当我们简单地考虑并行运行轮协议的时候,但我们根本无法证明这仍然是零知识。
当并行时,证明者一次性发送份承诺,验证者一次性向证明者发送条随机的边,但此时rewind不再适用,在并行下,模拟器一次想要猜对的概率是。因此,对于这种没有合适的证明方法的方案,可以通过修改协议来使得能够证明成功。这也是一种设计密码学方案的小技巧,有的时候可以通过一些小改变来使得一个方案满足可证明安全。
修改后的协议具体细节如下:
1.证明者选定相关perfectly-hiding承诺的信息并发送给验证者,用表示
2.选择条随机的边,,是query字符串,用来隐藏
3.准备份像非常数论的协议的承诺,发送给
4.decommit
5.如果验证者的decommit是无效的,那么证明者直接abort。否则证明者对于query的每一条边都decommit。
6.验证者当且仅当所有的检查都通过的时候,输出1。
其中值得注意的是,验证者发给证明者的承诺是perfectly hiding的,而证明者发给验证者的承诺是perfectly binding的。
经过这样修改的协议可以确保验证者在承诺后是无法更改选择的边的,于是模拟器在验证者decommit字符串后就会知道所有挑战值,然后rewind到验证者发完承诺的时候,此时模拟器就相当于提前知道了所有的挑战值,于是模拟器就可以很容易通过挑战了。
但是除此以外还有一些细节需要说明,也就是对于发生中止的情况要单独考虑进来。首先要考虑的就是验证者在decommit字符串的时候是无效的,所以会发生abort。这存在的问题是,验证者的decommit阶段是在rewind之后,那么可能会出现,验证者第一次decommit是正常的,模拟器也从中获得了所有挑战值,但是在模拟器rewind以后,第二次验证者decommit无效导致模拟器中止。看似这种情况并不会对协议产生影响,但是这样会导致模拟器产生abort的概率与真实情况下产生abort的概率不同(因为模拟器需要两次都通过才能不abort),那么势必会导致产生的分布是可区分的。更糟糕的是,无法像非常数轮那样,即使验证者发送的decommit无效,证明者也继续运行,并将无效的边视为某一条默认的边。因为如果这样做的话,如果验证者decommit无效,模拟器就没有办法准备正确的挑战边,那么一次rewind将无法保证能够顺利通过挑战。因此,解决这个问题的方法是如果第一次abort了,那模拟器就直接abort,如果第一次没abort,那么无论接下来就不去理会验证者发来的commitment是否能够decommit成功(如果decommit不成功就继续循环直到成功),因为此时已经知道了对应的挑战值。
剩下的需要关注的点在于,verifier使用的commitment scheme是perfectly hiding的,所以最多只能是computationally binding,也就意味着有可能decommit出有效的值,但此时simulation就失效了。因此需要把这部分情况考虑进来,用归约的方式把这部分证明。
另一个需要注意的问题在于,模拟器的运行时间可能并不是期望多项式时间的。假设验证者不abort的概率为,那么我们可以估算出模拟器的运行时间大概为 ,但实际上需要考虑到commitment并不是perfectly hiding的,所以一旦恶意验证者是可以区分commitment的话,那么验证者可以只要判断收到的是garbage commitment就可以一直abort,令模拟器永远无法通过挑战。所以真正计算运算时间的时候应该把这部分概率考虑进去,即 。看似这个式子仍然可以满足期望多项式时间,但如果的概率值与的概率过于接近的话,运行时间将可能会是指数级别的。有关运行时间的问题是一个共性问题,一旦rewind前后的分布是不同的(即使不可区分),而且想要整个模拟继续运行下去需要攻击者达到某种条件(比如,攻击者不能abort),那么就都可能会面临这个问题。
安全性证明
令是一个perfectly-hiding承诺机制, 是一个perfectly- binding 承诺机制,它们都具有对于non-uniform概率多项式时间攻击者算法下的安全性。那么上述常数轮的协议满足黑盒计算零知识安全性(模拟器的运行时间是期望多项式时间)
证明:
我们给出模拟器的构造
-
模拟器调用并选定相关承诺的信息输入进去。
-
模拟器得到验证者的commitment。
-
模拟器发送给garbage commitments然后获得的decommitment输出。
-
如果decommitment是无效的,那么直接中止。否则,把decommited的字符串表示为,并执行以下步骤。
-
模拟器 rewind到最开始并获得了commitment (因为 𝑉∗ 的random tape是固定的,所以 是一样的,那么就能确保 是一致的):
-
- 模拟器 生成 个承诺向量 。选择验证者挑战的边设置为不同的着色,其余的着色均是0(garbage值)。模拟器将承诺向量发送给验证者,并得到回复。
- 如果 没有生成有效的decommitment,那么模拟器 回退到前一步(用新的随机性)。
- 如果 生成有效的decommitment但是 ,那么模拟器 输出ambiguous并中止。
- 否则, 退出循环并进行到下一步。
-
模拟器 向 继续发送对应点的decommitment,然后输出 的输出。
然而目前的模拟器构造还不够,因为还没有解决运行时间超过期望多项式时间的问题。