零知识证明-初探

举报
NineDay 发表于 2023/03/12 13:21:19 2023/03/12
【摘要】 从零知识证明是什么、为什么需要零知识证明、零知识证明时如何工作的已经零知识证明的应用等几个方面对零知识证明进行了说明和介绍

什么是零知识证明?

一种证明方法,可以证明陈述的合法性,而不需要暴露陈述本身的内容。零知识证明协议是一种方法,该方法中prover可以证明给verifier一些事情是真实的,而prover无需提供任何被证明方的个人信息。

为什么需要零知识证明?


零知识证明代表加密应用的一个突破,提升个人信息的安全性。你如何向第三方证明你是某个国家的公民?通常是使用护照或者驾照。这种方式将个人隐私信息共享给了第三方,这是不安全的。人们希望使用一种可以保护隐私的方式来共享敏感信息。
零知识证明不需要展示个人信息来证明身份的有效性。使用statement(called a ‘witness’)作为输入,生成一个有效性的简洁证明。通过这个证明,就可以保证这个statement的真实性,而无需暴露生成这个证明时使用的statement的隐私信息。所以,能够证明你公民身份的证据应该是一个“零知识证明”。

零知识证明是如何工作的?

零知识证明协议依赖一个算法,这个算法输入参数是一些数据,输出参数是“true”或者“false”。

零知识证明协议满足一下规则:

  1. completeness(完整性):如果输入是合法的,零知识证明协议总是返回“true”
  2. soundness(健全性、稳固性):如果输入是非法的,零知识证明协议理论上将不可能被欺骗返回“true”。prover不可能欺骗一个honested verifier让其认为一个非法的statement是合法的。
  3. zero-knowledge:除了statement的有效性,verifier对statement一无所知。阻止verifier从导出原始的输入。

在基本形式中,零知识证明由三个元素组成:

  1. witness:prover通过零知识证明来证明knowledge的一些隐藏的信息。这个隐私信息就是证明的witness,prover对witness的假定知识,建立了一系列问题,这些问题只能被了解信息的一方回答。
  2. challenge:verifier随机的挑选问题,由prover进行回答
  3. response:prover接受提问,计算答案后返回给verifier。verifier通过检查prover的response来确定prover是否真的有权限反问witness。为了确保prover不是盲猜的答案,verifier还会问一些问题,就这样一直交互,知道verifier认为prover真的有权访问。

非交互式零知识证明

交互式的证明过程,在应用方面有很多局限性,因为需要两方保持可用并持续交互。即时verifier确信prover是诚实,也不能被独立的验证这个证明。为了解决这个问题,非交互式的零知识证明被提出来,非交互式协议中要求prover和verifier共同拥有一个shared key。不像交互式证明过程,非交互式证明只需要一轮通信。prover将私密信息(witness)传给一个特殊的算法来计算一个零知识证明,这个证明发送给verifier,verifier使用另一个算法检查prover是否知道私密信息(witness)。一旦生证明之后,只要拥有shared key以及验证算法的任何人,都可以使用该证明进行验证。非交互式零知识证明的提出推动了验证系统的使用进程。

ZK-SNARKs(Zero-Knowledge Succinct None-Interactive Argument of Knowledge)

有如下特点:
  1. zero-knowledge:verifier不需要知道statement的任何相关信息而可以对statement的完整性进行验证。
  2. succinct:零知识证明要比witness小,可以很快的进行验证
  3. None-interactive:证明过程是非交互式的,因为prover和verifier只进行一次通信
  4. Argument:证明满足soundness(稳固性、健全性)要求,欺骗是不太可能发生的
  5. (Of)knowledge:如果不访问私密信息(witness),prover很难(或者不可能)计算出一个有效的证明
前面提到的shared key是prover和verifier商议后的一个公共参数CRS(通常称为Common Reference String),用于生成和验证证明。这个公共参数的生成是敏感操作,它是这个协议安全性的主要部分。生成CRS的随机性要足够大,不然让不诚实的prover猜到,就可以计算出假的证明。可以采用Multi-Party computation(MPC)来降低生成CRS的风险。
Trusted setups需要用户相信参数生成的参与者,ZK-STARKs让证明协议能够在none-trusted setups下工作。

ZK-STARKs(Zero-Knowledge Scalable Transparent Argument of Knowledge)

与ZA-SNARKs类型,除了:
  1. Scalable:当witness的size比较大时,ZK-STARK在生成证明、验证证明时比ZK-SNARK快。随着witness的size的增长,ZK-STARK的证明和验证时间增长很小,但是ZK-SNARK的证明和验证时间线性增长。
  2. Transparent:ZK-STARKS使用公开的、可验证的随机性来生成公共参数,更透明。
ZK-STARK生成的证明更大,这就意味着会有更高的验证开销。然后,有例子(证明超大的数据集)证明ZK-STARK可能比ZK-SNARK更高效

零知识证明的应用案例

匿名支付

信用卡支付通常是对多方可见的包括支付方式提供方、银行以及其他相关机构。虽然金融监管有利于识别非法活动,但是也损害了公民的隐私。同时,大多数的加密货币交易,在链上也是可见的。有一种专门为匿名交易设计的隐私货币“privacy coins”。专注于隐私的区块链比如Zcash和Monero,隐藏交易细节,包括发送者/接收者,地址、资产类型、数量、交易时间等。
通过使用零知识证明技术,专注于隐私的区块链网络允许节点在不访问交易数据的情况下,验证交易。
零知识证明技术也被应用到公链上的匿名交易。比如:Tornado Cash,一种去中心化的非托管服务,允许用户在以太坊上进行私密交易。使用零知识证明技术来模糊交易细节,保证金融隐私。不幸的是这个会一个可选的隐私工具,并且与非法活动有关系。

Identity protection 身份保护

传统的身份管理系统,把个人信息置于风险中。零知识证明技术可以帮助个人身份验证,同时保护敏感细节信息。零知识证明在DID(去中心化身份)的背景下很有用,DID让个人可以控制个人信息的访问权限。能够证明你的公民身份,而又不用暴力您的个人隐私信息(护照等)就是零知识证明在DID中的应用。

Authentication身份验证

在使用线上服务是,我们需要证明身份和访问平台的权限。经常需要提供个人信息名字、邮箱地址、生日等等。还需要记住登陆密码。零知识证明可以简化这个验证过程。使用公开的输入(证明用户是平台会员的数据)和保密的输入(用户自己的信息)来生成零知识证明,当用户访问平台时,只需要提供零知识证明。这样即提升了用户体验,也可以让组织无需存储大量的用户信息。

Verifiable computation可验证计算

可验证计算是另一个零知识证明技术的应用,用于提升区块链的设计。把计算外包给第三方,同时保持可验证结果。第三方需要将计算结果以及程序正确执行的证明一同提交返回。可验证计算对提高区块链交易处理速度而又不降低安全性至关重要。主要用户区块链的链下扩展方案中。以太坊不在处理所有的交易,而是将交易交给一条单独的链来执行,这条链执行交易完毕后将结果返回给以太坊,应道以太坊的状态改变中。
这种链下扩展方案,使得以太坊无需进行任何交易执行计算,只需要将外包的计算结果应用到状态中。既减少了网络拥塞,又提高了交易速度。这就需要可验证计算来保证链下的执行时准确的。当节点进行完成链下交易的执行后,需要提交一个零知识证明,以验证交易执行的正确性。这个证明保证交易的合法性,允许以太坊将其应用到状态中而无需等待任何其他节点提出异议。
zero-knowledge rollups和validiums是两种链下扩展方案,通过验证证明来提供安全扩展。这些协议在链下执行数千笔交易,并提交证明以在以太坊上进行验证。一旦证明得到验证,这些结果就可以立即应用,从而允许以太坊处理更多交易,而无需增加基础层的计算

减少链上投票中的贿赂和勾结

区块链投票方案是安全的、可审计的、抗审查的、不受地域限制的,但是也没有办法避免贿赂勾结的问题。恶意的人可能通过欺骗、误导、贿赂的方式影响投票的公平。Alice可能会收到Bob的贿赂去投票给optionB,然而她其实想投票给optionA。
MACI (Minimum Anti-Collusion Infrastructure) 被提出来,用以解决区块链上的贿赂勾结问题。MACI是一系列合约,允许中心化的管理员手机投票,计算结果,同时不需要暴露个人的投票(采用零知识证明技术)。可以保证投票计算的正确性,还可以确定特定的个人是否参与了投票。

MACI是如何利用零知识证明技术工作的?

协调员部署智能合约到以太坊,用户注册自己的公钥到智能合约。用户通过发送用公钥加密的消息到智能合约来投票。必须使用用户最新的公钥进行投票(只统计最新的公钥对应的投票)。投票结束后,协调员计数投票,验证结果。
在 MACI 中,零知识证明用于通过使协调员不可能错误地处理选票和计票结果,来确保计算的正确性。这要求协调员生成ZK-SNARK证明,用以验证所有的消息都被正确处理,并且最终结果对应于所有有效投票的总和。
所以无需暴露每个投票员的投票细节,MACI就能够保证投票记录计算过程的完整性。此功能有助于降低勾结的有效性。还是举例子,在MACI机制下,Bob贿赂了Alice之后,Alice投票给了optionB。但是后来,Alice发送加密的交易,变更了自己的公钥,Alice在发送加密的交易用于投票给optionA。然而Alice展示给Bob的交易是投给optionB的。
使用 MACI 确实需要相信协调员不会与贿赂者勾结,或者试图自己贿赂选民。协调员可以解密用户消息(创建证明时所必需的),这样他们可以准确地验证每个人是如何投票的。但在协调员保持诚实的情况下,MACI 是保证链上投票公正性的强大工具。

使用零知识证明的缺点

硬件消耗:生成零知识证明涉及非常复杂的计算,最好是在专门的机器上执行。这些机器对于个人来讲,是比较昂贵的。
证明的验证消耗:验证证明也需要复杂的计算,也增加了在应用程序中实时零知识证明技术的成本。例如,在以太坊中,ZK-rollup需要支付大约500000gas以验证一个ZK-SNARK证明,而ZK-STARK可能需要更多的gas
信任假设:在ZK-SNARK中,Common Reference String(CRS)是一次生成,多次被多方重复使用的。这个公共参数是以trusted setup的形式创建的,这其中就需要假设参与者是诚实的。用户没有办法评估参与者的忠诚度,只能选择相信开发者。当然,ZK-STARK是无需信任假设的。
量子计算威胁:ZK-SNARK使用ECDSA进行加密,如果量子计算机出现,这个安全模型将被打破。ZK-STARK考虑了量子计算的威胁,使用了抗碰撞哈希加密,不像elliptic curve cryptography中使用公私钥对,collision-resistent hashing对于量子计算来说更难以突破。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。