密码学学习笔记(十六 ):Schnorr签名算法

交互式零知识证明

零知识证明(ZKP)就是不会将证据泄露给验证者的知识证明。Schnorr身份认证识别协议是一个交互式ZKP,它满足了完备性、可靠性、零知识性。所谓的交互式ZKP方案通常包含3个步骤(承诺、挑战和证明),在文献中通常被称为sigma协议。交互式协议增加了一些不可忽略的开销,因为它需要双方通过网络发送多条消息,并在双方不同时在线时会增加无法限制的延迟。因此,应用密码学领域几乎不使用交互式ZKP。

Fiat-Shamir转换可以将交互式ZKP转换为非交互式ZKP。数字签名是一种非交互式ZKP。将Fiat-Shamir转换应用于Schnorr身份识别协议,我们就可以得到Schnorr签名方案。总而言之,Schnorr签名本质上是两个值R和s,其中R是对某个秘密随机值的承诺(一般被称为nonce,因为它需要对每个签名都是唯一的),s是通过承诺R、私钥(见证x)和消息计算的值。

Schnorr识别协议

识别方案是证明人P和验证人V这两方之间的交互协议。如果协议成功,那么在协议结束时,验证者确信他正在与证明人交互,或者更准确地说,与知道与证明人公钥对应的密钥的人交互。

一个简单的例子是密码身份验证的标准协议。证明者的密钥是她的密码pw,公钥是H(pw),其中H是一个“单向”散列函数。该协议由证明方发送H(pw)组成,验证者检查这是否与存储的值匹配。虽然这对“直接”攻击是安全的,但对“窃听”攻击是不安全的,即对手可以观察到P和V之间的一些交互,然后尝试模仿P——一旦对手从一次交互中看到H(pw),他就可以在所有进一步的交互中模仿P。

在使用椭圆曲线的Schnorr识别协议中,证明者的秘密是一对(P,Q=[a]P)的离散对数a,其中P和Q是椭圆曲线E(Fq)上的点。(该系统适用于离散对数很难的任何有限阿贝尔群)为了防止窃听攻击,该协议有三轮:

公钥pk由一条椭圆曲线E(Fq)和两个r阶点P,Q∈E(Fq)组成。密钥sk是[1,r]中的一个整数,使得Q=[a]P

  • \rho选择一个随机k\overset{R}{\leftarrow}\left [ 1,r \right ] 并且将R=[k]P发送到V。
  • V随机选择一个“挑战”e\overset{R}{\leftarrow}\left [1,r \right ]并将e发送到\rho
  • \rho计算s=k+ae(mod r)并将s发送到V。

如果[s]\rho=R+[e]Q,则V接受。

初始随机值k的作用是“屏蔽”秘密a,以便在协议的后续执行中重复使用。

Schnorr签名

假设代数群G和素数阶r的元素g∈G对所有用户都是已知的。这些值(G,g,r)被称为系统参数。设h=g^{a}为用户的公钥。关于公钥h的消息m上的数字签名可以由知道私钥A的用户生成。在不知道私钥的情况下,很难计算给定公钥的签名。

非正式地说,公钥识别方案是验证方和验证方之间的协议,其中验证方有公钥pk和私钥sk,验证方有pk的副本。该协议有三个通信阶段:首先,证明者发送一个承诺s0;则验证者发送质询s1;则证明者发送响应s2。验证人接受或拒绝该证明。该协议旨在说服验证者,他们正在与知道与证明者公钥对应的私钥的用户进行通信。换言之,验证者应该确信他们正在与证明者沟通。

对于Schnorr格式[522,523],证明者具有公钥h=g^{a},其中g是素数阶r的代数群的元素,并且1≤a并将s0发送给验证者。验证人向证明者发送“挑战”1≤s1

然后验证人检查是否满足:

如果是这种情况,则接受该证明。换言之,如果验证人接受证明,则证明人已经成功地向验证人识别了自己。 

你可能感兴趣的:(密码学,密码学,学习,笔记)