likes
comments
collection
share

一文搞懂【零知识证明】技术

作者站长头像
站长
· 阅读数 13

大家好,我是王不错。(欢迎大家关注我的公众号:程序员王不错

今天为大家分享一个神奇的技术——零知识证明,它可以让我们向其他人证明某个陈述是真实的但不会泄露关于陈述本身的任何信息

目前存在很多科普零知识证明的文章,但是它们要么不全,要么深度不够,初学者或者想要全面了解零知识证明的人需要查找大量资料才能勉强入门。

本文将从基本概念关键技术发展历史以及应用场景等方面展开,对零知识证明进行相关梳理。

1. 基本概念

零知识证明(Zero Knowledge Proof) ,指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的

在这个过程中,存在两种角色:证明者(Prover)验证者(Verifier)

通过该方法,证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄露关于被证明消息本身的任何信息。这里的“知识”,可以是口令,公钥系统中的私钥,某个数学难题的一种解决方法,系列的证书等等。

一文搞懂【零知识证明】技术

关于零知识证明,有三条主要的性质

  • 完备性。如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。
  • 合理性。没有人能够假冒证明方,使这个证明成功。
  • 零知识性。证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。

下面,通过一个案例,较为通俗地理解零知识证明是怎么一回事。

一文搞懂【零知识证明】技术

上图所示为一个缺口环形的长廊,长廊中间有一道只能用咒语打开的门,而这个咒语只 有B知道

此时B要向A证明自己拥有打开该门的咒语,但不能透露关于该咒语的任何信息,则可以采用零知识证明。

过程如下:

B从长廊入口走入上图中C或D的位置,之后A走到B的位置。

A朝B发出指令,让B从C或D一侧走出来。

如果B能准确地按照A的指令走出,则可以证明B知道打开门的咒语

当然也存在这样的可能性。假如B不知道门的咒语走到了C处,而A发出的指令也让B从C一侧走出来,这样B就能骗到A

降低这个可能性的方法是,A不断发出指令,如果B都能正确地响应指令,则能够极大概率地证明B知道门的咒语。

当然这也说明零知识证明存在小概率的误差,欺骗者有可能通过虚假陈述骗过证明者。也就是说,零知识证明是概率证明而不是确定性证明

在这个案例中,B是证明者,A是验证者。

如果B不知道咒语,但仍能骗到A使其信服B知道门的咒语的概率是一文搞懂【零知识证明】技术。其中t为A重复验证的次数

通过上述案例,我们可以总结出关于零知识证明的 一般性过程

一文搞懂【零知识证明】技术

  1. 证明方根据要证明的论断内容给验证方发送一个随机内容,称其为承诺
  2. 验证方根据承诺随机生成一个试探内容,称其为挑战
  3. 证明方根据挑战执行一个秘密计算,将结果发送给验证方,这一过程称为响应
  4. 验证方验证响应,若验证成功,则重复执行上述过程,验证失败则直接认为证明方不具备该知识。

在这个过程中,验证方不可能向任何第三方假冒证明方,因为他没有得到关于这个秘密的任何一点信息。另一方面,证明方不可能欺骗验证方,因为这个过程重复了很多次,证明方欺骗成功的概率很小。

2. 关键技术

零知识证明技术包括两类:

  • 交互式的零知识证明
  • 非交互式的零知识证明

交互式零知识证明(Interactive zero-knowledge proofs)证明者和验证者需要进行多次互动,验证者会不断提出问题来挑战证明者,证明者则要不断回应这些挑战,直到验证者被说服。 上一小节提到的一般性过程即为交互式零知识证明的过程。 一文搞懂【零知识证明】技术交互式零知识证明理解简单,但存在较多局限性

  1. 每次验证都需要进行整个冗长的过程;
  2. 证明方与验证方都需要同时在场,不管是在线还是面对面;
  3. 只能够取信于一个验证者,如果要取信于多个验证者,则对每个验证者都需要进行一遍证明过程;
  4. 只在某个时刻有效

一文搞懂【零知识证明】技术

非交互式零知识证明(Non-interactive zero-knowledge proofs)证明者只需要在第一次向验证者发送一个证明,验证者可以随时对该证明信息进行验证,并且只需要验证一次就能够判定是否选择相信证明者。 非交互式零知识证明克服了交互式零知识证明的一些缺点,不需要冗长的在线交互可以取信于很多人(甚至所有人)证明始终有效

在交互式零知识证明中,挑战值可以由验证者随机产生,但在非交互零知识证明中,挑战值根据Fiat-Shamir转换自动产生,Fiat-Shamir转换采用了随机预言机。一个密码学安全的Hash 函数可以近似地模拟传说中的「随机预言机」。这也是非交互证明的原理

一文搞懂【零知识证明】技术

常用的非交互式零知识证明协议包括SNARKsSTARKsBulletproofs等,如下表所示:

一文搞懂【零知识证明】技术

目前Go开发者应用零知识证明大多引用gnark库gnark是采用Go语言开发的一个zk-SARNK的实现,目前支持Groth16(Groth16是zkSNARK的典型算法,目前在ZCash、Filecoin、Coda等项目中使用)。

github地址:github.com/ConsenSys/g…

3. 发展历史

关于零知识证明的概念,最早来自于1985年,由 Goldwasser、Micali 和 Rackoff 合作发布的一篇论文 《The Knowledge Complexity of Interactive Proof Systems》

2010年,Groth 在它的一篇名为《Short Pairing-based Non-interactive Zero-Knowledge Arguments》的论文中提出了目前零知识证明的关键性理论,即zk-SNARK,在这个理论中,证明提供者可以向验证者以数学的方式证明信息的准确性,从而避开了需要向验证者提供的除真实性和完整性以外的其他内容。

2016年提出的Groth16算法就对证明的大小进行了精简,是目前主流的ZK算法中的基础性算法之一。

2017年提出的Bulletproof算法,设计出了一种非交互式的零知识证明,这让证明者和验证者不必在同时在线,是一种很有用的算法协议。

2018年的zk-STARKs更是提出了一种不需要可信设置的算法,这让zk-STARK的发展有了一个新的突破口。目前,很多区块链项目的零知识证明都是通过zk-STARKs算法协议来实现。

4. 应用场景

零知识证明最多见于隐私计算领域。 在隐私场景中,我们可以借助零知识证明的“不提供任何有用信息”特性,保护消息的隐私。零知识证明可以验证计算而不会暴露有关输入和计算本身的任何信息,保证数据隐私和安全。 一文搞懂【零知识证明】技术此外,最新的科研中多将零知识证明应用于数据融合场景中,如下图所示: 一文搞懂【零知识证明】技术在该场景下,第三方云收集物联网设备采集的数据,终端设备需要向第三方云证明其提供的数据是真实的,但又不想泄露关于数据本身的隐私,对此,零知识证明恰好可以满足这一需求。

5. 结语

当前,零知识证明技术无论在理论研究还是工程实现层面都取得了较好的发展,集成零知识证明技术的项目也层出不穷。未来,在物联网、区块链等领域,零知识证明技术都将为其正面临的验证和隐私保护等相关问题提供良好的解决思路。2023年针对零知识证明技术的研究也将继续实现突破,作为技术人员,了解这些前沿技术也相当必要。

好啦,今天的分享就到这里。

我是程序员王不错,如果文章内容有帮助到你,就点个“在看”吧~