【非交互式零知识证明】(下)

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

【非交互式零知识证明】(下)


继续上一节的内容,我们首先再回顾一下经典交互式零知识证明。

1.交互式零知识证明(续)

交互式零知识证明的一般模型如下:

非交互式shnorr为什么hash pk,密码学随笔,零知识证明,区块链
(1)证明者和验证者共享一个公共输入,证明者可能拥有某个秘密输入;
(2)如果验证者认可证明者的响应,则输出Accept,否则输出Reject。
经典交互式零知识证明除了应用在NP问题中,还可以应用在身份鉴别协议和Sigma协议簇中。

1.身份鉴别协议

在一个安全的身份认证协议中,要保证用户身份识别的安全性,身份鉴别协议至少要满足以下条件:
1)证明者P能够向验证者V证明他的确是P(P向V证明自己有P的私钥)。
2)在证明者P向验证者V证明他的身份后,验证者V没有获得任何有用的信息(V不能模仿P向第三方证明他是P )。
下面介绍三种经典的身份鉴别协议:

1)Feige-Fiat-Shamir身份鉴别协议
☆简化版本

过程图如下:

非交互式shnorr为什么hash pk,密码学随笔,零知识证明,区块链

①系统初始化

首先信任中心TA选择并公布一个RSA型模数n=p·q,并对素数p和q保密,然后对于参与者,每一个参与者P选择一个与n互素的秘密值s,其中1≤s≤n-1,并计算v=s2(mod n),并向TA注册v为其公钥。

②鉴别协议流程

1)证明者选择一个随机数r,1≤r≤n-1,计算并发送x=r2(mod n)给V。

2)验证者随机选择一个比特值α∈R{0,1},并将α发送给证明者。

3)证明者根据α做出不同的响应:

若α=0,令y=r;若α=1,令y=r·s(mod n)。

4)验证者验证等式y2=x·vα(mod n)。如果等式不成立或者y=0,验证者不接受证明。否则,进行下一轮证明。验证者执行上述证明过程t轮后,且均未拒绝,则验证者接受证明者的证明,即相信它的身份(很简单,可以在纸上自己推一下)。

性质分析

1.完备性:如果证明者知道秘密值s,他对于不同的α都可以做出正确的响应。显然,诚实验证者接收的概率为1.

2.可靠性:如果证明者不知道秘密值s,那么他只能够以1/2的概率欺骗验证者。执行t轮后,欺骗概率下降到2-t.

3.零知识性:协议交互过程中泄露的信息有:x=r2(mod n),y=r或y=r·s(mod n),即(x,y)。模拟器的模拟方式:随机选择y,并令x=y2(当α=0时)或x=y2/v(当α=1时)。模拟器产生的(x,y)和真实交互的(x,y)是计算不可区分的。

这里的计算不可区分性这个概念不是很好懂,我查阅了很多资料,我理解的计算不可区分和统计不可区分大致就是:如果挑战者的能力是无限的,无限能力的挑战者都不能挑战成功那么他就是统计不可区分;如果挑战者的能力是多项式的,多项式能力的挑战者不能挑战成功那么他就是计算不可区分的(一般情况下,我们认为超过多项式时间复杂度的算法计算机就没法处理了)。

☆完整版本
系统初始化(一次性)

首先信任中心TA选择并公布一个RSA型模数n=p·q,并对素数p和q保密,然后对于参与者,每一个参与者选择k个与n互素的秘密值s1,s2,…,sk,1≤si≤n-1,并计算vi=si2(mod n),并向TA注册(v1,v2,…vk)为其公钥。

鉴别协议流程:

1)证明者选择一个随机数𝑟,1 ≤r≤n-1,计算并发送x=r2(mod n) 给V。

2)验证者随机选择𝑘个比特值α向量=(α1,α2,…,αk)并将𝜶发送给P。

3)P计算
y = r ⋅ ∏ i = 1 k S j a i ( m o d    n ) y=r\cdot \prod_{i=1}^{k}{S_{j}}^{a_{i}}(mod\; n) y=ri=1kSjai(modn)

并将𝑦发送给V。

4)V验证等式
∏ i = 1 k S j a i ( m o d    n ) \prod_{i=1}^{k}{S_{j}}^{a_{i}}(mod \; n) i=1kSjai(modn)
如果等式不成立或者y=0,V不接受证明。否则,进行下一轮证明。

验证者V执行上述证明过程 𝑡轮 后,且均未拒绝,则验证者接受证明者P的证明,即相信他的身份。

(与简化版本推导的过程类似)

性质分析

1.完备性:显然,诚实验证者接收的概率为1.

2.可靠性:如果证明者不知道秘密值s,那么他只能以1/2k的概率欺骗验证者。执行t轮后,欺骗概率下降到2-kt

3.零知识性:同样地,与简化版本一致,交互数据元组(x,y)可以被模拟器模拟,达到了计算不可区分性。

总结
1.安全假设

无论是简化版本还是完整版本,协议的安全性依赖于未知分解的大合数的模平方根求解难题。这个问题等价于大合数分解困难问题。

2.参数选择

以完整版本为例,k·t(简化版本中k=1)需要足够大,才能够保证非诚实证明者欺骗成功的概率几乎可忽略。同时,n的分解困难性也是安全性考虑之一。

3.安全平衡

每增加一轮协议,计算量和通信量均上升,但安全性越高。因此,需要在保证足够安全的前提下,减少协议重复轮数t,提升效率。

2)Guillo-Quisquater身份鉴别协议

Guillo和Quisquater给出了一个身份鉴别方案,这个协议需要可信第三方参与、三轮交互、利用RSA公钥密码体制。

过程如下图:

非交互式shnorr为什么hash pk,密码学随笔,零知识证明,区块链

①系统初始化

1)信任中心TA选择并公布一个RSA型模数𝑛=𝑝⋅𝑞,并对素数𝑝和𝑞保密。令φ=(p-1)(q-1) ,选取𝑒使得gcd(𝑒, 𝜙 )=1,计算𝑑=1/e 𝑚𝑜𝑑 𝜙 ,公开(𝑒, 𝑛)。

2)用户P选取唯一性身份IP ,通过哈希函数变换得到哈希值JP=H(IP), TA给A分配密钥SP=IP-d (mod n)

②鉴别协议流程

1)P产生随机数𝑟,1≤𝑟≤𝑛-1,计算𝑥=r(e) 𝑚𝑜𝑑 𝑛 , 并将 IP , 𝑥 发送给V;

2)V选取随机数𝑢,1 ≤ 𝑢 ≤𝑒,将𝑢发送给P。

3)P计算y=SuPmod n,并将y发送给V。

4)V计算JP=H(IP),并验证JUA·yemod n不为0且等于𝑥。如果成立,则此轮接收证明;否则,输出拒绝。

**完备性:**显然,诚实验证者接收的概率为1。

**可靠性:**如果证明者不知道秘密值𝑆p ,那么他只能够以1/𝑒的概率欺骗验证者。执行𝑡轮后,欺骗概率下降到e-t

**零知识性:**可被模拟器模拟,达到计算不可区分性。 如果𝑒比较大时,每轮的错误概率就会很低,那么需要重复执行的轮数𝑡就可以很小,甚至为1。

2.非交互式零知识证明

​ 采用Hash函数的方法来把一个交互式的证明系统变成非交互式的方法被称为Fiat-Shamir变换,它由密码学老前辈Amos Fiat和Adi Shamir两人在1986年提出。

​ Fiat-Shamir变换,又叫Fiat-Shamir Heurisitc(启发式),或者Fiat-Shamir Paradigm(范式)。是Fiat和Shamir在1986年提出的一个变换,其特点是可以将交互式零知识证明转换为非交互式零知识证明。这样就通过减少通信步骤而提高了通信的效率。
​ 菲亚特-沙米尔(Fiat-Shamir)启发式算法允许将交互步骤替换为非交互随机数预言机(Random oracle)。随机数预言机,即随机数函数,是一种针对任意输入得到的输出之间是项目独立切均匀分布的函数。理想的随机数预言机并不存在,在实现中,经常采用密码学哈希函数作为随机数预言机。

​ 以Schonor协议为例,交互式零知识证明的过程如下:

非交互式shnorr为什么hash pk,密码学随笔,零知识证明,区块链

假设Alice 拥有一个秘密数字a,我们把这个数字当做私钥: sk,然后把它映射到椭圆曲线群上的一个点 aG*,(简写为 aG),这个点我们把它当做公钥: PK。(Schnorr 协议充分利用了有限域和循环群之间单向映射,实现了简洁的零知识证明安全协议)Alice 要向 Bob 证明她拥有 PK 对应的私钥 sk,那么如何证明呢。

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

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

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

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

​ 由于椭圆曲线上的离散对数问题,知道RG的情况下通过R=rG解出r是不可能的,所以保证了r的私密性。由这个问题也可以推广到一般问题,假如证明者对于验证者第一次提出的问题,回答正确的话,验证者就有p的概率相信证明者自己的命题,第二次p+p²,…,第n次达到1-pn的时候,当n越来越大,这个概率的值就越接近1。

​ 所以零知识证明是也一种基于概率的验证方式,验证者基于一定的随机性向证明者提出问题,如果证明者都能给出正确回答,则说明证明者大概率拥有他所声称的“知识”。零知识证明也并不是数学意义上的证明,因为它存在小概率的误差,欺骗的证明者有可能通过虚假的陈诉骗过验证者。换句话说,零知识证明是概率证明而不是确定性证明(但是也存在技术能将误差降低到可以忽略的值)。

​ 上面的整个过程是在证明者和验证者在私有安全通道中执行的。这是由于协议存在交互过程,只对参与交互的验证者有效,其他不参与交互的验证者,无法判断整个过程是否存在串通的舞弊行为,一旦两个验证者相互串通,交换自己得到的值,便可以推出私钥。因此,是无法公开验证的。所以在交互式Schnorr协议中存在的私钥泄露问题,使得算法无法在公开的环境下使用。可以将原始的交互式协议通过Fiat-Shamir变换变成非交互式零知识证明来解决这个问题:

非交互式shnorr为什么hash pk,密码学随笔,零知识证明,区块链

回顾一下交互式Schnorr 协议的第二步,Bob 需要给出一个随机的挑战数 c,这是为了防止Alice造假,这里我们可以让 Alice 用*c = Hash(PK, R)*这个式子来计算这个挑战数, 其中 R 是 Alice 发给 Bob 的椭圆曲线点,PK 是公钥。

这个式子达到了两个目的:

(1)Alice 在产生承诺 R 之前,没有办法预测 c,即使 c 最终是 Alice 生成的。

(2)c 是通过 Hash 函数计算的,会均匀分布在一个整数域内,可以作为一个随机数。

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

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

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

总体步骤如下:
·Alice:均匀随机选择r,并依次计算 R=rG c=Hash(R,PK) z=r+csk

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

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

·Bob(或者任意一个验证者):验证zG?==R+cPK

可以看到这个过程,与交互式证明的过程相比减少了重复的挑战和回应过程,证明者只需要发送一次数据供验证者验证。去掉交互过程,证明者直接公开验证所需的数据。

ps:写的比较潦草,恳请各位小可爱批评指正!
非交互式shnorr为什么hash pk,密码学随笔,零知识证明,区块链文章来源地址https://www.toymoban.com/news/detail-757985.html

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

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

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

相关文章

  • Pyspark交互式编程

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

    2023年04月08日
    浏览(36)
  • 交互式shell

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

    2024年02月02日
    浏览(35)
  • 构建一个动态交互式图表

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

    2024年02月20日
    浏览(40)
  • 为什么要使用零知识证明来开发跨链协议

    在过去的几年当中出现了各种各样的独立公链以及以太坊 Layer 2。 由于在安全性、低成本、快速交易以及开发者和用户社区差异等方面,不同链都具有各自不同的优势,用户在不同链之间切换使用的行为是很常见的。 比起以太坊链,Layer2 以及其他独立公链上的手续费会更加

    2024年01月19日
    浏览(50)
  • Matlab交互式的局部放大图

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

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

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

    2024年02月12日
    浏览(41)
  • 使用 htmx 构建交互式 Web 应用

    学习目标:了解htmx的基本概念、特点和用法,并能够运用htmx来创建交互式的Web应用程序。 学习内容: 1. 什么是htmx?    - htmx是一种用于构建交互式Web应用程序的JavaScript库。    - 它通过将HTML扩展为一种声明性的交互式语言,使得开发人员可以使用简单的HTML标记来实现动态

    2024年02月10日
    浏览(38)
  • Dash,方便创建「交互式」Web图表!

    你好,我是郭震 这篇文章,探讨 Dash —— 一个由 Plotly 开发的优秀 Python 框架,专为构建丰富的网络分析应用而设计。 推荐使用这个Python工具包! Dash 使得数据分析师能够使用 Python 创建互动式的 web 应用,而无需深入了解复杂的前端技术如 HTML 或 JavaScript。 要开始使用 Das

    2024年02月22日
    浏览(51)
  • 【shell】交互式自动化执行命令

    sftp 登陆并传输文件时需要手动输入密码 通过 expect 脚本模拟用户输入来与命令交互, 根据命令的输出提示, 来执行相应的操作, 来实现自动化 expect 给变量赋值用 set 变量名 \\\"变量值\\\" 获取今天 : set today [clock format [clock seconds] -format %Y-%m-%d] 获取昨天 : set yesterday [clock format [expr

    2024年02月09日
    浏览(33)
  • OpenCV构建交互式图像距离测量工具

    在计算机视觉和图形学应用中,准确测量图像上的点之间距离是一项常见且重要的任务。本篇技术博客将详细介绍如何利用Python编程语言和OpenCV库构建一个交互式的图像距离测量工具。我们将通过编写一个名为ImageProcessor的类,让用户能够在图像上点击选取点,并实时显示两

    2024年04月14日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包