原文教材 与 参考资料:
Boneh Dan , Shoup Victor . A Graduate Course in Applied Cryptography[J].
该书项目地址(可以免费获取):http://toc.cryptobook.us/
博客为对该书的学习笔记,并非原创知识,仅帮助理解,整理思路。
19.1 Schnorr's identification protocol
首先给出一个Schnorr 身份认证协议,如果DL问题是困难的,那么该协议是可以被证明安全抵抗窃听敌手攻击。
该协议的正确性是显然的,下面讨论C的取值,C被称作挑战空间challenge space,为了证明安全,我们要求|C|是超多项式的,即为不论V如何试探,都不能从P中学到任何一点关于密码alpha的知识。虽然我们最后会证明Schnorr协议是安全的抵抗窃听敌手,我们依然重一个简单的理论开始,证明该协议可以抵抗direct attacks. 为了证明如此,我们将讨论任何有效的敌手能够成功的直接冒用身份发起攻击以一个不可忽略的概率能够转换一个算法有效的会付出秘密alpha从验证公钥vk中。由于这个原因Schnorr协议以被称为离散对数的“知识证明”。
下面给出安全定理:
在DL问题假设下,假设挑战空间|C|是超多项式的,Schnorr ID协议是安全的抵抗直接攻击,(注意这里如果使用像18章给出的简单的用Hash做单向函数,极容易被字典攻击,而DL是一个循环群,字典攻击就比较困难,所有的信息是循环的。)特别的,假设敌手A是一个有效的伪造攻击Schnorr协议通过一个第18章的直接攻击游戏,定义优势为=ID1adv[A,Isch]. 那么存在一个有效敌手DL敌手B(运行时间为A的两倍)则得到优势19.1,19.2。
证明思路:
假设敌手A在攻击Schnorr协议的优势为,就像在攻击游戏18.1中。在这个游戏中,挑战者生成一个验证密钥u。 在敌手在进行仿冒攻击时,生成第一个ut, 由敌手自己自由的生成。现在,为了成功攻击,敌手A必须能够回复任何的挑战C,满足验证等式。(这里敌手如果能够生成满足验证等式的参数,那么就相当于可以向V证明自己的有效性。)这里我们只需要使用敌手成功运行两次那么就可以有效的解决离散对数问题。
如果我们能够使得敌手A对挑战c生成一个合法的回复,那么此时重绕敌手设置其内部状态使得其对c`再生成一个合法的回复,那么我们得到如下的两个会话,并使用这两个结果解出DL困难问题。
这个安全定理与本书之前提到的安全理论并不相同。在这个理论中,我们展示了任何敌手A攻破该方案能够被转换成一个攻破离散对数问题的敌手B,但是敌手B并不是对敌手A的封装。敌手B需要直接的调用敌手A两次。并且这个安全规约也不是严格的,如果敌手A成功的概率为,那么敌手B仅仅能保证成功的概率大约为
。为了使得这个证明严格,我们需要如下的技术引理:
重绕引理:给定两个有限域S和T,是非空的集合,令S*T->{0,1}为一个函数。令X,Y,Y’为互相独立的随机变量,其中X随机变量来源于有限域S,Y和Y’随机变量来自于有限域T。如果下式存在:[*注意这里对于上述公式的证明有一个比较复杂的推导,需要很多概率论的知识,本文将随后详细列出其使用的概率论知识与每步的推导过程。]
则有如下关系成立:
有了“重绕定理”之后对定理19.1(即Isch身份认证协议能够抵抗直接攻击)证明如下:
证明19.1 :
存在一个仿冒敌手A,其优势为,构造一个DL敌手B,其优势为
。敌手B从其挑战者处获得一个DL问题的实例,然后我们的目标是使得敌手B在A的帮助下(注意,这里不同于之前的证明技术敌手B直接封装敌手A算法,这里是B调用A),计算出该离散对数问题的解。这里给出该证明过程的一个规约描述图如下:
敌手B这里想要解决困难问题需要两个步骤:
第一步:敌手B 首先扮演A的挑战者,给与A秘密的证明(离散对数承诺值)作为验证公钥。B此时的目的在于计算出来两个可以接受的会话,如下:
然后敌手B的详细操作:
1. A扮演系统中的证明者发送ut给B,此时B扮演的是系统中的验证者。(本质上这里B是A的挑战者,是解决困难问题的挑战者)
2. B选择一个随机挑战给A。
3. A生成第一个合法的解给B,记为C1.
4.B重置A的内部状态,就好像A是从第一步开始的一样,然后B给出一个新的挑战询问。
5.A给出新的合法的解,记为C2。
然后,此时应用上述“重绕引理”,随机变量Y对应的是挑战C1,随机变量Y’对应的是挑战C2.X对应的是所有的由A 和B以及B的挑战者给出的随机选择值。函数f输出为1,代表输出的是一个可以接受的会话内容。那么,显然我们可以得到两个相同的可以接受的会话内容,根据“重绕引理”我们获得获得两个可以接受的不同挑战会话的概率为最少为。
第二步:敌手B只只需要根据上文提到的算法直接计算出离散对数的解即可。
总的来说,上文我们已经展示了该协议是安全的,可以抵抗直接攻击通过展示从一个恶意证明者处进行一个有效的秘密提取。这允许我们从一个恶意的证明者处获取一个离散对数的解。提取器的工作通过重绕证明者获得两个可以接受的会话。对于重绕证明者这个操作在安全性证明中是可能的,因为我们人为控制着全部证明者A的操作与环境。但是在现实中,因为我们不能重绕一个诚实的证明者,一个攻击者也就不能使用这种策略从诚实证明者处提取秘密值。
19.1.1 Honest verifier zero knowledge and security against eavesdropping
在上文中,我们已经在展示了schnorr ID 协议是安全的可以抵抗一个直接攻击(即为存在某个敌手A直接伪装为诚实的P,输出一个合法的输出内容),在DL假设下。事实上,在相同的假设下,我们可以进一步证明该协议是抵抗窃听攻击的。
现在考虑窃听攻击(eavesdropping attack),敌手显然可以获得一个验证公钥和一系列的窃听结果,其可以且听到证明者P和验证者V之间的所有的交互(挑战-回复三元组)。防御这种攻击的核心是这些会话内容不能帮助敌手提取秘密值,因为敌手可以通过验证公钥自由的生成这些会话。如果我们能够展示这个观点,那么就能证明其安全性。
定义敌手A的优势是以不可忽略的概率,成功输出一个身份的伪造。然后我们定义一个敌手B,B与A的工作方式是相同的,除了B可以通过自己来生成这些会话内容,不需要从挑战者处获得(或者从P与V的会话中窃听)。因此,B实施一个直接攻击,但是与A仿冒攻击有着相同的成功概率。
这个概念被发展成为一种更加通用的定义,Honest verifier zero knowledge 诚实验证者零知识。即为验证者是诚实的零知识证明。下面给出定义:
定义19.1 令协议I=(G,P,V)为一个身份协议。我们定义该协议为诚实验证者零知识,或者HVZK,那么,存在一个概率算法Sim(被叫做模拟者),对于算法G输出的所有可能密钥对(vk,sk), 在输入为vk的条件下,SIM的输出分布与P,V之间对话记录的分布是相同的。(即为Sim 可以在没有sk的情况下模拟所有的PV交互)。
下面进一步解释,“zero knowledge”意味着一个敌手不能从P身上学到任何内容,因为敌手可以自己模拟所有会话内容,在没有私钥sk的情况下。“honest verifier”意味着这样一个事实,这个模拟仅仅运行于P和一个诚实验证者V之间的模拟,V不是一个自由的不诚实验证者,例如,其可能会发起积极的攻击。下面给出该schnorr 协议是HVZK的形式化描述:
如果一个ID协议是安全抵抗直接攻击的,并且是HVZK的,那么其也是安全抵抗窃听敌手攻击的。
如果存在一个敌手A能够对协议I发起一个窃听攻击(掌握Q次通信内容),那么存在一个敌手B可以发起一个直接攻击(此时,B调用A发起攻击,且B可以自己完成Q次通信的模拟,并把Q次通信内容作为输入给A,然后A进行窃听攻击)。攻击逻辑图如下所示:
那么如果B能成功,则意味着敌手B以“零知识”攻击Challenger成功,这在零知识系统中的变种形式中非常常见。下面我们带入schnorr协议到这个HVZK模型中,得到如下安全定理,证明了schnorr协议是可以抵抗窃听攻击的。
证明:Schnorr ID协议是HVZK的。 模拟者在生成合法的对话时,不一定是按照P和V交流的顺序生成回复信息的,在这里是采用的逆序生成,首先生成
,最后生成
,这与原始协议是相反的,也正因为如此,才能模拟成功,计算过程如下:
现在,我们讨论模拟者SIM在只有vk = u的条件下,确实具备和P一样的输出分布。关键是在真实的交互中c 和 是互相独立的,c 均匀的分布在挑战空间C中,
也是均匀分布在整数域Z中。更重要的是给定c和
,那么值ut是惟一的。显然这与模拟器的输出分布式一致的。
所以,已知Schnorr协议是HVZK的,那么我们立即得到如下推论:
定理19.5 如果说Schnorr ID协议是安全抵抗直接攻击的,那么其也是能安全抵抗窃听攻击的。特别的,对于任意的仿冒敌手A攻击该协议采取一个窃听攻击,那么存在一个敌手B攻击该协议使用直接攻击的方式,B算法封装了A算法。仅仅知道vk是很难发起直接攻击的,但是却能很容易的模拟会话,这是因为生成模拟会话的顺序与真实环境不同导致的。敌手A发起直接攻击必须在V没有给出挑战C的时候生成ut, 而在证明算法中模拟者可以先看到C再生成其他会话内容。所以,如果挑战空间C是非常小的,该协议将不安全,类似于字典攻击,模拟者提起生成大量的会话内容,然后发送给V,企图猜测V能选择一个生成过的C来挑战。因此,一种攻击该协议的优势为1/|C|, 所以为了安全起见,必须设定C是超多项式的。
目前对schnorr协议来说是否能够抵抗active attacks依然是一个开放性问题,没有已知的有效攻击,但是也不排除存在该攻击。一些变体schnorr协议可以实现active attack。