零知识证明学习(三)—— 非交互式零知识证明(zkSNARKs)

这篇具有很好参考价值的文章主要介绍了零知识证明学习(三)—— 非交互式零知识证明(zkSNARKs)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

非交互式零知识证明

本节主要介绍一种新的零知识证明- z k S N A R K zkSNARK zkSNARK z k S N A R K : z e r o − k n o w l e d g e S u c c i n c t N o n − I n t e r a c t i v e A r g u m e n t s o f K n o w l e d g e zkSNARK:zero-knowledge Succinct Non-Interactive Arguments of Knowledge zkSNARKzeroknowledgeSuccinctNonInteractiveArgumentsofKnowledge

背景

z k S N A R K zkSNARK zkSNARK是零知识证明中最经典的加密算法体系。目前已经被应用在很多地方,特别是在区块链领域,包括实际生活中隐私保护相关的应用。

Z e r o − K n o w l e d g e Zero-Knowledge ZeroKnowledge: 零知识证明体系里有两个角色,一个是证明者(Prover), 一个是验证者(Verifier)。举个例子,比特币创始人中本聪身份不明,之前传出过很多人声称自己是中本聪最后都不了了之。那么一个人如何证明自己是中本聪呢?因为大家知道中本聪钱包的地址。因此他只需要用这个钱包的私钥对这句话签名 “我是XXX,我其实就是中本聪"。然后其他人(Verifier) 都可以用中本聪钱包的公钥对这个签名进行验证。这个就是一个零知识证明。首先只有私钥持有方的签名才能通过验证,其次这个签名没有泄漏私钥的任何信息,钱包不会被其他人盗用。因此零知识证明解决了两个问题,一个是信任问题,一个是隐私问题。

S u c c i n c t Succinct Succinct:是指对于一个很复杂的问题,验证者可能需要进行很长时间的计算才能提供出相应的证明,但是我们希望证明的大小不要太大 (比如实际应用中只有几十 k b kb kb),同时验证者只需要很少的时间(比如微秒级别的时间) 就能够验证计算是否正确。

N o n − I n t e r a c t i v e Non-Interactive NonInteractive:是指在证明的过程中双方不需要互相交换信息。有一些算法体系需要证明者和验证者之间互相对话几次,交换信息。这对于实际应用就很不方便,增加了系统特别是网络通讯的复杂度。因此最好的情况是证明者一次性地把证明发送给验证者,验证者直接验证即可。

A r g u m e n t o f K n o w l e d g e Argument\quad of \quad Knowledge ArgumentofKnowledge:指的是证明者只有知道问题的答案才可能提供证明。这个比较绕口,另一个解释就是证明者造假成功的概率可以忽略不计。这里还有一个类似的概念 Proof of Knowledge。它们之间是有区别的。对于Argument来说,证明者的计算能力有限,也就是多项式的算力,而Proof of Knowledge则对证明者计算能力没有要求。比如一个验证者是从未来穿越回来,带着最先进的量子计算机,那么对于Proof of Knolwege的系统,他仍然没法造假。但是对于Argument of Knowledge的系统则有可能。简单的说就是:proof(证明)和argument(论证)在零知识证明里,是有区别的,在proof system中,即便是计算能力无限的prover也没法欺骗verifier去相信一个错误的陈述为真(统计可靠性),而在argument system中,只有多项式时间计算能力的没法欺骗(计算可靠性),假设能破解椭圆曲线离散对数问题,那么可能就不再安全。

多项式知识的证明(Proving Knowledge of a Polynomial)

我们从一个证明多项式知识的问题开始,然后使用一般方法。我们还会发现多项式的其他性质。

到目前为止,问题集中在一个薄弱的证明概念上,各方必须相互信任。例如,证明者不需要知道多项式,他可以使用任何其他可用的方法来得出正确的结果。而且,如果验证者多项式求值的范围并不大,她可能有概率会猜到一个数,这个概率是无法忽视的。接下来我们来处理这个缺陷,但首先要清楚的分析多项式的性质。一个多项式表达形式如下(n阶多项式):
c n x n + . . . + c 1 x 1 + c 0 x 0 c_nx^n+...+c_1x^1+c_0x^0 cnxn+...+c1x1+c0x0
如果证明者或者验证者知道是1阶多项式( c 1 x 1 + c 0 c_1x^1+c_0 c1x1+c0),那意味着他们知道该多项式系统为 c 1 , c 0 c_1,c_0 c1,c0,而且系数可能为任意值。代数基本定理指出,任何多项式都可以分解成线性多项式(即,1阶多项式代表一条直线),只要它是可解的。因此,我们可以将任何有效多项式表示为线性多项式的乘积:
( x − a 0 ) ( x − a 1 ) . . . ( x − a n ) = 0 (x-a_0)(x-a_1)...(x-a_n)=0 (xa0)(xa1)...(xan)=0
从上式看出一个多项式可以由多个1阶多项式组成。例如多项式 x 3 − 3 x 2 + 2 x x^3-3x^2+2x x33x2+2x分解为 ( x − 0 ) ( x − 1 ) ( x − 2 ) (x-0)(x-1)(x-2) (x0)(x1)(x2)。从分解的多项式可以明显的看出解为 0 , 1 , 2 0,1,2 0,1,2,你可以很容易地在多项式的任意一种形式上检查这个解,但是分解形式在表面上有所有以上的解(也称为根)。

假设证明者声明,他知道一个3次多项式的根是1和2,这意味着他的多项式具有这种形式: ( x − 1 ) ( x − 2 ) . . . (x-1)(x-2)... (x1)(x2)...,换句话说, ( x − 1 ) (x-1) (x1) ( x − 2 ) (x-2) (x2)可以看作多项式 x 3 − 3 x 2 + 2 x x^3-3x^2+2x x33x2+2x的余子式。因此,如果证明者想要证明他声明的多项式有这些根,但又不想揭露多项式本身,他需要证明他的多项式 p ( x ) p(x) p(x)是这些余子式 t ( x ) = ( x − 1 ) ( x − 2 ) t(x)=(x-1)(x-2) t(x)=(x1)(x2)的乘积,所以存在任意多项式 h ( x ) h(x) h(x)有以下形式:
p ( x ) = t ( x ) h ( x ) p(x) = t(x)h(x) p(x)=t(x)h(x)
因此,多项式多项式 p ( x ) p(x) p(x)是由多项式 t ( x ) t(x) t(x)和多项式 h ( x ) h(x) h(x)乘积等到,多项式 p ( x ) p(x) p(x)包含多项式 t ( x ) t(x) t(x)

如何得到多项式 h ( x ) h(x) h(x),这里我们很自然想到 h ( x ) = p ( x ) t ( x ) h(x)=\frac{p(x)}{t(x)} h(x)=t(x)p(x),如果证明者不能找到多项式 h ( x ) h(x) h(x),这意味着多项式 p ( x ) p(x) p(x)并没有多项式 t ( x ) t(x) t(x)余子式,这也以为多项式除法有余数。这里举个小例子: p ( x ) = x 3 − 3 x 2 + 2 x p(x)=x^3-3x^2+2x p(x)=x33x2+2x t ( x ) = ( x − 1 ) ( x − 2 ) = x 2 − 3 x + 2 t(x)=(x-1)(x-2)=x^2-3x+2 t(x)=(x1)(x2)=x23x+2,这里很容易得到 h ( x ) = x h(x)=x h(x)=x

证明者和验证者具体验证协议如下:

  • 验证者随机选取一个值 r r r,计算 t = t ( r ) t=t(r) t=t(r),并把 r r r发送给证明者
  • 证明者计算 h ( x ) = p ( x ) t ( x ) h(x)=\frac{p(x)}{t(x)} h(x)=t(x)p(x),将 p ( r ) p(r) p(r) h ( r ) h(r) h(r)值发送给验证者
  • 验证者检查 p = t × h p=t\times h p=t×h,如果多项式相等,意味着多项式 p ( x ) p(x) p(x) t ( x ) t(x) t(x)余子式

这里还需要介绍一种情况,如果证明者使用不同的 p ′ ( x ) p\prime (x) p(x),它没有必要的代数余子式,,例如: p ′ ( x ) = 2 x 3 − 3 x 2 + 2 x p\prime (x)=2x^3-3x^2+2x p(x)=2x33x2+2x,这里我们可以得到 p ′ ( x ) = t ( x ) × ( 2 x + 3 ) + 7 x − 6 p\prime (x)=t(x)\times (2x+3) +7x-6 p(x)=t(x)×(2x+3)+7x6。因此证明者整除将会有余数,所以我们将式子 p ′ ( x ) = t ( x ) × ( 2 x + 3 ) + 7 x − 6 p\prime (x)=t(x)\times (2x+3) +7x-6 p(x)=t(x)×(2x+3)+7x6整除 t ( x ) t(x) t(x)得到 h ( x ) = 2 x + 3 + 7 x − 6 t ( x ) h(x)=2x+3+\frac{7x-6}{t(x)} h(x)=2x+3+t(x)7x6。因为x是由验证者随机选择的,有一个低概率概率余数 7 x − 6 7x-6 7x6 t ( x ) t(x) t(x)整除,如果验证者检查 p ( x ) , h ( x ) p(x),h(x) p(x),h(x)必须是整数,这样的证明将被拒绝。但是,该检查要求多项式系数也是整数,这对协议造成了很大的限制。因此,这就是引入密码原语的原因,这使得这种除法不可能实现,即使原始的计算结果碰巧是可除的。

问题(issues)

  • 证明者可能不知道声明的多项式 p ( x ) p(x) p(x),他可以计算 t = t ( r ) t=t(r) t=t(r),并选择一个随机数 h h h,计算 p = t × h p=t \times h p=t×h,验证者接收到值是正确的。
  • 证明者知道随机点 x = r x=r x=r,他能构造任意多项式在 r r r处有一个共享点与 t ( r ) × h ( r ) t(r) \times h(r) t(r)×h(r)
  • 在初始情况下,证明者声称知道一个特定次数的多项式,在当前的协议中没有阶数的强调。因此,证明者可以利用一个满足余子式检查的高次多项式进行欺骗。

这里说明一下,零知识证明的研究方向,本文主要一环扣一环的讲解,希望有兴趣的朋友能耐心读下去。文章来源地址https://www.toymoban.com/news/detail-806665.html

到了这里,关于零知识证明学习(三)—— 非交互式零知识证明(zkSNARKs)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Azure - 机器学习:使用 Apache Spark 进行交互式数据整理

    关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。 数据整理已经成为机器学习项目中最重要的步骤之一。

    2024年02月08日
    浏览(45)
  • 用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

    很好,但还不能取代专家导师,有时还会犯错! ChatGPT 教小狗编程( Midjourney 创作) GPT-4刚刚发布,相较于GPT-3.5,它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下,能够更好地保持连贯性。 多年来,我一直致力于建立前端教学网站,为JavaScript开发人员

    2024年02月02日
    浏览(47)
  • Interactive Linear Algebra:免费的交互式线性代数学习教程

    本文介绍一个学习线性代数的网站,该网站通过将线性代数中的数学规则可视化,更直观的展示线性代数的运算过程。该网站可以帮助我们更快更高效的学习线性代数。如果有考研的同学或者觉得学习线性代数很枯燥或者很困难的同学,可以了解该网站,促进高效学习和理解

    2024年02月13日
    浏览(146)
  • 交互式shell与非交互式shell,反弹shell

    交互shell就是shell等待你的输入,并且立即执行你提交的命令。 这种模式被称作交互式是因为shell与用户进行交互。 这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当签退后,shell也终止了。 需要进行信息交互,例如输入某个信息 会返回信息 你需要对其输

    2024年02月02日
    浏览(53)
  • 交互式shell

    交互式模式就是shell等待用户的输入,并且执行用户提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当用户签退后,shell也终止了。 shell也可以运行在另外一种模式:非交互式模式。在这种模

    2024年02月02日
    浏览(47)
  • Pyspark交互式编程

    Pyspark交互式编程 有该数据集Data01.txt 该数据集包含了某大学计算机系的成绩,数据格式如下所示: 根据给定的数据集,在pyspark中通过编程来完成以下内容: 该系总共有多少学生; (提前启动好pyspark) 该系共开设了多少门课程; Tom同学的总成绩平均分是多少; 求每名同学的

    2023年04月08日
    浏览(45)
  • 构建一个动态交互式图表

    在Web开发中,JavaScript不仅是实现交互效果的关键,还可以用于构建复杂的可视化组件,如动态交互式图表。在本篇博客中,我将演示如何使用JavaScript和HTML5的Canvas元素来创建一个简单的动态条形图。 HTML结构  首先,我们需要一个HTML结构来容纳我们的图表。 JavaScript实现 接下

    2024年02月20日
    浏览(51)
  • ZoKrates+Remix在线实现zkSNARK零知识证明

    引言:在之前的文章里,我介绍了利用circom和snarkjs实现zkSNARK零知识证明,包含了snarkjs的使用步骤,并且我的毕业论文也全部采用snarkjs实现zkSNARK算法。 不过snarkjs里的signal信号的概念和高级语言变量之间的差别有点大,很多运算操作都不能直接进行,而且在执行circom库里的

    2024年02月06日
    浏览(29)
  • Matlab交互式的局部放大图

    在数据可视化中,很多时候需要对某一区间的数据进行局部放大,以获得对比度更高的可视化效果。下面利用 MATLAB 语言实现一个交互式的局部放大图绘制。 源码自行下载: 链接:https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd=9dyl 提取码:9dyl 使用方法 : 1.将 BaseZoom.m 和 parameters

    2024年01月16日
    浏览(49)
  • Android2:构建交互式应用

    一。创建项目 项目名 Beer Adviser 二。更新布局 activity_main.xml 三。增加资源 strings.xml 四。响应点击 MainActivity.kt 知识点:

    2024年02月12日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包