一、零知识证明
零知识简洁的非交互知识论证(zk SNARK)是一种真正巧妙的方法,可以在不透露任何其他信息的情况下证明某件事是真的,然而,为什么它首先是有用的呢?
零知识证明在无数应用中是有利的,包括:
关于私人数据的证明声明:
匿名授权:
匿名付款:
外包计算:
尽管表面上听起来很棒,但底层方法是数学和密码学的“奇迹”,自 1985年在主要著作“交互式证明系统的知识复杂性中引入以来,已经进行了第四个十年的研究随后引入了非交互式证明,这在区块链的背景下尤为重要。
在任何零知识证明系统中,都有一个验证人想要说服验证人某些陈述是真实的,而不披露任何其他信息,例如,验证人了解到验证人的银行账户中有X多个,但没有其他信息(即,未披露实际金额)。协议应满足三个属性:
让我们从简单开始,并尝试证明某些东西,而不必担心零知识,非交互性,其形式和适用性。
想象一下,我们有一个长度为 10数组,我们想向验证者(例如程序)证明所有这些位都设置为 1,即我们知道一个数组,使得每个元素都等于 1。
验证者一次只能检查(即读取)一个元素。为了验证语句,可以通过以某种任意顺序读取元素,并检查它是否真正等于1,如果是,则在第一次检查后该语句的置信度为10%,或者如果该位不等于1,则语句完全无效。验证者必须进入下一轮,直到他获得足够的信心。在一些情况下,可以信任证明者并且只需要50%置信度,在需要95%置信度的其他情况下,必须检查所有单元。很明显,这种证明协议的缺点是,必须进行与元素数量成比例的检查数量,如果我们考虑数百万个元素的数组,这是不切实际的。
让我们考虑多项式,有一个曲线对应于多项式:。多项式有一个有利的性质,即如果我们有两个不相等的次数最多为 d的多项式,它们相交的点不超过 d。例如,让我们稍微修改原始多项式。如果我们想找到两个多项式的交点,我们需要将它们等同起来。例如,要找到多项式与x轴相交的位置(即),我们将等同,并且此类方程的解将是那些共享点:,和。
同样,我们可以将多项式的原始版本和修改版本等同起来,以找到它们的交点。所得的多项式为1,且有明显的解。因此只有一个交点。
对于任意次数为 d的多项式,任何此类方程的结果始终是另一个次数最多为 d的多项式,因为没有乘法可以产生更高的次数。示例:,简化为。代数基本定理告诉我们,d次多项式最多可以有 d个解。因此,我们可以得出结论,任意点处的任何多项式的求值类似于其唯一身份的表示。让我们在x= 10处评估我们的示例多项式。
事实上,在所有要计算的x选项中,最多只有3个选项在这些多项式中具有相同的计算,而所有其他选项都会不同。这就是为什么如果证明者声称知道一些多项式(无论其次数有多大),他们可以遵循一个简单的协议来验证语句:
例如,如果我们考虑 x从 1到的整数范围,则评估不同的点数为。此后,x意外“击中”任何个共享点的概率等于,这被认为可以忽略不计。
注意:与无效位检查协议相比,新协议只需要一轮,并且在声明中给出了压倒性的信心(假设 d充分小于范围的上限,几乎 100%)。
这就是为什么多项式是zk-SNARK的核心,尽管也可能存在其他证明介质。
我们从证明多项式知识的问题开始,然后采用通用方法。在此过程中,我们将发现多项式的许多其他性质。到目前为止的讨论集中,关注一个弱的证明概念上,即各方必须相互信任,因为还没有措施来执行协议的规则。例如,证明者不需要知道多项式,他可以使用任何其他可用的方法来得出正确的结果。此外,如果验证者的多项式评估的幅度不大,比如说 10,验证者可以猜测一个数字,并且它被接受的概率是不可忽略的。我们必须解决协议的这种弱点,但首先知道多项式意味着什么?多项式可以表示为以下形式(其中 n是多项式的次数):
如果有人说他知道一个 1次多项式(即),那意味着他真正知道的是系数。此外,系数可以有任何值,包括 0。让我们说,证明者声称知道3次多项式,使得x= 1和x= 2是所有可能解中的两个。这样的有效多项式之一是。
代数的基本定理指出,只要多项式是可解的,任何多项式都可以分解为线性多项式(即代表直线的1次多项式)。因此,我们可以将任何有效多项式表示为其因子的乘积:
同样,如果这些因子中的任何一个为零,则整个方程为零,因此,所有都是唯一的解。我们的示例可以分解为以下多项式:
x的值是:0,1,2,你可以很容易地在多项式的任一形式上检查这一点。
回到证明者声称他知道根为 1和 2的 3次多项式,这意味着他的多项式具有以下形式:
换句话说,(x− 1)和(x− 2)是所讨论的多项式的余因子。因此,如果证明者想要证明他的多项式确实具有这些根而不公开多项式本身,则他需要证明他的多项式p(x)是那些协因子的乘法,称为目标多项式,和一些任意多项式h(x),即:
换句话说,p(x)具有t(x)的所有根。找到h(x)的自然方法是通过除法。如果证明者找不到这样的h(x),这意味着p(x)没有必要的协因子t(x),在这种情况下,多项式除法将具有余数。在我们的示例中,如果我们将除以。我们得到了无余数的结果。
使用我们的多项式身份检查协议,我们可以比较多项式和:
为了将其付诸实践,让我们在示例中执行此协议:
相反,如果证明者使用不同的,它没有正确的辅因子,例如,那么:
我们将得到,余数为,即:。这意味着证明者必须将余数除以才能评估。因此,由于验证者对x的随机选择,因此对于余数被t(x)整除的概率很低,因此,如果验证者将检查p和h补是整数,这样的证明将被拒绝。但是,该检查要求多项式系数也必须是整数。
现在,我们可以在不学习多项式本身的情况下检查多项式的特定属性,因此这已经为我们提供了某种形式的零知识和简洁。尽管如此,此构造仍存在多个问题:
我们将在以下部分解决所有问题。
在上文中,如果将和不是明文给出,而是作为黑匣子给出,那将是理想的选择,因此人们无法篡改协议,但仍然能够计算对这些模糊值。类似于哈希函数,因此在计算时很难返回到原始输入。
这正是同态加密的目的。也就是说,它允许对一个值进行加密,并能够对这种加密应用算术运算。有多种方法可以实现加密的同态特性,我们将简要介绍一种简单的方法。
一般的想法是,我们选择一个基数的自然数g(比如5),然后对一个值进行加密,我们将g乘以该值的幂。例如,如果我们想要加密数字3:
其中125是3的加密。如果要将这个加密的数字乘以2,则将其提高为2的指数:
我们能够将未知值乘以2,并对其进行加密。我们还可以通过乘法添加两个加密值,例如3+2:
同样,我们可以通过除法减去加密的数字,例如5− 3:
但是,由于基数5是公共的,因此很容易回到秘密数字,将加密的数字除以5,直到结果为1。除法的次数即为明文。
这就是模算法发挥作用的地方。模运算的思想如下:我们声明只选择前n个自然数,即0,1,…,n-1而不是拥有一个无限的数字集。如果任何给定的整数不在这个范围内,我们将其“环绕”。例如,让我们先选择六个数字。为了说明这一点,请考虑一个具有六个相等单位刻度的圆;这是我们的射程。
现在让我们看看数字8将落在哪里。打个比方,我们可以把它想象成一根绳子,它的长度是八个单位。如果我们把绳子连接到圆圈的开头并开始将绳子缠绕在它周围,旋转一圈后,我们还剩下一部分绳子.因此,如果我们继续这个过程,绳子将在2处结束。
它是模运算的结果。不管绳子有多长,它总是会停在圆圈的刻度之一处。因此,模运算将使其保持在一定范围内。 15个单位的绳索将在 3处停止,即 6+ 6+ 3(两个完整的圆圈,剩余 3个单位)。负数的工作方式相同,唯一的区别是我们将其包装在相反的方向,对于-8,结果将是 4。
而且,我们可以进行算术运算,结果总是在n个数的范围内。我们现在将使用符号“mod”来表示数字的范围。例如:3× 5= 3(mod 6); 5+ 2= 1(mod 6).
此外,最重要的特性是运算顺序无关紧要,例如,我们可以先执行所有运算,然后在每次运算后应用模或应用模。例如:相当于:2× 4= 2(mod 6); 2− 1= 1(mod 6); 1× 3= 3(mod 6).
那到底为什么有帮助呢?事实证明,如果我们使用模算术,则具有运算结果,回到原始数字是不平凡的,因为许多不同的组合将具有相同的结果: 5× 4= 2(mod 6); 4× 2= 2(mod 6); 2× 1= 2(mod 6).
如果没有模算术,结果的大小为它的解决方案提供了线索。否则,这条信息会被隐藏,而常见的算术属性会被保留。
如果我们回到同态加密并使用模运算,例如模 7,我们将得到:
和不同的指数会有相同的结果:
这是很难找到指数的地方。事实上,如果模数足够大,这样做就变得不可行,而现代密码学的很大一部分是基于这个问题的“难度”。该方案的所有同态属性都保留在模领域中:
encryption:
multiplication:
addition:
让我们明确说明加密函数:,其中 v是我们要加密的值。
这种同态加密方案存在局限性,尽管我们可以将加密值乘以未加密值,但我们不能将两个加密值乘以(和除以),也不能对加密值求幂。虽然从第一印象来看是不幸的,但这些属性将成为zk-SNARK的基石。
有了这样的工具,我们现在可以评估一个加密随机值为x的多项式,并相应地修改零知识协议。
让我们看看如何评估多项式。正如我们以前建立的那样,多项式就是知道它的系数,在这种情况下,它们是: 1,-3,2。因为同态加密不允许对加密值求幂,所以我们必须得到从1到3的x幂的加密值:,,,这样我们可以对加密多项式求值如下:
作为这些操作的结果,我们在我们未知的某个 x处对我们的多项式进行了加密。这是一个非常强大的机制,并且由于同态特性,相同多项式的加密计算在加密空间中总是相同的。我们现在可以更新协议的先前版本,对于d次多项式:
Verifier:
Prover:
Verifier:
由于证明者对s一无所知,因此很难提出不合法但仍匹配的评估。
虽然在这样的协议中,证明者的敏捷性是有限的,但他仍然可以使用任何其他方法来伪造证明,而无需实际使用所提供的 s幂的加密,例如,如果证明者声称仅使用 2次幂和有一个令人满意的多项式,这在当前协议中无法验证。
多项式的知识是其系数。我们在协议中“分配”这些系数的方式是通过对秘密值 s的相应加密幂求幂(即)。我们已经在选择 s的加密幂时限制了证明者,但这种限制并未强制执行,例如,可以使用任何可能的方法来找到满足方程的任意值和并将它们提供给验证者而不是和。例如,对于一些随机,和,其中可以从提供的 s的加密幂计算。这就是为什么验证者需要证明仅使用 s的幂的加密来计算和而没有别的。
让我们考虑一个1次多项式的基本例子,该多项式具有一个变量和一个系数,相应地,s的加密。我们正在寻找的是确保只有s的加密,即,被一些任意系数c同态“乘以”,而不是其他任何东西。所以对于任意的c,结果必须是形式。
一种方法是要求对另一个移位的加密值与原始值一起执行相同的操作,充当“校验和”的算术模拟,确保结果是原始值的取幂。这是通过引入的指数知识假设Knowledge-of-Exponent Assumption(或KEA)来实现的,更确切地说:
Alice有一个值a,她希望Bob指数到任何幂,唯一的要求是只有这个a可以指数,没有别的,以确保她:
因为 Bob无法从元组中提取,因此推测 Bob可以产生有效响应的唯一方法是通过以下过程:
最终,这样的协议向Alice提供了一个证据,证明Bob确实将a乘以他已知的某个值,并且他不能进行任何其他操作,例如乘法、加法,因为这将消除移位关系。
在同态加密上下文中,幂运算是加密值的乘法。我们可以在简单的单系数多项式的情况下应用相同的构造:
这种结构限制证明者仅使用提供的加密 s,因此证明者可以仅将系数 c分配给验证者提供的多项式。我们现在可以将这种单项多项式方法缩放为多项多项式,因为每个项的系数分配是单独计算的,然后同态地“相加”在一起。因此,如果向证明者提供 s的加密幂以及它们的移位值,他可以评估原始多项式和移位多项式,其中必须进行相同的检查。特别是对于 d次多项式:
对于我们之前的示例多项式,这将是:
现在我们可以确定,验证程序除了使用验证程序提供的多项式外,没有使用任何其他方法,因为没有其他方法来保持移位。此外,如果验证者希望确保在验证者的多项式中排除一些s的幂,例如j,他将不提供加密及其移位。
与我们一开始的相比,我们现在有了一个健壮的协议。然而,无论加密如何,零知识属性仍然存在一个明显的缺点:虽然理论上多项式系数可以有很大范围的值,但实际上它可能非常有限(上例中为 6),这意味着验证者可以暴力破解有限范围的系数组合,直到结果等于证明者的答案。例如,如果我们考虑每个系数的 100个值的范围,则 2次多项式将总共有 100万个不同的组合,考虑到蛮力将需要不到 100万次迭代。此外,即使在只有一个系数且其值为 1的情况下,安全协议也应该是安全的。
因为验证器只能从验证器发送的数据中提取关于未知多项式p(x)的知识,所以让我们考虑那些提供的值(证明):。他们参与以下检查:
gp=gh(多项式p(x)有t(x)的根)
(gp)α=gp′t(s)(使用正确形式的多项式)
问题是我们如何改变证据,使支票仍然有效,但无法提取任何知识?从上一节可以得出一个答案:我们可以用一些随机数δ(δ)来“移位”这些值,例如(gp)δ。现在,为了提取知识,首先需要找到被认为不可行的δ。此外,这种随机化在统计学上与随机性是无法区分的。
为了保持关系,让我们检查验证者的检查。证明者的值之一位于方程式的每一侧。因此,如果我们用相同的δ“移动”它们中的每一个,方程必须保持平衡。
具体地,证明者对随机δ进行采样,并用gα p(s)δ gh(s)δ对其证明值求幂,并提供给验证者进行验证:
(gp)δ= ghδ t(s)(gp)δα= gp′δ
合并后,我们可以观察到支票仍然有效:
注意:零知识是多么容易被编织到建筑中,这通常被称为“免费”零知识。
到目前为止,我们有一个交互式零知识方案。为什么会这样?由于该证明仅对原始验证者有效,其他任何人(其他验证者)都不能信任同一证明,因为:
因此,为了证明语句(在这种情况下是多项式的知识),需要与每个验证者进行单独的交互。
虽然交互式证明系统有其使用案例,例如,当证明人只想说服一个专用的验证人(称为指定验证人),这样证明就不能再用于向其他人证明同一陈述时,当一个人需要同时(例如,在区块链等分布式系统中)或永久地说服多方时,这是非常有效的。验证方需要始终保持在线,并对每个验证方执行相同的计算。
因此,我们需要的秘密参数是可重用的,公开的,可信的和不可滥用的。
让我们首先考虑在秘密(t(s),α)产生后如何保护它们。我们可以像验证者在发送给证明者之前对s的指数进行加密一样对它们进行加密。然而,我们使用的同态加密不支持两个加密值的乘法,这对于验证检查以使t(s)和h以及p和α的加密相乘都是必需的。这就是密码配对的地方。
密码配对(双线性映射)是一种数学构造,用函数,给定来自一组数字的两个加密输入(例如,,允许将它们确定地映射到不同数字输出集中的乘法表示,即,。
由于源和输出编号集合不同,因此配对的结果不能用作另一个配对操作的输入。我们可以将输出集(也称为“目标集”)视为来自“不同的宇宙”。因此,我们不能将结果乘以另一个加密值,并通过名称本身建议我们一次只能乘以两个加密值。在某种意义上,它类似于一个散列函数,它将所有可能的输入值映射到一组可能的输出值中的一个元素,并且它不是平凡可逆的。
注意:乍一看,这种限制只能阻碍依赖的功能,具有讽刺意味的是,在zk-SNARK情况下,它是该方案的安全性所拥有的最重要的属性。
配对函数的一个基本(技术上不正确)的数学类比是说明有一种方法可以“交换”每个输入的基数和指数,这样基数在转换过程中会被修改成指数,例如。然后将两个“交换的”输入相乘,使得原始 a和 b值在相同的指数下相乘,例如:
因此,由于在“交换”期间使用结果在另一个配对(例如,)中改变了碱基,因此不会产生所需的加密乘法。配对的核心属性可以用等式表示:
e(ga, gb)= e(gb, ga)= e(gab, g1)= e(g1, gab)= e(g1, ga)b= e(g1, g1) ab=...
从技术上讲,配对的结果是目标集不同生成器g下原始值的加密产物,即。因此,它具有同态加密的特性,例如,我们可以将多对的加密产物添加到一起:
注意:加密配对利用椭圆曲线来实现这些属性,因此从现在起,符号将表示曲线上的生成器点,该点将被添加到自身次,而不是我们在前面部分中使用的乘法群生成器。
有了加密配对,我们现在可以设置安全的公共和可重用参数。让我们假设我们信任一个诚实的一方来生成秘密 s和α。一旦α和具有相应α位移的 s的所有必要幂被加密(gα, gsi, gαsi for i in 0, 1,..., d),必须删除原始值。
这些参数通常被称为公共参考字符串common reference string或CRS。CRS生成后,任何prover和verifier都可以使用它来执行非交互式零知识证明协议。虽然不重要,但CRS的优化版本将包括对目标多项式target polynomial的加密评估。
此外,CRS分为两组(对于中的):
由于能够乘以加密值,verifier可以在协议的最后一步检查多项式,让verification key verifier进程从证明者那里接收到加密多项式评估 gp、gh、gp':
虽然可信设置是有效的,但它并不有效,因为 CRS的多个用户将不得不相信一个删除的和,因为目前没有办法证明这一点。因此,有必要最小化或消除这种信任。否则,不诚实的一方将能够在不被发现的情况下制作假证据。
实现这一点的一种方法是由多方使用前面部分中介绍的数学工具生成复合 CRS,这样这些方都不知道秘密。这是一种方法,让我们考虑三个参与者 Alice、Bob和 Carol,对应的索引为 A、B和 C,对于 i在 1、2、...中。.., d:
作为这种协议的结果,我们有复合和并且没有参与者知道其他参与者的秘密参数,除非他们串通。事实上,为了学习和,必须与其他所有参与者串通一气。因此,即使一个人是诚实的,也无法提供假证明。
注意:此过程可以根据需要对尽可能多的参与者重复。
可能存在的问题是如何验证参与者是否与 CRS的每个值一致,因为对手可以采样多个不同的 s1、s2、...。..和α1,α2,...,并将它们随机用于 s的不同幂(或提供随机数作为增强的公共参考字符串),从而使 CRS无效且不可用。
幸运的是,因为我们可以使用配对来乘以加密值,所以我们能够执行一致性检查,从第一个参数开始,并确保每个下一个参数都是从它派生的。参与者发布的每个 CRS都可以检查如下:
请注意,虽然我们验证每个参与者都与他们的秘密参数一致,但使用先前发布的 CRS的要求并未对每个下一个参与者强制执行(在我们的示例中为 Bob和 Carol)。因此,如果对手是链中的最后一个,他可以忽略先前的 CRS并从头开始构造有效参数,就好像他是链中的第一个,因此是唯一知道秘密 s和α的人。
我们可以通过额外要求除第一个参与者之外的每个参与者加密和发布他的秘密参数来解决这个问题,例如,Bob还发布:
这允许验证 Bob的 CRS是 Alice参数的适当倍数,因为 i in 1, 2,..., d:
同样,Carol必须证明她的CRS是Alice-Bob的CRS的适当倍数。
这是一个强大的CRS设置方案,不完全依赖任何一方。实际上,即使只有一方是诚实的,并且删除并且从不共享其秘密参数,即使所有其他各方都合谋,它也是非常明智的。因此,CRS设置中不相关的参与者越多,伪造证据的可能性就越小,如果竞争方参与,其可能性就可以忽略不计。该方案允许涉及对设置的易读性有疑问的其他不受信任的各方,因为验证步骤确保他们不会破坏最终的公共参考字符串(也包括使用弱α和s)。
我们现在准备巩固进化的zk-SNARKOP协议。形式上,为简洁起见,我们将使用大括号来表示由其旁边的下标填充的一组元素,例如si i∈[d]表示集合s1,s2,...,sd。
已商定目标多项式t(x)和校准仪多项式的d次:
Setup:
二、什么是零知识证明有什么用
在没有足够(甚至是根本没有)依据的情况下,猜出一个事件(密码反译)的计算方法,虽然是没有任何依据的猜,但是这个猜出的计算法方被证明是正确的,这就是零知识证明。
在Goldwasser等人提出的零知识证明中,证明者和验证者之间必须进行交互,这样的零知识证明被称为“交互零知识证明”。80年代末,Blum等人进一步提出了“非交互零知识证明”的概念,用一个短随机串代替交互过程并实现了零知识证明。非交互零知识证明的一个重要应用场合是需要执行大量密码协议的大型网络。
在零知识证明中,一个人(或器件)可以在不泄漏任何秘密的情况下,证明他知道这个秘密..如果能够将零知识证明用于验证,将可以有效解决许多问题..
三、什么是零知识证明
“零知识证明”-zero-knowledge proof,是由Goldwasser等人在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。大量事实证明,零知识证明在密码学中非常有用。如果能够将零知识证明用于验证,将可以有效解决许多问题。
在Goldwasser等人提出的零知识证明中,证明者和验证者之间必须进行交互,这样的零知识证明被称为“交互零知识证明”。80年代末,Blum等人进一步提出了“非交互零知识证明”的概念,用一个短随机串代替交互过程并实现了零知识证明。非交互零知识证明的一个重要应用场合是需要执行大量密码协议的大型网络。
在零知识证明中,一个人(或器件)可以在不泄漏任何秘密的情况下,证明他知道这个秘密..如果能够将零知识证明用于验证,将可以有效解决许多问题..
证明材料
附相关零知识证明材料:
零知识证明不是证明在条款的数学感觉因为有一个固定的可能性 p在任一零知识证明Peggy能提供对挑战的正确反应即使她不知道钥匙。但是如果测试被重覆 n计时欺诈被减少Peggy的可能性 p n,和由增加测试胜者的数字可能使Peggy的可能性降低欺诈到一个任意水平。
例子战略
Peggy的公开密钥是一张大图表,我们将称 G。Peggy被组建的 G某时从前,和广泛然后出版它。由于她特别地制造了它为目的, Peggy知道一个汉密尔顿的周期。Peggy将对胜者证明她的身份,她知道一个汉密尔顿的周期在 G。即使 G是公开信息,没人能做到,因为没人知道G的一个汉密尔顿周期,并且发现汉密尔顿的周期在图表是一个困难的问题(参见NP完整性)。
但是, Peggy不能简单地告诉胜者汉密尔顿的周期,因为这样胜者(或偷听者)就可以装作是Peggy。Peggy不能在任何周期显露任何信息,因为偷听者也许能在几个不同场合收集信息并整合,使偷听者有足够的信息能扮演Peggy。
要证明她的身份, Peggy和胜者扮演以下比赛的几个圆:
Peggy标记G端点以随机号。边缘可能然后代表作为一对这些数字。她列出G边缘,和编成密码各个边缘以一个另外密钥。她然后寄发被编成密码的边缘到胜者。
胜者翻转硬币。
*如果硬币过来头, Peggy向随机号投降密钥和测绘从端点。胜者解码边缘和然后核实,被编成密码的边缘被派在步骤1实际上做 graph.g和没有某一其它图表。
*如果硬币过来尾巴, Peggy投降密钥只为实际上形成汉密尔顿的周期的边缘。胜者解码这些边缘和核实,他们的确形成正确长度的周期。
冒名顶替者(' Pamela')能设法扮演Peggy,和有成功地唬弄胜者的50%机会在任何尤其圆。有二个可能的扮演战略。Pamela能派Peggy的graph.g的编成密码。在这种情况下,她逃脱侦查如果胜者投掷头;她显露编成密码,并且胜者核实图表的确是 G。但如果胜者投掷尾巴, Pamela被捉住。她被要求显露的一套的钥匙组成一个汉密尔顿的周期G边缘,并且她无法做那,因为她不认识一。
Pamela能跟随的另一战略是准备某一其它图表她知道一个汉密尔顿的周期的H编成密码。她在这种情况下是安全的如果胜者投掷尾巴;她显露周期,并且,因为胜者从未看边缘的剩余,他从未获悉图表是 H和不是 G。但如果胜者投掷头, Pamela被要求显露整个图表,并且胜者看见这不是 G。
由扮演这场游戏二十回合,胜者能使由Pamela被唬弄的可能性降低到一仅仅为1/2。由扮演更多圆,胜者能减少可能性就渴望。
信息由Peggy显露提供胜者任何信息在所有不G的汉密尔顿的周期。看这,注意胜者能制造比赛的抄本没有谈话与Peggy根本。他能选择序列头和尾巴,和然后准备假定回复从Peggy,没有曾经知道汉密尔顿的周期,由从事适当的冒名顶替者战略在每个圆。抄本,和它不遏制,有线索关于Peggy的身份合法的信息。Peggy证明她的身份不是因为她能基于正确的答复,但因为她能基于正确的答复没有知道将是什么问题。
所谓零知识证明,指的是示证者在证明自己身份时不泄露任何信息,验证者得不到示证者的任何私有信息,但又能有效证明对方身份的一种方法。看起来有点别扭,我给2个例子,也许好明白一些。
零知识证明的几个例子[原创]
证明举例
1)A要向B证明自己拥有某个房间的钥匙,假设该房间只能用钥匙打开锁,而其他任何方法都打不开。这时有2个方法:
①A把钥匙出示给B,B用这把钥匙打开该房间的锁,从而证明A拥有该房间的正确的钥匙。
②B确定该房间内有某一物体,A用自己拥有的钥匙打开该房间的门,然后把物体拿出来出示给B,从而证明自己确实拥有该房间的钥匙。
后面的②方法属于零知识证明。好处在于在整个证明的过程中,B始终不能看到钥匙的样子,从而避免了钥匙的泄露。
2)A拥有B的公钥,A没有见过B,而B见过A的照片,偶然一天2人见面了,B认出了A,但A不能确定面前的人是否是B,这时B要向A证明自己是B,也有2个方法。
①B把自己的私钥给A,A用这个私钥对某个数据加密,然后用B的公钥解密,如果正确,则证明对方确实是B。
②A给出一个随机值,B用自己的私钥对其加密,然后把加密后的数据交给A,A用B的公钥解密,如果能够得到原来的随机值,则证明对方是B。
后面的方法属于零知识证明。
3)有一个缺口环形的长廊,出口和入口距离非常近(在目距之内),但走廊中间某处有一道只能用钥匙打开的门,A要向B证明自己拥有该门的钥匙。采用零知识证明,则B看着A从入口进入走廊,然后又从出口走出走廊,这时B没有得到任何关于这个钥匙的信息,但是完全可以证明A拥有钥匙。
四、零知识证明是什么
“零知识证明”-zero-knowledge proof,是由Goldwasser等人在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。大量事实证明,零知识证明在密码学中非常有用。如果能够将零知识证明用于验证,将可以有效解决许多问题。.
本站所有软件信息均由用户上传发布,版权归原著所有。如有侵权/违规内容,敬请来信告知邮箱:764327034@qq.com,我们将及时撤销! 转载请注明出处:https://czxurui.com/jys/156688.html
发表回复
评论列表(0条)