精华内容
下载资源
问答
  • 像zk-SNARK这样的零知识证明有很多应用:Zcash利用零知识证明来保护隐私,Coda和Mir利用零知识证明将整个区块链压缩到只有几K字节,0x和Matter则利用零知识证明将许多交易封装为以太坊 上的单一证明。如果你还不了解...
  • 一种运用零知识证明达到匿名身份认证目的的学术论文。
  • 零知识证明

    2018-09-05 22:00:26
    通过对零知识证明的mpc阐述,说明零知识证明原理,和落地实现可能性。
  • 浅谈零知识证明

    2021-01-07 21:02:56
    浅谈零知识证明 概述 零知识证明(zero knowledge),顾名思义其实就是在充分证明自己是某种权益的合法拥有者的同时,又不能把有关的信息泄露出去,即提供给外界的有用信息为”零”。 零知识起源 “零知识”的概念最早...
  • 针对电子调查存在的不少安全问题,如信息欺骗、隐私安全等,构建了一个基于非交互零知识证明(NIZK,non-interactive zero knowledge proofs)的匿名电子调查系统,系统具有自组织、非交互、防重放、更安全等特点。...
  • 算术电路:零知识证明系统的算术电路
  • Feige、Uriel、Amos Fiat 和 Adi Shamir 中描述的 Feige-Fiat-Shamir 零知识证明的小概念证明。 “身份的零知识证明。” 运行:python main.py mode nkt 其中“mode”是“verifier”、“prover”或“cheater”之一...
  • OpenZKP - 零知识证明系统的纯 Rust 实现。 概述 项目现实施 :wolf: Stark 协议(详见) 并且有 :sun_with_face: 一个简单的界面(见下面的), :clamp: 简洁的证明, :racing_car: 体面的表现,和 :globe_...
  • 区块链是一种以密码学算法为基础的点对点分布式账本技术,然而,...总结了已有的隐私保护方案,重点聚焦于零知识证明技术,阐述并分析了零知识证明应用到区块链隐私保护方案中的技术挑战,并给出了具有指导意义的解决方案。
  • 零知识证明.zip

    2019-11-03 17:20:32
    零知识证明在区块链中非常有用。如果能够将零知识证明用于验证,将可以有效解决许多问题。
  • 零知识证明(Zero-Knowledge Proof或Zero-Knowledge Protocol)是一种基于概率的验证方法,它包括“类似事实的陈述”和“关于个人知识的陈述”。 验证者基于一定的随机性来询问证明者,如果证明者给出的答案正确,...
  • 零知识证明报告.pptx

    2019-10-15 14:22:54
    自学零知识证明算法zk-ANARK总结的PPT,借鉴了许多大佬总结的文章作为参考资料,学完头昏脑涨
  • Bulletproofs 是不需要可信设置的简短知识零知识论点。 参数系统是具有计算可靠性的证明系统。 Bulletproofs 适用于证明关于提交值的陈述,例如范围证明、可验证的 suffle、算术电路等。它们依赖于离散对数假设,并...
  • 区块链与零知识证明

    2021-01-20 13:18:50
    零知识证明零知识证明(Zero Knowledge Proof),是这样的一个过程,证明者在不向验证者提供任何额外信息的前提下,使验证者相信某个论断(Statement)是正确的。 证明过程包括交互式(Interactive) 和 非交互式...
  • 这个Github回购展示了如何设置Fluree分类帐以使用零知识证明。 在此示例中,将Fluree部署为管理可信数据的后端数据管理平台。 用例是以下内容的简单示例: 建立一个允许捕鱼的动态区 船只输入捕获位置而不透露捕获...
  • 零知识证明技术研究

    2020-02-10 14:28:22
    零知识早在70年代提出,到现在已经有40年的时间,在研究零知识证明方面,虽然已经取得了很大的成就,但仍有许多问题需要进一步努力探索,近年来已成为密码学研究的核心课题。零知识证明的基本理论是当代大部分密码学...

    1 引言

    零知识早在70年代提出,到现在已经有40年的时间,在研究零知识证明方面,虽然已经取得了很大的成就,但仍有许多问题需要进一步努力探索,近年来已成为密码学研究的核心课题。零知识证明的基本理论是当代大部分密码学协议的基础,对当代密码学产生了深远的影响,在比较广泛的信息安全协议的设计中起着很大的作用。零知识证明,通俗的说,就是证明者可以在不给验证者透露任何自己的资料的前提下,也能让验证者相信某个信息是正确的。它在实质上是一种协议,在这个协议中,一方面关系到验证者,另一方面关系到证明者。其中的一方,我们称为证明者,通常用A表示,另一方我们称为验证者,通常用B来表示。在协议执行过程中,证明者向验证者B声称已收获了一些信息,通过一系列互动验证A和B,验证或证明,或拒绝一个声称,在这一过程中,验证者B没有得到主人的具体内容信息中说,这是一个新的想法。

    2 零知识证明的特征

    二十世纪是信息的时代,信息已成为关系到社会发展的一种重要的储备资源,世界的信息化已成为当今社会发展的核心,在信息社会中起着非常重要的作用,大到国家安全,小到人民日常生活,密码学的出现保证了数据信息的安全性,丰富事实证明零知识证明在密码学中的应用,是不可忽视的。在由Gold wasser等人提出的零知识证明后,证明者和验证者之间的联系必须是“互动的”。“非交的互零知识”的概念是八十年代后期Blum等人提出了。其概念使用一个随机串,用来代替交互的过程,实现了零知识证明系统。基本上,它的应用领域是大型网络,需要执行大量密码协议。零知识证明系统中,一个人可以在不泄漏任何信息的前提下,确定他拥有这个秘密[1]。“零知识证明”是由Goldwasser等人在二十世纪八十年代早期提出的。证明者能在不向验证者提供任何自己信息的前提下,使验证者相信某个结论是正确的,这就是零知识证明的本质。零知识证明本质上是一种涉及两个或两个以上当事人的协议,即一个由两个或两个以上的当事人完成的一系列步骤。向验证者证明他或她相信他知道或有消息,但过程不泄露任何有关证明的资料给验证者。传统的零知识证明分为,交互的零知识证明系统,和非交互式零知识证明系统。但是它们的本质都是一种协议,就是指多个参与者,使用的一系列特定步骤,目的是为了实现指定的任务。它们大体包括以下三个特征:

    (1)该协议是一个有序的过程从开始到结束,每个步骤必须按顺序执行,并不能执行下列步骤之前的前一步完成。

    (2)该过程需要多个参与者,可以执行一个任务,虽然通过执行一系列的步骤,但是它门不构成某项协定。

    (3)必须通过进行该协议能实现一些指令的执行。

    在一个零知识证明系统中,一定包含两个部分,一个部分是证明,另一个部分是验证。证明者显示的验证是正确的,或者说,证明有知识,但没有透露任何有用的信息来验证。

    3 零知识证明系统

    3.1零知识证明系统的动机

    我们指出,最重要的一点是零知识证明是验证者不能获得“知识”。我们没有给出知识的定义,而是给出一个非常公平的例子:没有知识。这种方法是足够的加密问题。零知识的定义要求我们必须先考虑A与B之间的一个对话。第一,如果对话是单方面的,同时,这个对话,A只能说,B只能听。因此,我们可以推断,A在这个对话中并没有获取到任何关于B的信息,因为B很容易确定这个任务的结论;如果B反问A这个图是不是哈密尔顿图,因此不管A如何回答,我们能确定B从A回话中获取了知识。假设,B的判断能力增加了,那么我们就说B从对话中得到了信息,相反,假设B在对话后,对这个图的判断能力并没有改变,我们定论B没有从这个对话中得到任何信息。假设系统中的所有用户都在公共可访问存储介质上保存各自的密钥加密文件系统备份。同时,假定在某个时刻,用户A希望将一个文件的记录发送给另一个用户[2]。最简单的方法就是简单地记录一个发送到B的一个明确的方式,以这种方式B是没有办法知道是否一个信息是真的记录。通过他的钥匙给B,一个可以证明他送到B的记录是正确的,这种方式会让所有的信息泄露给B。因此,不仅要让B相信给了他正确的记录,也是保障了信息安全,零知识证明系统是追求“动机不漏的冗余信息”。

    3.2 零知识证明的一般过程

    证明方以及验证方同时包含某个函数,这个函数是相同的,或一系列的数值。零知识证明的一般过程如下:

    (1)证明者必须向验证者发送随机值,这个随机值必须满足一定条件,因此,这个随机值也称为“承诺”。

    (2)验证者向证明者发送必须满足指定条件的随机值,因此,这个随机值也被称为“挑战”。

    (3)证明者在执行这个秘密的计算,并将这个信息传达给验证者,这个信息也被称为“响应”。

    (4)验证者并对响应进行判断,一旦验证不成功,就表明证明者不具备他所知道的“知识”,返回这个过程。相反,继续从第一步开始,连续进行这个过程多次。

    如果每次验证成功,就可以方便地相信当事人有一定的知识。在这个过程中,验证者自始至终,都没有得到任何关于知识的信息。

    3.3 零知识证明的优点

    根据一系列的零知识证明协议,其具备的优点主要有以下几点:

    (1)使用零知识证明,安全性不会退化,因为它具有零知识属性。

    (2)具备高效性,整个过程中计算量比较小,双方交换的信息同样少。

    (3)目前,大部分零知识证明相关技术,通常避免直接应用于有政府限制的加密系统,同时这也给相关产品的出口带来了很大的机遇。

    4零知识证明协议

    4.1 基本的零知识证明协议

    零知识的数学分析,需要使用分割技术来实现,假设证明了信息的一部分,而这个信息是一个非常困难的问题,解决基本零知识协议包括以下步骤 :

    (1)一个新的解决方案是证明者利用位承诺方案来提交。

    (2)验证者不能由新难题得到关于旧难题的所有信息,并且证明者向验证者透漏这个新的难题。

    (3)验证者问者要向他证明,新老问题是同构的,即上一步的解决必须解决的新问题。

    (4)证明者同意。

    (5)验证者和证明者重复执行上面几步。

    这种证明的操作背景极其复杂,应慎重选择问题和随机变化,使问题在多次迭代后无法得到原始问题的任何信息。

    4.2并行的零知识证明协议

    基层的零知识系统证明包含A和B之间的多次交换信息,可以把它们合并完成:

    (1)A利用其信息和多个随机数将问题转化为多个不同的同构问题,然后利用其信息和随机数求解多个问题。 A提交这多个新难题的解法。

    (2)A向B透露这n个新难题。B无法在这些新问题中得到任何关于原问题或其解法的所有信息。

    (3)对每一个问题,B要求A向他证明新旧问题是同构的,并且他在第2步中使用的解法,并判定这就是新难题的方案。

    (4)A对多个新问题中的任何一个都表示通过。

    因此,这个协议似乎在实践中是安全的,因为没有人知道如何证明它。在某些环境中,某些协议的某些问题可以并行运行,同时,必须保持其零知识属性 [3]

    4.3 非交互式的零知识证明协议

    二十世纪八十年代,那时候人们已经发明了非交互类型的零知识的证明系统。非交互式零知识证明协议不需要任何相互作用,并证明可以发布协议,证明该协议是有效的任何人谁需要时间来验证它。此基本协议类似于并行零知识证明,但只使用单向散列函数代替B :

    (1)A只是利用他的信息和多个随机数,并把这个问题转化成多个不同的同构问题,然后根据他的信息以及随机数处理多个新难题。

    (2)A呈交多个新问题的解决方案。

    (3)A作为一个特定的单向散列函数的输入,把所有这些提交的解决方法,保存到这个单向散列函数。

    (4)A提出在第3步中生成的多个位,针对某个新难题依次取出多个位中的第i个位,假设它是0,我们就能断定新旧问题是同构的,假设它是1,则断定他在第2步中提交的解决方案,并证明它就是这个新问题的解决方法。

    (5)A必须将第2步中的任何协议及第4步中的解决方案都公开。

    (6)B以及其他人,都可以判断从第1步到第5步,是否都能被顺利进行。

    该协议工作的原因是单向散列函数作为一个公正随机位发生器。如果一个是欺骗,他必须能够预测单向散列函数的输出。但是,它是不可能强制散列函数或猜测它会有什么位置 [4]。这种单向散列函数实际上是B在协议中的替代品--在第四步中随机选取了两个证明之一。

    5  零知识的身份证明应用案例

    假设,我们把合法的个人信息当成是证明者的知识,证明者必须通过零知识证明向验证者确定自己的身份信息,这个过程就是就是零知识身份认证。所谓的零知识身份认证就是零知识证明在身份认证领域的一些应用。当前的完善的零知识身份认证大体有四种。由于篇幅有限,下面仅对Fiat—Shamir这个案例做进一步解释说明,并对其具有的完备性,合理性和零知识性一系列特性进行合理的证明[5]

    Fiat—Shamir身份的认证协议进程协议主要是:A在多次迭代进程中向B提交他的身份。

     (1)一次建立阶段,该阶段必须完成以下两个任务,并且在多次迭代进程之前一次完成。 

    ①信任中心T选择和发布随机模拟模块的N,N = PXQ。p,Q为两个大素数,可信中心的P和Q机密性(RSA)。

    ②申请人A选择一个和12互素的秘密值S,1小于等于S小于等于n一1。计算=MOD,最后向可信中心T申请v做他的公钥。

    (2)协定信息。t轮中的任何一轮会产生以下三条通讯:

    ①AB:x=mod。

    ②BA:e∈{0,1}。

    ③AB:y=r? rood. 

    (3)协议执行。 以下进程在迭代了t轮之后,轮与轮之间是断断续续进行的并且必须相互独立的。假设这t轮都成功了,则B就确定了A的身份。

    ①A确定一个随机数r,1小于r小于n一1。计算x=r mod n,发送给 B。

    ②B随机的确定一个挑战比特位W,W∈{0,1},发送给A。

    ③假设A收到W=O,则运行y=r。假设收l J W=l,则计算Y等于mod n。然后向B发送响应Y。

    ④B验证y2=?v.mod n.如果检验成立,则B可以接受A的申请,否则就会拒绝。

    身份认证系统协议的完备性,合理性和零知识性证明。

    (1)完备性证明:

    ①当W=O时,y=r,.lJy2等于r2.又等于r mod,所以?v x=r mod。 故Y等于v rood n。此时B验证提示成功。

    ②当W=1时,Y=rsmodny2=r S mod n。?y e=X o P=r s。所以y2=? V mod n。此时B也能确定验证是成功的。所以,一旦A和B都是真实的,并按照协议计算无误,则B对A的身份认证将是成功的,因此Fiat—Shamir身份认证系统必须满足完备性。

    1. 合理性证明:

    ①如果第三方要欺骗B。首先第三方可以悄悄的通过Fiat—Shamir认证协议的第一步骤。然后,在第三步中,~U W=0或W=l的概率都是一半,是由于W是随机产生的。

    ②当W=0时,y=r。此时第三方一旦把他第一步中产生的随机数r,转发给B即可经过验证,此次过程冒充胜利。

    ③但当W=l时,Y=r s mod。此时,第三方为了计算Y的正确发送给B,首先要正确计算S的值。但s2等于v mod n。为了由v求出s的信息,困难性和分解大整数n的困难性是相同的。所以,第三方得到正确的s值的概率基本为0。因此,当W=l时,第三方假装A会不会成功。由1)和2)可以得出,进程执行一次,第三方冒充A正确的概率是一半。则执行t次,第三方假冒A成功的概率为1/2的t次方。所以说,在t很大时,第三方冒充A正确的概率近乎是0。所以说,Fiat—Shamir身份认证协议必须要满足其自身合理性[6]

    (3)零知识证明:S是一个秘密值,只有一个知道,所以S是A的身份知识。在这个协议的执行,B没有得到任何关于S本身的信息。即使B知道V,y和x的值,但是找不到正确的s值。 原因是N的平方根本身是个难题。因此,菲亚特夏米尔认证协议满足零知识。 认为佩吉有一定的知识(如一些不解决长期问题的解决方法),零知识证明是在不披露知识的内容的前提下,验证者维克多在佩吉 和维克多证明他们有知识。首先,让我们看一看佩吉和维克多之间的对话:佩吉:“我可以解密的密文C”维克多:“我不相信。请证明。”佩吉:“关键是K,你可以看到解密到M的消息。”维克多:“那么我现在也知道了密钥以及信息。”在这里,虽然佩吉证明了他有一定的知识(重点K和明文M),但要披露维克多的知识。一个更好的对话是:佩吉:“我可以解密加密的C消息。”维克托:“我不相信。请你开始证明。”佩吉:“让我们使用一零知识协议,我将证明我的知识在任何高概率(但不会透露任何有关情况的信息给你)。”维克托:“好的”。佩吉和维克托通过零知识证明协议,可以解释使用零知识洞穴的例子,有一个C和D之间的门,只有人们知道咒语打开。佩吉知道咒语,并试图证明给维克托,但他不想透露它 [7]。步骤如下:

    ①维克多站在A点。

    ②佩吉开始走并走进洞内,到达C点或者D点。

    ③当佩吉消失在洞中的时候,Victor走到B点。

    ④维克多可以指定左转或者右转,要求佩吉从该通道出来。

    ⑤佩吉从维克多要求的通道出来,如果有必要就用咒语打开密门。

    ⑥佩吉和维克多重复步骤1)至5)n次。 

    如果佩吉不知道这个魔咒,那么只出了一条路,如果你是按的要求在每轮Peggy Peggy的通道中达成一致的话,那么所有n时间的猜测概率是1 / 2N。经过两轮,佩吉只有一个65536分的机会来猜测。因此,维克托可以假设,如果所有16次佩吉的是正确的,那么她必须知道门点之间的C点和D点如何打开。让我们看一个零知识证明的例子。如果图是同构的,很难判断两个图是否同构于一个非常大的图,这是一个NP完全问题。对于图G1和G2,如果有一个一一对应的函数f,定义域是顶点集的G1,f的范围是G2的顶点集。当且仅当[ G1,G2 ]是G1的一侧,[ F(G1),F(G2)]是G2的一侧,表示G1和G2同构。如果,佩吉明白G1和G2之间是同构的,佩吉要使用零知识列协议向使维克多证明G1和G2是同构的[8]

    ①佩吉变换G1产生另一个图H,并且使得H和G1同构。由于佩吉知道G1和H同构,也等同于知道了H和G2是同构的。

    ②佩吉把H送给维克多。

    ③对于下面两个问题,维克多可以选择其中的一个,要求佩吉向其证明。然而,维克多不能要求两者都证明。

    ④佩吉按照维克多指定的要求证明。

    ⑤佩吉和维克多重复以上步骤多次。

    这里假设佩吉不知道G1和G2之间的同构性,佩吉只能创建一个图或同构到G1或同构到G2。每一轮佩吉都有一半的机会猜测维克托的选择。由于佩吉在每个回合的协议产生一个新的H,所以无论多少回合后,协议维克多没有收到任何关于佩吉的信息,他不能理解的同构G1和G2从佩吉的回答。在这里,我们引入了一个简化的方案为知名菲戈菲亚特-夏米尔零知识认证协议。信任仲裁指定了一个随机两个大素数的乘积n,实际上最少达到512或高达1024。仲裁员产生一个随机数V,使X2等于 V mod n,即模N的V的平方,和v-1mod N.存在。佩吉的公钥是V,然后,运算出的最小整数:S 的那个呀SQRT(V-1)mod n作为佩吉的私人密。实施身份证的协议如下 :

    ①用户佩吉取随机数r,这里r<m,计算x= r2 mod m,把x送给维克多。

    ②维克多把一个随机位b送给佩吉。

    ③若b=0,则佩吉将r送给维克多;若b=1,则佩吉将y=r s 送给维克多

    ④若b=0,则维克多验证x=r2 mod m ,从而证实佩吉知道sqrt(x)

    如果b=1,那么维克多需要验证x=y2.v mod m,进一步证实佩吉是知道s的。这本身就是一项验证,直到维克多相信佩吉知道s,佩吉和维克多可以将此协议重复多次[9]

    6 总结

    零知识证明技术是近年来各个应用领域信息安全加密的重点研究对象。但由于应用领域环境的特殊性,传统的加密技术并不能直接应用于当前的复杂环境。本论文主要讨论了零知识证明的一般过程和技术特点,总结了零知识证明系统的特征和优点。但是加密技术是一项新型且复杂的技术,涉及的应用范围比较广泛,我们国外的一些零知识证明研究不是太深。想要更深入的了解研究零知识证明,还需要全体从事研究人员做进一步的研究。

    展开全文
  • 零知识证明是构建信任的重要技术,也是区块链这个有机体中不可缺少的一环。 抛砖引玉的小故事 大家一定对数独游戏不陌生。数独游戏就是有一个9×9的盘面。我们要根据盘面上的已知数字,推理出所有剩余空格的...

    前言

    区块链的发展可谓是日新月异,分布式账本,哈希函数,merkle tree,公钥算法,p2p网络,共识机制,智能合约等等很高大上的名词相信大家一定都不会很陌生。区块链像一个有机体,融合了各种不同的理论技术。零知识证明是构建信任的重要技术,也是区块链这个有机体中不可缺少的一环。

    抛砖引玉的小故事

    大家一定对数独游戏不陌生。数独游戏就是有一个9×9的盘面。我们要根据盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(33)内的数字均含1-9,不能重复。假设现在有一个非常难的数独,我废了千辛万苦的力气终于得到了这个数独的解。但是现在我告诉你,我会用零知识证明的方法给你证明我会这题的解,也就是说我不会把解透露给你,却能让你信服我确实有这题的解,仔细想想这是不是一件非常神奇的事情。

    首先我拿出81(9x9)张空白的卡片放在桌上,在每张纸上写上1-9中的一个数字。然后我把数独题目给出的已知数字朝上放置,把我自己已经得到的解朝下放置,像下面这样:

    图片

    然后我对你说,你挑一种检验方式吧,你可以按照每一行,每一列或者每一个小九宫格检验到底我的数字是不是重复的。

    图片

    那具体的验证方法是什么样子的呢?很简单。我准备了9个袋子,然后按照你指定的验证方法,把每一行,每一列或者每一个小九宫的卡片分别收集到9个袋子中去。

    图片

    这时候我们打开这些布袋,给你进行验证。如果我确实知道这个数独的解并且正确放置了每一张朝下的卡片的话,此时每个布袋里应该都有9张没有重复数字的,分别是数字1-9的卡片。

    图片

    这种做法真的能够让人信服吗?你可能会说如果我挑了去检验每一行是不是符合要求,那我就没办法检验每一列或者每一个九宫格是不是符合要求了,你完全可以给我一个只满足行,列或者九宫格要求的错误的数独答案。

    但是你不要忘记了,我事先是不会知道你是按照哪种方式去验证的,如果我真的没有数独的解的话,你至少可以以三分之一的概率抓到我在骗人。而且如果进行多次这样的重复验证,我能够瞒天过海的概率也会越来越小,假设验证次数为n,则我欺骗你的概率是3分之2的n次方,这样就可以说明我有很大的几率知道这个问题的解。

    从这个小故事可以看出零知识证明的本质就是在不揭晓我所知道或拥有的某样东西的前提下,向别人证明我有很大几率(这点很重要,零知识证明说到底是一个概率上的证明)确实知道或拥有这个东西。

    零知识证明的定义

    零知识证明(Zero-Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在1985提出的。证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务列步骤。迄今为止,零知识证明已经是密码学的重要构建,数据的隐私保护,计算压缩与区块链扩容,端到端的通讯加密,身份认证,去中心化存储,信用存贮…….都可以看到它的身影。

    其实上述的小故事就是一个简易的交互式零知识证明系统。交互式零知识证明需要验证方(你)在证明方(我)放好答案后,不断的发送随机试验。

    由此可见一套完善的零知识证明体系需要以下的条件:

    (1)完备性。如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。(如果我知道这个数独的解并且我和你都按照小故事里约定好的流程并且没有人作弊的话,你一定可以验证每个袋子分别装有9个不同的数字)

    (2)合理性。没有人能够假冒证明方,使这个证明成功。(不知道这个数独解的人一定没办法冒充我和你进行验证并且让你相信他能知道数独的解)

    (3)零知识性。证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。(这里可能需要涉及模拟器的相关概念,简单的说就是你没有办法从从知道数独的解的我这里得到任何关于数独的解的知识)

    零知识证明的发展

    在1985年以后的很长一段时间内,零知识证明协议由于没有较好的运行效率和通用性,大部分只停留在理论。这些理论的零知识证明协议各自有不同的特点。有的协议是专职协议,只能证明某些特定的事情,例如著名的Schnorr 协议、三色图协议,有些零知识证明协议是全能的,只要你能用代码定义的问题,它都能证明(只是理论可行,不意味着有运行效率)。有些协议是交互式的,需要证明者和验证者来回发很多轮消息,有些是非交互式的,证明者只需要根据协议向验证者发一次消息。有的协议证明大小与问题规模相关,问题越复杂,证明越长。而有些协议下,无论问题多复杂,证明大小都一样。而一个全能的,非交互的,常数大小的零知识证明协议,是密码学研究者们多年奋斗的目标,在这个目标下,zk-SNARK横空出世。zk-SNARK(zero-knowledge succint non-interactive arguments of knowledge)里面的每个单词都有特定的含义:

    Zero knowledge:零知识证明。

    succinct:简明的,证据信息较短,方便验证。

    Non-interactivity:非交互的,证明者只要提供一个字符串,可放在链上公开验证。

    Arguments:证明过程是计算完好(computationally soundness)的,证明者无法在合理的时间内造出伪证(破解)。

    of knowledge:对于一个证明者来说,在不知晓特定证明 (witness) 的前提下,构建一个有效的零知识证据是不可能的。

    自此以后,Libra、Sonic、SuperSonic、PLONK、SLONK、Halo、Marlin、Fractal、Spartan、Succinct 、Aurora ,OpenZKP、Hodor GenSTARK、RedShift、AirAssembly……各式各样的零知识证明协议接连问世。他们都有着各自的优缺点,其中的很多协议被运用在了区块链以及加密货币中。

    结语

    总之,零知识证明学习曲线陡峭,它涉及密码学,抽象代数,线性代数,数论等学科的综合应用,它引入的概念、符号很多会让人眼花缭乱。下一篇文章我们会先简单介绍一下Schnorr协议以及从完备性,合理性和零知识性去进行分析。希望各位保持耐心,由浅入深,循序渐进,揭开零知识证明的神秘面纱。

    参考

    • 公众号“星想法”:--https://mp.weixin.qq.com/s/eU8mp81VhpV-g1x89-uZYA

    • 公众号“安比实验室”:--https://github.com/sec-bit/learning-zkp/blob/master/zkp-intro/1/zkp-back.md

    • 小故事的来源:--https://medium.com/qed-it/the-incredible-machine-4d1270d7363a

    Tips

    更多长安链开源项目QA,可登陆开源社区、技术文档库查看。

    下载源码

    https://git.chainmaker.org.cn/chainmaker/chainmaker-go

    查阅文档

    https://docs.chainmaker.org.cn/

    更多社区权益申请

    https://wj.qq.com/s2/8620064/7abd

    图片

    图片

    “长安链ChainMaker”是国内首个自主可控区块链软硬件技术体系,由微芯研究院联合头部企业和高校共同研发,具有全自主、高性能、强隐私、广协作的突出特点。长安链面向大规模节点组网、高交易处理性能、强数据安全隐私等下一代区块链技术需求,融合区块链专用加速芯片硬件和可装配底层软件平台,为构建高性能、高可信、高安全的数字基础设施提供新的解决方案,为长安链生态联盟提供强有力的区块链技术支撑。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”。

    展开全文
  • zk:跨平台零知识证明
  • 导言:有些理论非常有趣,零知识证明便是其中之一,摸索了许久,想写点什么,与大家一起讨论。本文是『探索零知识证明』系列的第三篇。全文约 7,000 字,少量数学公式。 And what, Socrates, is the fo...

    本文已更新至Githubhttps://github.com/sec-bit/learning-zkp/blob/master/zkp-intro/3/zkp-pok.md

    导言:有些理论非常有趣,零知识证明便是其中之一,摸索了许久,想写点什么,与大家一起讨论。本文是『探索零知识证明』系列的第三篇。全文约 7,000 字,少量数学公式。

    And what, Socrates, is the food of the soul? Surely, I said, knowledge is the food of the soul.
    苏格拉底,什么是灵魂的食物?我说过,当然是知识。
    —— 柏拉图

    「零知识」vs. 「可靠性」

    我们在许多介绍零知识证明的文章中都能看到这样三个性质:

    • Completeness —— 完备性
    • Soundness —— 可靠性
    • Zero-Knowledge —— 零知识

    但是少有文章深入解释这个特性背后的深意和洞见。

    在『系列(二)理解「模拟」』一文中,我们介绍了「模拟器」这个概念。许多介绍文章避而不谈「模拟」,但「模拟」可以说是安全协议中核心的核心,因为它是定义「安全性」的重要武器。

    通常,我们定义安全会采用这样一种方式,首先列出一些安全事件,然后说明:如果一个系统安全,那么列出来的安全事件都不会发生。

    Rather than giving a list of the events that are not allowed to occur,it (the definition of zero-knowledge proof) gives a maximalist simulation condition.
    — Boaz Barak

    借用密码学家 Boaz Barak 的话,翻译一下,「零知识证明」并不是通过给出一个不允许发生的事件列表来定义,而是直接给出了一个最极致的「模拟条件」。

    所谓「模拟条件」是指,通过「模拟」方法来实现一个「理想世界」,使之与「现实世界」不可区分;而由于在理想世界中不存在知识,所以可以推导出结论:现实世界满足「零知识」。

    我们继续分析下一个交互系统(安全协议)的三个性质:「完备性」、「可靠性」与「零知识」。

    可靠性(Soundness):Alice 在没有知识的情况下不能通过 Bob 的验证。

    完备性(Completeness):Alice在有知识的情况下可以通过 Bob 的验证。

    零知识(Zero-knowledge):Alice 在交互的过程中不会泄露关于知识的任何信息。

    我们可以看出来「可靠性」和「完备性」有一种「对称性」。可靠性保证了恶意的 Alice 一定失败,而完备性保证了诚实的 Alice 一定成功。

    「完备性」比较容易证明,只要 Alice 诚实,Bob 也诚实,那么皆大欢喜。这好比,写好一段代码,喂了一个测试用例,跑完通过收工。

    我们来想想「可靠性」应该如何定义?这个可靠性的逆否命题是:(在现实世界中)如果 Alice 能通过 Bob 的验证,那么 Alice 一定有知识。或者说:Alice 知道那……个「秘密」!

    下面的问题是如何证明 Alice 知道一个「秘密」?

    这好像也很难,对不对?假如我们需要证明一台机器知道一个「秘密」,最简单的办法就是我们在机器的硬盘里,或者内存中找到这个「秘密」,但是这样暴露了秘密。如果这台机器是黑盒子呢?或者是 Alice 呢?我们没有读心术,猜不到她心里的那个秘密。

    如何定义「To Know」?

    「零知识」保证了 验证者 Bob 没有(计算)能力来把和「知识」有关的信息「抽取」出来。不能抽取的「知识」不代表不存在。「可靠性」保证了知识的「存在性」。

    只有「知识」在存在的前提下,保证「零知识」才有意义

    本文将探讨「可靠性」和「To Know」。

    为了进一步分析「知识」,接下来首先介绍一个非常简洁,用途广泛的零知识证明系统 —— Schnorr 协议。这个协议代表了一大类的安全协议,所谓的 Σ-协议,而且 Schnorr 协议扩展也是 零知识数据交换协议 zkPoD [1] 的核心技术之一。

    简洁的 Schnorr 协议

    Alice 拥有一个秘密数字,a,我们可以把这个数字想象成「私钥」,然后把它「映射」到椭圆曲线群上的一个点 a*G,简写为 aG。这个点我们把它当做「公钥」。

    • sk = a
    • PK = aG

    请注意「映射」这个词,我们这里先简要介绍「同态」这个概念。椭圆曲线群有限域之间存在着一种同态映射关系。有限域,我们用 Zq这个符号表示,其中素数 q是指有限域的大小,它是指从 0, 1, 2, …, q-1 这样一个整数集合。而在一条椭圆曲线上,我们通过一个基点,G,可以产生一个「循环群」,标记为 0G, G, 2G, …, (q-1)G,正好是数量为 q个 曲线点的集合。任意两个曲线点正好可以进行一种「特殊的二元运算」,G + G = 2G,2G + 3G = 5G,看起来这个二元运算好像和「加法」类似,满足交换律和结合律。于是我们就用 +这个符号来表示。之所以把这个群称为循环群,因为把群的最后一个元素 (q-1)G,再加上一个 G就回卷到群的第一个元素 0G。

    给任意一个有限域上的整数 r,我们就可以在循环群中找到一个对应的点 rG,或者用一个标量乘法来表示 r*G。但是反过来计算是很「困难」的,这是一个「密码学难题」—— 被称为离散对数难题[2]。

    也就是说,如果任意给一个椭圆曲线循环群上的点 R,那么到底是有限域中的哪一个整数对应 R,这个计算是很难的,如果有限域足够大,比如说 256bit 这么大,我们姑且可以认为这个反向计算是不可能做到的。

    Schnorr 协议充分利用了有限域和循环群之间单向映射,实现了最简单的零知识证明安全协议:Alice 向 Bob 证明她拥有 PK 对应的私钥 sk。

    在这里插入图片描述

    第一步:为了保证零知识,Alice 需要先产生一个随机数,r,这个随机数的用途是用来保护私钥无法被 Bob 抽取出来。这个随机数也需要映射到椭圆曲线群上,rG。

    第二步:Bob 要提供一个随机数进行挑战,我们把它称为 c。

    第三步:Alice 根据挑战数计算 z = r + a * c,同时把 z发给 Bob,Bob通过下面的式子进行检验:
    zG ?= R + cPK = rG + c*(aG)

    大家可以看到 Bob 在第三步「同态地」检验 z 的计算过程。如果这个式子成立,那么就能证明 Alice 确实有私钥 a。可是,这是为什么呢?

    z 的计算和验证过程很有趣,有几个关键技巧:

    1. 首先 Bob 必须给出一个「随机」挑战数,然后 Bob 在椭圆曲线上同态地检查 z 。如果我们把挑战数 c 看成是一个未知数,那么 r+ac=z 可以看成是一个一元一次方程,其中 r 与 a 是方程系数。请注意在 c 未知的前提下,如果 r + ax = r’ + a’*x 要成立,那么根据 Schwatz-Zippel 定理[3],极大概率上 r=r’,a=a’ 都成立。也就是说, Alice 在 c 未知的前提下,想找到另一对不同的 r’,a’ 来计算 z 骗过 Bob 是几乎不可能的。这个随机挑战数 c 实现了r 和 a 的限制。虽然 Bob 随机选了一个数,但是由于 Alice 事先不知道,所以 Alice 不得不使用私钥 a 来计算 z。这里的关键: c 必须是个随机数。

    2. Bob 验证是在椭圆曲线群上完成。Bob 不知道r,但是他知道 r 映射到曲线上的点R;Bob 也不知道 a,但是他知道 a 映射到曲线群上的点 PK,即 a*G。通过同态映射与Schwatz-Zippel 定理,Bob 可以校验 z 的计算过程是否正确,从而知道 Alice 确实是通过 r 和 a 计算得出的 z,但是又不暴露 r 与 a 的值。 还有,在协议第一步中产生的随机数 r 保证了 a 的保密性。

    3. 因为任何一个秘密当和一个符合「一致性分布」的随机数相加之后的和仍然符合「一致性分布」。

    零知识

    我们这里看一下 Schnorr 协议如何证明一个弱一些的「零知识」性质——「SHVZK」:

    注:这里我们证明的仅仅是 Special Honest Verifier Zero-Knowledge(SHVZK)。SHVZK 要求协议中的 Bob 的行为不能不按常理出牌,比如他必须按协议约定,在第二步时,去传送带上取一个新鲜的随机数,并且立即使用。而通常意义上的「零知识」是不会对 Bob 做任何要求,所以我们说这里是一个弱一些的性质。虽然目前 Schnorr 协议不能证明完全的「零知识」,但经过添加一些协议步骤,就可以达到完全零知识的目的,细节这里不展开,有兴趣的读者请参考文献[4]。以后我们在讨论 Fiat-Shamir 变换时,还会再次讨论这个问题。

    首先「模拟器」模拟一个「理想世界」,在理想世界中模拟出一个 Zlice 和 Bob 对话,Zlice 没有 Schnorr 协议中的知识,sk,而 Bob 是有公钥 PK的。请大家看下图,Bob 需要在 Schnorr 协议中的第二步出示一个随机数 c,这里有个额外的要求, 就是 Bob 只能「诚实地」从一个外部「随机数传送带」上拿一个随机数,每一个随机数都必须是事先抛k次「硬币」产生的一个 2^k 范围内的一次性分布随机数。Bob 不能采用任何别的方式产生随机数,这就是为何我们要求 Bob 是诚实的。

    下面演示 Zlice 如何骗过 Bob:

    在这里插入图片描述
    序幕:请注意 Zlice 没有关于sk的知识,这时 Bob 的随机数传送带上已经预先放置了一些随机数。

    在这里插入图片描述
    第一步:Zlice 产生一个一致性分布的随机数c,并且利用一个新的「超能力」,将刚刚产生的随机数 c 替换掉 Bob 的随机数传送带上第一个随机数。这时候,Bob 无法察觉。

    在这里插入图片描述
    第二步:Zlice 再次产生一个随机数 z,然后计算 R’=zG - cPK,并将 R’发送给 Bob。

    在这里插入图片描述
    第三步:这时候Bob 会从随机数传送带上取得 c,并且将 c 发送给 Zlice。请注意这个c 正好就是第一步中 Zlice 产生的 c。

    在这里插入图片描述
    第四步:Zlice 将第三步产生的随机数 z 发送给 Bob,Bob 按照 Schnorr 协议的验证公式进行验证,大家可以检查下,这个公式完美成立。

    在这里插入图片描述
    但区别是:

    • 在「理想世界中」,Zlice 没有 sk;而在「现实世界中」,Alice 有 sk
    • 在「理想世界中」,z 是一个随机数,没有涉及 sk;而在「现实世界中」,z 的计算过程里面包含 sk
    • 在「理想世界中」,Zlice 使用了超能力,替换了 Bob 的随机数;而在「现实世界中」,Alice 看不到 Bob
      的随机数传送带,也无法更改传送带上的数字

    这里请大家思考下:Schnorr 协议中,Bob 在第二步发挑战数能不能和第一步对调顺序?也就是说 Bob 能不能先发挑战数,然后 Alice 再发送 R = r*G。

    (两分钟后……)

    答案是不能。

    如果 Alice 能提前知道随机数,那么 (现实世界中的)Alice 就可以按照模拟器 Zlice 做法来欺骗 Bob。

    再遇模拟器

    其实,「可靠性」和「零知识」这两个性质在另一个维度上也是存在着一种对称性。可靠性保证了恶意的 Alice 一定失败,零知识保证了恶意的 Bob 一定不会成功。有趣地是,这种对称性将体现在模拟出来的「理想世界」中。

    我们分析下可靠性这个定义:Alice 没有知识 导致 Bob 验证失败。它的逆否命题为:Bob 验证成功 导致 Alice 一定有知识。
    我们再次求助模拟器,让他在可以发挥超能力的「理想世界」中,去检验 Alice 的知识。

    再次,请大家设想在平行宇宙中,有两个世界,一个是叫做「理想世界」,另一个叫做「现实世界」。理想世界有趣的地方在于它是被「模拟器」模拟出来的,同时模拟器可以在理想世界中放入带有超能力的 NPC。这次把 Alice 的两个分身同时放入「理想世界」与「现实世界」。

    假设「你」扮演 Bob 的角色,你想知道和你对话的 Alice 是否真的是「可靠的」。 于是把你放入「理想世界」,借助一个具有超能力的 NPC,你可以把对面的 Alice 的知识「抽取」出来。

    W…hat?我们不是刚刚证明过:协议是零知识的吗?零知识就意味着 Bob 抽取不出任何的「知识」碎片。这里敲黑板,「零知识」是对于「现实世界」而言的。我们现在正在讨论的是神奇的「理想世界」。

    重复一遍,在「理想世界」中,你可以借助一个有超能力的 NPC 来抽取 Alice 的知识,从而可以保证「现实世界」中的 Alice 无法作弊。可以想象一下,一个作弊的 Alice,她肯定没有知识,没有知识也就不可能在「理想世界」中让 NPC 抽取到任何东西。

    然而在「现实世界」中,你无法借助 NPC,当然也就看不到 Alice 的知识,也就不会和「零知识」性质冲突。因为两个世界发生的事件是「不可区分」的,我们可以得到这样的结论:在「现实世界」中,Alice 一定是存在知识的。

    整理一下思路:如何证明在一个交互会话中 Alice 不能作弊呢?我们需要为这个交互会话定义一个「模拟算法」,该算法可以模拟出一个「理想世界」,其中有一个特殊的角色叫做「抽取器」(Extractor),也就是我们前面说的 NPC,它能够通过「超能力」来「抽取」Alice 的知识,但是让对方「无所察觉」。

    注意,超能力是必不可少的!这一点在『系列(二)理解「模拟」』有解释,如果模拟器在没有超能力的情况下具备作弊能力,那相当于证明了协议「不可靠」(Unsoudness)。同样地,如果「抽取器」在没有超能力的情况下具备抽取信息能力,那相当于证明了协议不零知(Not-zero-knowledge)。

    最后一点,超能力是什么?这个要取决于具体的交互系统的证明,我们接下来就先拿我们刚刚讲过的Schnorr 协议切入。

    Proof of Knowledge :「知识证明」

    我们来证明一下 Schnorr 协议的「可靠性」,看看这个超能力 NPC 如何在「理想世界」中把 Alice 私钥抽取出来。而这个「超能力」,仍然是「时间倒流」。
    在这里插入图片描述
    第一步:Alice 选择一个随机数 r,并且计算 R=r*G,并将 R 发给「抽取器」
    在这里插入图片描述
    第二步:抽取器也选择一个随机的挑战数c,并且发给 Alice
    在这里插入图片描述
    第三步:Alice 计算并且回应 z,然后抽取器检查 z是否正确
    在这里插入图片描述
    第四步:抽取器发现 z 没有问题之后,发动超能力,将时间倒回第二步之前
    在这里插入图片描述
    第五步:抽取器再次发送一个不同的随机挑战数 c’给 Alice,这时候 Alice 回到第二步,会有一种似曾相识的感觉,但是无法感知到时间倒回这个事实
    在这里插入图片描述
    第六步:Alice 再次计算了 z’,然后发给抽取器检查
    在这里插入图片描述
    第七步:这时候抽取器有了z和z’,就可以直接推算出 Alice 所拥有的私钥 a,达成「知识抽取」

    到这里,「可靠性」就基本证明完了。大家是不是对可靠性和零知性的「对称性」有点感觉了?总

    结一下:「抽取器」在「理想世界」中,通过时间倒流的超能力,把 Alice 的「知识」完整地「抽取」出来,这就保证了一个没有知识的 Alice 是无法让抽取器达成目标,从而证明了「可靠性」。

    注:并不是所有的可靠性都必须要求存在抽取器算法。采用抽取器来证明可靠性的证明系统被称为「Proof of Knowledge」。

    解读 ECDSA 签名攻击

    在区块链系统中到处可见的ECDSA 签名方案也是一个朴素的零知识证明系统。椭圆曲线数字签名方案 ECDSA 与 Schnorr 协议非常接近,基于 Schnorr 协议的签名方案发表在 1991年的『密码学杂志』[5]上。1991年,正值美国国家标准局(NIST)选择数字签名算法,优雅的 Schnorr 签名方案居然被申请了专利,因此 NIST 提出了另一套签名方案 DSA(Digital Signature Algorithm),随后这个方案支持了椭圆曲线,于是被称为 ECDSA。中本聪在构思比特币时,选择了 ECDSA 作为签名算法,但是曲线并没有选择 NIST 标准推荐的椭圆曲线 —— secp256-r1,而是 secp256-k1。因为江湖传言,NIST 可能在椭圆曲线参数选择上做了手脚,导致某些机构可以用不为人知的办法求解离散对数难题,从而有能力在「现实世界」中具备超能力。有不少人在怀疑,也许当年中本聪在设计比特币时,也有这种考虑,故意选择了 secp256-k1 这样一条貌似安全性稍弱的曲线。

    我们拆解下 ECDSA 签名,用交互的方式定义一个类似 ECDSA 的认证方案,交互见下图。
    在这里插入图片描述
    第一步:Alice 仍然是选择一个随机数 k,并将 k 映射到椭圆曲线上,得到点 K ,然后发送给 Bob

    第二步:Bob 需要产生两个随机数,c 和 e,然后交给 Alice

    第三步:Alice 计算 s,并且发送给 Bob,他来验证 s 的计算过程是否正确注:对熟悉 ECDSA 签名方案的读者,这里略作解释,Bob 产生的 c 对应被签消息的 Hash 值 Hash(m),而 e 则是由一个转换函数 F(K)来产生。其中 F(.) 是取椭圆曲线上的点的 x 坐标经过 (mod q) 得到[6]。

    江湖上流传着一个说法:ECDSA 签名方案有个严重的安全隐患,如果在两次签名中使用了同一个随机数,那么签名者的私钥将会暴露出来。其实 Schnorr 签名方案也有同样的问题。

    当年 Sony PlayStation 3 的工程师在调用 ECDSA 库函数时,本来应该输入随机数的参数位置上,却传入了一个常数。熟悉密码学的黑客们发现了这个严重的后门。2011年1月,神奇小子 Geohot 公开发布了 Sony PS3 的主私钥,这意味着任何用户都可以轻松拿到游戏机的 root 权限。Sony 随后大为光火…… (后续故事大家可以上网搜)

    如果 Alice 在两次交互过程中使用了同一个 K,那么 Bob 可以通过发送两个不同的 c 和 c’ 来得到 s 和 s’,然后通过下面的公式算出私钥 a:
    k = (c - c’)/(s - s’)
    a = (k * s - c)/e

    那么我们应该怎么来看这个「安全后门」呢?大家想想看,这个安全后门和我们前面证明过的 Schnorr 协议的可靠性证明几乎一模一样!这个算法正是 ECDSA 认证协议的「可靠性」证明中的「抽取器」算法。只不过在可靠性证明中,为了让 Alice 使用同一个随机数 k 来认证两次,「抽取器」需要利用「时间倒流」的超能力。

    但是在 Sony PS3 系统中,随机数被不明所以的工程师写成了一个固定不变的值,这样相当于直接赋予了黑客「超能力」,而这是在「现实世界」中。或者说,黑客在不需要「时间倒流」的情况下就能实现「抽取器」

    。提醒下,不仅仅是随机数不能重复的问题。而是随机数必须是具有密码学安全强度的随机数。

    设想下,如果随机数 r 是通过一个利用「线性同余」原理的伪随机数生成器产生,虽然 r的值一直在变化,但是仍然不能阻止「知识抽取」。假设线性同余算法为 r2= dr1 + e (mod m),还回到 Schnorr 协议的第三步:
    1: z1 = r1 + c1
    a
    2: z2 = r2 + c2*a

    如果攻击者让 Alice 连续做两次签名,那么将 r2 代入 r1 之后,就出现了两个线性方程求解两个未知数 (r1, a) 的情况,z1, z2, c1, c2, d, e 对于 攻击者是已知的,这个方程组只用初中数学知识就可以求解。

    请注意,这并不是 Schnorr 协议(或 ECDSA 协议)的「设计缺陷」,恰恰相反,这是 Schnorr 协议设计比较精巧的地方,它从原理上保证了协议的可靠性。类似技巧在密码学协议中频繁出现,达到一目了然的「简洁」。但是也不得不说,如果不清楚协议的内在机制,尤其是区分不清楚「理想世界」与「现实世界」,使用者很容易引入各种花式的「安全漏洞」。

    作为一个能写出安全可靠软件的负责任的码农,我们需要了解哪些?彻底理解安全协议的设计机制当然是最好的,但是绝大多数情况下这是不现实的。一般来说,我们把各种密码学工具当做「黑盒」来用,但这可能是不够的,我们最好能了解下:

    1. 「安全定义」是什么?
    2. 「安全假设」到底是什么?
    3. 「理想世界」中的「超能力」到底是什么?

    脑洞:我们生活在模拟世界中吗

    第一次读懂「模拟器」时,我第一时间想到的是电影『黑客帝国』。我们生活所在「现实世界」也许是某一个模拟器模拟出来的「理想世界」,我们所看到、听到的以及感知到的一切都是被「模拟」出来的。在「现实世界」里,我们活在一个母体中。然而我们并不能意识到这一点。
    在这里插入图片描述
    早在春秋战国时期,庄子也在思考类似的问题:

    者庄周梦为胡蝶,栩栩然胡蝶也,自喻适志与,不知周也。俄然觉,则蘧蘧然周也。不知周之梦为胡蝶与,胡蝶之梦为周与?周与胡蝶,则必有分矣。此之谓物化。——《庄子·齐物论》

    通俗地解释下:庄子有一天睡着了,梦见自己变成了一只蝴蝶,翩翩起舞,醒来之后发现自己还是庄子,在梦中,蝴蝶并不知道自己是庄子。于是庄子沉思到底是他梦中变成了蝴蝶,还是蝴蝶梦中变成了庄子呢?如果梦境足够真实,……

    「缸中之脑」是美国哲学家 Gilbert Harman 提出的这样一个想法:一个人的大脑可以被放入一个容器里面,然后插上电线,通过模拟各种电信号输入,使得大脑以为自己活在真实世界中。
    在这里插入图片描述
    这个想法源自哲学家笛卡尔的《第一哲学沉思集》[7],在书中他论证我们应该怀疑一切,需要逐一检验所有人类的知识,数学,几何,以及感知到的世界。然而他发现除了「我思故我在」之外,所有的知识都可能不靠谱,因为我们的大脑很可能被一个具有「超能力」的 Evil Demon 所欺骗。

    2003 年牛津大学的哲学教授 Nick Bostrom 郑重其事地写了一篇论文『我们生活在计算机模拟世界中吗?』[8]。认为以下三个事实中,至少有一个成立:

    1. 人类文明彻底灭绝。
    2. 人类文明已经到达可以完全模拟现实世界的科技水平,但是处于某种原因,没有一个人愿意去创造出一个新的模拟世界,充当上帝的角色。
    3. 我们现在的人类文明就生活在一个模拟世界中。

    硅谷企业家 Elon Musk 在一次公开采访中,谈到「我们生活在基础现实世界」的概率只有「十亿分之一」。也就是说,他认为我们生活在一个电脑游戏(模拟世界)中,在模拟世界之外,有一个程序员,他开发并操纵了这个世界,我们每个人都是一个游戏角色( NPC)。

    在玩腻越狱 iPhone 和自动驾驶之后,神奇小子 Geohot 在今年三月份的「西南偏南」大会上做了一个题为「Jailbreaking the Simulation」的演讲[9]。他认为,我们被生活在一个模拟世界中,所谓的上帝就是外部世界里活蹦乱跳的码农们,他们编程创造了我们的「现实世界」,当然,他们可能启动了不止一个世界副本。然而,他们可能也生活在一个外层「模拟世界」中。
    在这里插入图片描述
    如果我们确实生活在模拟世界中,或许我们可以在地球的某个地方找到一个后门——「Simulation Trapdoor」,从而获得「模拟器」的超能力,抽取出不可思议的「秘密知识」。

    如果我们的世界的确是被程序模拟出来的,这个程序也许会有 Bug,如果有 Bug 存在,说不定我们可以利用这个 Bug 进行越狱,跳出「理想世界」,到达外面一层的世界中,与可爱的码农上帝聊一聊。

    这是在开玩笑吗?下面摘自自知乎的一个段子[10]:

    • 问题:「如果世界是虚拟的,有哪些实例可以证明?」。
    • 回答:
    1. 为什么宏观上丰富多彩,但是微观的基本粒子却都是一模一样的?这正和图片富多彩,但是像素是一模一样的一回事

    2. 为什么光速有上限?因为机器的运行速度有限

    3. 为什么会有普朗克常量?因为机器的数据精度有限

    4. 为什么微观粒子都是几率云?这是为了避免系统陷入循环而增加的随机扰动

    5. 为什么有泡利不相容原理?看来系统采用的数据组织是多维数组

    6. 为什么量子计算机运行速度那么快,一瞬间可以尝试所有可能?因为这个本质上是调用了宿主机的接口

    7. 为什么会有量子纠缠?这实际上是引用同一个对象的两个指针

    8. 为什么会有观察者效应?这显然是lazy updating

    9. 为什么时间有开端?系统有启动时间

    未完待续

    设计一个密码学协议就好像在走钢丝,如果你想同时做到「零知识」和「可靠性」就意味着既要让协议内容充分随机,又要保证「知识」能够参与协议的交互。如果协议没有正确设计,亦或没有正确工程实现,都将导致系统安全性坍塌。比如可能破坏了零知性,导致「知识」在不经意间泄露;或者也许破坏了可靠性,导致任何人都能伪造证明。而且这种安全性,远比传统的代码底层机制漏洞来得更加严重,并且更难被发现。严格数学论证,这似乎是必不可少的。

    我们的世界真的是某个「三体文明」模拟出来的吗?不能排除这个可能性,或许,我们需要认真地重新审视自己的各种执念。不过那又怎么样呢?至少自己的「思想」是真实的。

    If you would be a real seeker after truth, it is necessary that at least once in your life you doubt, as far as possible, all things.
    如果你是一个真正的真理探求者,在你人生中至少要有一次,尽可能地质疑所有的事情。
    —— 笛卡尔

    本文作者郭宇,文章首发于微信公众号安比实验室(secbitlabs)

    致谢:特别感谢 Shengchao Ding, Jie Zhang,Yu Chen 以及安比实验室小伙伴们(p0n1, even, aphasiayc, Vawheter, yghu, mr)的建议和指正。

    参考文献

    • [1] zkPoD: 区块链,零知识证明与形式化验证,实现无中介、零信任的公平交易. 安比实验室. 2019.
    • [2] Hoffstein, Jeffrey, Jill Pipher, Joseph H. Silverman, and Joseph
      H. Silverman. An introduction to mathematical cryptography. Vol. 1.
      New York: springer, 2008.
    • [3] Schwartz–Zippel Lemma. Wikipedia.
      https://en.wikipedia.org/wiki/Schwartz%E2%80%93Zippel_lemma
    • [4] Damgård, Ivan. “On Σ-protocols.” Lecture Notes, University of
      Aarhus, Department for Computer Science (2002).
    • [5] Schnorr, Claus-Peter. “Efficient signature generation by smart
      cards.” Journal of cryptology 4.3 (1991): 161-174.
    • [6] Brown, Daniel RL. “Generic groups, collision resistance, and
      ECDSA.” Designs, Codes and Cryptography 35.1 (2005): 119-152.
    • [7] 笛卡儿, 徐陶. 第一哲学沉思集. 九州出版社; 2008.
    • [8] Bostrom, Nick. “Are we living in a computer simulation?.” The
      Philosophical Quarterly 53.211 (2003): 243-255.
    • [9] Nick Statt. “Comma.ai founder George Hotz wants to free humanity
      from the AI simulation”. Mar 9, 2019.
      https://www.theverge.com/2019/3/9/18258030/george-hotz-ai-simulation-jailbreaking-reality-sxsw-2019
    • [10] doing@知乎. “如果世界是虚拟的,有哪些实例可以证明?”. 2017.
      https://www.zhihu.com/question/34642204/answer/156671701
    展开全文
  • 最近在学习零知识证明,因为内容很多并且难度也大,想根据自己的学习路线做一系列总结,这是第一篇文章,主要介绍零知识证明的一些重要概念和思想,可以对零知识证明有直观的理解,然后讲解一个经典简洁的零知识证明...

           最近在学习零知识证明,因为内容很多并且难度也大,想根据自己的学习路线做一系列总结,这是第一篇文章,主要介绍零知识证明的一些重要概念和思想,可以对零知识证明有直观的理解,然后讲解一个经典简洁的零知识证明安全协议Schnorr协议。

           本篇文章主要包含四个方面,首先来总体介绍一下零知识证明,然后以地图三染色问题为例,体现零知识证明思想,然后分析交互式Schnorr协议和非交互式Schnorr协议。

    1.零知识证明概述

         ·简介

           零知识证明(Zero-Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。

        ·概念

          “P”表示 “证明者(Proofer)”:作为零知识证明的参与方,他在证明命题真实性的同时,不会泄漏任何相关信息。

          “V”表示 “验证者(Verifier)”:作为零知识证明的另一参与方,验证证明者提出的命题以及对应的证明是不是正确。

          “承诺阶段(Commit)”:证明者针对命题做出承诺,并等待验证者提出挑战并进行验证。

          “挑战阶段(Challenge)”:验证者选择随机数,对提出的承诺进行挑战。

          “回应挑战阶段(Response)”:证明者将收到的随机数并结合给出的承诺,返回挑战的回应。

          “验证阶段(Verify)”:验证者验证,挑战的回应是否正确,错误的话那就证明失败,如果成功就可进行下一次挑战,直到可以相信的概率达到验证者接受的条件,这样就证明成功。

        ·性质

           在零知识证明中,需要满足三个性质:

           正确性。没有人能够假冒P使这个证明成功。如果不满足这条性质,也就是P不知道“知识”,再怎么证明,V也很难相信P拥有正确的知识。

           完备性。如果P和V都是诚实的,并证明过程的每一步都进行正确的计算,那么这个证明一定是成功的。也就是说如果P知道“知识”,那么V会有极大的概率相信P。

           零知识性。证明执行完之后,V只获得了“P拥有这个知识”这条信息,而没有获得关于这个知识本身的任何信息。

        ·应用

           数据的隐私保护:在隐私场景中,根据零知识性,不泄漏交易的接收方,发送方,交易余额等细节的前提下,证明区块链上的资产转移是有效的。再比如买保险的时候,保险公司需要了解是否患有某种疾病,但是我不想让保险公司知道我的全部病历信息,那我可以证明给保险公司看,我没有相关疾病就足够了。

            计算压缩与区块链扩容:在当前的区块链架构中,同样的计算会被重复多次,比如签名的校验,交易合法性校验,智能合约的执行等等。这些计算过程都可以被零知识证明技术进行压缩。比如以太坊采用 zkSNARK,带来几十倍的性能提升。

            端到端的通讯加密:用户可以互相通信,但是消息记录不会完全暴露在服务器上,同时消息也可以按照服务器的要求,出示相应的零知识证明,比如消息的来源、与发送的目的地。

            身份认证:用户可以向网站证明,他拥有私钥,网站并不需要知道私钥的内容,可以通过验证这个零知识证明, 确认用户的身份。

            去中心化存储:服务器可以向用户证明他们的数据被妥善保存,并且不泄露数据的内容。

    2.举例:地图三染色问题

       ·地图三染色问题

             三染色问题:假设存在一个地图,不同城市之间修建一些道路,三染色问题即为是否存在一种染色方式,使得每个城市都用特定的三种颜色之一表示,并且任意有道路相连的两个城市都不是相同的颜色。

            下面设计一个交互协议: Alice是「证明者」,Bob是「验证者」

            Alice拥有一个对特定地图的三染色方案,希望在不泄漏任何信息的条件下向Bob证明自己拥有该方案。

        1. 承诺阶段

            首先,在承诺阶段,Alice 先要对染过色的图进行一些「变换」,把颜色进行置换,例如把所有的蓝色变成绿色,绿色变成橙色,橙色变成蓝色。这样 Alice 得到了一个新的染色答案,这时候她把新图的每一个顶点都用纸片盖上,然后出示给 Bob 看。

          2. 挑战阶段

           下面进入挑战阶段,bob要挑战Alice是否真的知道答案,但是他不能直接打开所有信封,只能随机选择任意一条边,要求Alice打开相邻两个节点的纸片进行验证两个顶点的颜色是否相同。

          3. 回应挑战阶段

             然后进入回应挑战阶段,假设 Bob 挑选的是最下面的一条边。Alice打开Bob指定的两个节点,作为对挑战的回应,让 Bob 检查,发现这两个顶点的颜色是不同的,那么 Bob 认为这次检验正确。但是Bob 只看到了图的局部,一次挑战不能让他信任,但是多次挑战可能让Bob获取到Alice全部的染色方案,极端情况就是Bob查看了所有边的相邻节点颜色,从而完全重构出染色方案。

          4. 重复过程

           所以要对上述三个阶段进行多次重复,每次在承诺阶段Alice都会将染色方案进行一次随机置换,使得Bob每次验证,只能得到指定的两个相邻节点染色是否相等的信息。随着重复的次数足够多,Bob有极大概率相信Alice拥有一个正确的染色方案。但是Bob 每次看到的局部染色情况,都是 Alice 变换过后的结果,无论 Bob 看多少次,都不能拼出一个完整的三染色答案出来。Bob 在这个过程中,虽然获得了很多「信息」,但是却没有获得真正的「知识」。

           通过这个例子,对零知识证明可以有直观的了解。接下来,介绍一个简洁,用途广泛的零知识证明系统 —— Schnorr 协议。

     3.交互式Schnorr协议

            Schnorr机制是一种基于离散对数难题的零知识证明机制。证明者声称知道一个密钥x的值,通过使用Schnorr加密技术,可以在不揭露x的情况下,向验证者证明对x的知情权。可用于证明你有一个私钥但是不披露私钥的内容。

           原始的Schnorr机制是一个交互式的机制。Schnorr中涉及到的技术有哈希函数的性质、椭圆曲线的离散对数难题。

        (椭圆曲线的离散对数难题是指,已知椭圆曲线E和点G,随机选择一个整数d,容易计算椭圆曲线上另一点Q=d*G,但是给定的Q和G来计算d就非常困难。)

           假设Alice 拥有一个秘密数字,a,我们可以把这个数字当成「私钥: sk」,然后把它「映射」到椭圆曲线群上的一个点 a*G,简写为 aG。这个点我们把它当做「公钥: PK」。

           Schnorr 协议充分利用了有限域和循环群之间单向映射,实现了简洁的零知识证明安全协议:Alice 向 Bob 证明她拥有 PK 对应的私钥 sk,那么如何证明呢。

            交互式Schnorr协议的流程分为三步:

            第一步:为了保证零知识,Alice 需要先产生一个随机数r,这个随机数是用来保护私钥无法被 Bob 抽取出来,会映射到椭圆曲线群上的点rG上,记为R发送给Bob。

            第二步:Bob 要提供一个随机数进行挑战,把它称为 c。

            第三步:Alice 根据挑战数计算 z = r + a * c,然后把 z 发给 Bob,Bob通过式子进行检验:z*G ?= R + c*PK

            由于z=r+c*sk,等式两边添加相同的生成元可得:z*G= rG + c*(aG)=c*PK+R。就可以验证Alice确实拥有私钥sk,但是验证者Bob并不能得到私钥sk的值,因此这个过程是零知识的,并且是交互式的。

            由于椭圆曲线上的离散对数问题,知道R和G的情况下通过R=r*G解出r是不可能的,所以保证了r的私密性。

            但是,整个过程是在证明者和验证者在私有安全通道中执行的。这是由于协议存在交互过程,只对参与交互的验证者有效,其他不参与交互的验证者,无法判断整个过程是否存在串通的舞弊行为,一旦两个验证者相互串通,交换自己得到的值,便可以推出私钥。因此,是无法公开验证的。

            进一步分析,为什么需要验证者回复一个随机数c呢?这是为了防止Alice造假。

            如果Bob不回复一个c,就变成一次性交互。由于椭圆曲线上的离散对数问题,知道PK和G的情况下通过PK = a * G接触a是不可能的,所以保证了a的私密性。

            但是这种方案是存在问题的,a和r都是Alice自己生成的,她知道Bob会用PK和R相加然后再与z * G进行比较。所以她完全可以在不知道a的情况下构造:R = r * G - PK 和 z = r。 这样Bob的验证过程就变成:z * G ?== PK + R ==> r * G ?== PK + r * G - PK。这是永远成立的,所以这种方案并不正确。

            所以在交互式Schnorr协议中存在的私钥泄露问题,使得算法无法在公开的环境下使用。

            可以将原始的交互式协议转变为非交互式协议来解决这个问题!

           下面来看,如何把一个三步的 Schnorr 协议变成一步。

     4.非交互式Schnorr协议

             回顾一下交互式Schnorr 协议的第二步,Bob 需要给出一个随机的挑战数 c,这里我们可以让 Alice 用下面这个式子来计算这个挑战数,从而达到去除协议第二步的目的。

             c = Hash(PK, R) 。

             其中 R 是 Alice 发给 Bob 的椭圆曲线点,PK 是公钥。

             这个式子达到了两个目的:
             第一个,Alice 在产生承诺 R 之前,没有办法预测 c,即使 c 最终是 Alice 生成的。

             第二个,c 通过 Hash 函数计算,会均匀分布在一个整数域内,可以作为一个随机数。

             Hash 函数是「单向」的,这样一来,虽然 c 是 Alice 计算的,但是 Alice 并没有能力实现通过挑选 c 来作弊。因为只要 Alice 一产生 R, c 就相当于固定下来了。

             这样,就把三步Schnorr协议合并为一步。Alice可直接发送(R,z),因为Bob拥有Alice的公钥PK,于是Bob可自行计算出c。然后验证z*G?=R+c*PK。

           如图,利用 Hash 函数,把三步 Schnorr 协议合并为了一步。Alice 可以直接发送:(R, c, z)。又因为 Bob 拥有 PK,于是 Bob 可以自行计算出 c,于是 Alice 可以只发送 (R, z) 即可。

           ·Alice:均匀随机选择r,并依次计算 R=r*G c=Hash(R,PK) z=r+c*sk

           ·Alice:生成证明(R,z)

           ·Bob(或者任意一个验证者):计算e=Hash(PK,R)

           ·Bob(或者任意一个验证者):验证z*G?==R+c*PK

     5.Schnorr用于数字签名

            Schnorr 协议可以用于数字签名。

            首先,为了保证攻击者不能随意伪造签名,使用离散对数难题Hash函数满足抗第二原象(防碰撞)作为安全假设。

            提出数字签名的出发点有两个:

            一是,接收方希望证实消息在传递过程中没有被篡改;

            二是,希望确认发送者的身份,可以理解为发送者有一个私钥,并且私钥和这条消息进行关联计算。

            首先要证明发送者的身份,这正是Schnorr协议的功能,能够向对方证明「我拥有私钥」这个陈述。并且这个证明过程是零知识的,不泄露关于「私钥」的任何知识。而c=Hash(m,R)可以保证发送者与信息相关联。

            上图就是Schnorr签名方案。在这里还有一个优化,Alice发给Bob的内容不是(R,z)而是(c,z),这是因为R可以通过c,z计算出来。

            分析下优化的原理,令n是有限域大小的位数。假设采用了非常接近2^256的有限域,也就是说z是256bit,那么椭圆曲线群的大小也差不多要接近256bit,这样一来,把2^256开平方根后就是2^128,所以说256bit椭圆曲线群的安全性只有128bit。那么,挑战数c也只需要128bit就足够了。这样Alice发送c要比发送R要更节省空间,而后者至少需要256bit。c只需要128bit。相比ECDSA签名方案来说,可以节省1/4的空间。

    展开全文
  • #资源达人分享计划#
  • NP 问题已有的知识的(黑箱) 零知识证明都是非常数轮的, 因此, 在标准的复杂性假设下, NP 问题是否存在常数轮的(黑箱) 知识的零知识证明是一个有意义的问题. 本文对该问题进行了研究, 在一定的假设下给出了HC 问题的...
  • 在分析其弱点的基础上,利用零知识证明的基本思想,提出了一种新的协议。该协议在减小系统消耗代价的同时,能够有效抵抗MITM(Man-In-The-Middle),暴力破解攻击等。方案适用于对数据的安全性要求较高的用户。
  • 可以实现FFS协议,进行完整的FFS协议认证过程,以及秘钥交互。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,638
精华内容 17,455
关键字:

零知识证明