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

文章目录

  • 【非交互式零知识证明】(下)
    • 1.交互式零知识证明(续)
      • 1.身份鉴别协议
        • 1)Feige-Fiat-Shamir身份鉴别协议
          • ☆简化版本
            • ①系统初始化
            • ②鉴别协议流程
            • 性质分析
          • ☆完整版本
            • 系统初始化(一次性)
            • 鉴别协议流程:
            • 性质分析
          • 总结
            • 1.安全假设
            • 2.参数选择
            • 3.安全平衡
        • 2)**Guillo-Quisquater**身份鉴别协议
          • ①系统初始化
          • ②鉴别协议流程
    • 2.非交互式零知识证明

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

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

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


(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身份鉴别协议
☆简化版本

过程图如下:

①系统初始化

首先信任中心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=1k Sjai (mod    n)y=r\cdot \prod_{i=1}^{k}{S_{j}}^{a_{i}}(mod\; n) y=ri=1kSjai(modn)

并将发送给V。

4)V验证等式
∏ i=1k Sjai (mod    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公钥密码体制。

过程如下图:

①系统初始化

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协议为例,交互式零知识证明的过程如下:

假设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 ” />

回顾一下交互式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:写的比较潦草,恳请各位小可爱批评指正!