CTF-All-In-One/doc/1.6.7_protocol.md
firmianay d6ef2685c0 fix
2019-02-25 22:23:53 +08:00

376 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CRYPT-7 密码协议
**author : Odyssey@cyberpeace**
## 目录
7.1 认证的定义
7.2 密码协议
7.3 身份证明
7.4 零知识证明
### 7.1 认证的定义
CRYPT-5 介绍过消息认证的基本概念,事实上安全可靠的通信除需进行消息的认证外,还需建立一些规范的协议对数据来源的可靠性、通信实体的真实性加以认证,以防止欺骗、伪装等攻击。本节以网络通信的一个基本问题的解决引出认证协议的基本意义,这一基本问题陈述如下: A和B是网络的两个用户他们想通过网络先建立安全的共享密钥再进行保密通信。那么A(B)如何确信自己正在和B(A)通信而不是和C通信呢这种通信方式为双向通信因此此时的认证称为相互认证。类似地对于单向通信来说认证称为单向认证。
### 7.1 认证的定义
认证可以是单向的也可以是双向的。
- 单向认证是指通信双方中只有一方向另一方进行认证
- 双向认证是指通信双方相互进行认证。
### 7.2 密码协议
- 相互认证
- 采用对称密码算法的机制
- 采用公开密钥算法的机制
- 单向认证
- 采用对称密码算法的机制
- 采用公开密钥算法的机制
#### 7.2.1 相互认证
A、B两个用户在建立共享密钥时需要考虑的核心问题是保密性和实时性。为了防止会话密钥的伪造或泄露会话密钥在通信双方之间交换时应为密文形式所以通信双方事先就应有密钥或公开钥。第2个问题实时性则对防止消息的重放攻击极为重要实现实时性的一种方法是对交换的每一条消息都加上一个序列号一个新消息仅当它有正确的序列号时才被接收。但这种方法的困难性是要求每个用户分别记录与其他每一用户交换的消息的序列号从而增加了用户的负担所以序列号方法一般不用于认证和密钥交换。
#### 7.2.1 相互认证
保证消息的实时性常用以下三种方法:
- 时戳
如果A收到的消息包括一时戳且在A看来这一时戳充分接近自己的当前时刻 A才认为收到的消息是新的并接受之。这种方案要求所有各方的时钟是同步的。
- 询问-应答
用户A向B发出一个一次性随机数作为询问如果收到B发来的消息应答也包含一正确的一次性随机数A就认为B发来的消息是新的并接受之。
- 序列号
对交换的每一条消息加上序列号,序列号正确才被接收
其中时戳法不能用于面向连接的应用过程,这是由于时戳法在实现时固有的困难性。首先是需要在不同的处理器时钟之间保持同步,那么所用的协议必须是容错的以处理网络错误,并且是安全的以对付恶意攻击。第二,如果协议中任一方的时钟出现错误而暂时地失去了同步,则将使敌手攻击成功的可能性增加。最后还由于网络本身存在着延迟,因此不能期望协议的各方能保持精确的同步。所以任何基于时戳的处理过程、协议等都必须允许同步有一个误差范围。考虑到网络本身的延迟,误差范围应足够大;考虑到可能存在的攻击,误差范围又应足够小。
而询问-应答方式则不适合于无连接的应用过程,这是因为在无连接传输以前需经询问\应答这一额外的握手过程,这与无连接应用过程的本质特性不符。对无连接的应用程序来说,利用某种安全的时间服务器保持各方时钟同步是防止重放攻击最好的方法。
通信双方建立共享密钥时可采用单钥加密体制和公钥加密体制。
序列号方法要求每个用户分别记录与其他每一用户交互的序列号,增加用户负担,因而很少使用
**采用对称密码算法的机制**
采用单钥加密体制为通信双方建立共享的密钥时需要有一个可信的密钥分配中心KDC网络中每一用户都与KDC有一共享的密钥称为主密钥。KDC为通信双方建立一个短期内使用的密钥称为会话密钥并用主密钥加密会话密钥后分配给两个用户。这种分配密钥的方式在实际应用中较为普遍采用如接下来介绍的Kerberos系统采用的就是这种方式。
#### 7.2.1 相互认证
**Needham-Schroeder协议**
![](files/2018-04-08-12-05-44.png)
- $A→KDC:ID_A ||ID_B||N_1$
- $KDC→A:E_{KA}[K_S||ID_B||N_1||E_{KB}[K_S||ID_A]]$
- $A→B:E_{KB}[KS||IDA]$ ----------弱点
- $B→A:E_{KS}[N_2]$
- $→B:E_{KS}[f(N_2)]$
式中$K_A$、$K_B$分别是A、B与KDC共享的主密钥。协议的目的是由KDC为A、B安全地分配会话密钥$K_S$A在第②步安全地获得了KS而第③步的消息仅能被B解读因此B在第③步安全地获得了$K_S$ 第④步中B向A示意自己已掌握$K_S$N2用于向A询问自己在第③步收到的$K_S$是否为一新会话密钥第⑤步A对B的询问作出应答一方面表示自己已掌握$
K_S$,另一方面由$f(N_2)$回答了$K_S$的新鲜性。可见第④、⑤两步用于防止一种类型的重放攻击比如敌手在前一次执行协议时截获第③步的消息然后在这次执行协议时重放如果双方没有第④、⑤两步的握手过程的话B就无法检查出自己得到的$K_S$是重放的旧密钥。
然而以上协议却易遭受另一种重放攻击假定敌手能获取旧会话密钥则冒充A向B重放第③步的消息后就可欺骗B使用旧会话密钥。敌手进一步截获第④步B发出的询问后可假冒A作出第⑤步的应答。进而敌手就可冒充A使用经认证过的会话密钥向B发送假消息。
**协议改进方案一**
为克服以上弱点,可在第②步和第③步加上一时戳,改进后的协议如下:
- $A→KDC:ID_A||ID_B$
- $KDC→A:E_{KA}[K_S||ID_B||T||E_{KB}[K_S||ID_A||T]]$
- $A→B:E_{KB}[K_S||ID_A||T]$
- $B→A:E_{KS}[N_1]$
- $A→B:E_{KS}[f(N_1)]$
- 其中T是时戳用以向A、B双方保证KS的新鲜性。A和B可通过下式检查T的实时性
$|Clock-T|<Δt_1+Δt_2$
- 其中Clock为用户A或B本地的时钟$Δt_1$是用户本地时钟和KDC时钟误差的估计值$Δt_2$是网络的延迟时间
- 以上协议中由于T是经主密钥加密的所以敌手即使知道旧会话密钥并在协议的过去执行期间截获第步的结果也无法成功地重放给B因B对收到的消息可通过时戳检查其是否为新的
以上改进还存在以下问题 方案主要依赖网络中各方时钟的同步这种同步可能会由于系统故障或计时误差而被破坏如果发送方的时钟超前于接收方的时钟敌手就可截获发送方发出的消息等待消息中时戳接近于接收方的时钟时再重发这个消息这种攻击称为等待重放攻击
抗击等待重放攻击的一种方法是要求网络中各方以KDC的时钟为基准定期检查并调整自己的时钟另一种方法是使用一次性随机数的握手协议因为接收方向发送方发出询问的随机数是他人无法事先预测的所以敌手即使实施等待重放攻击也可被下面的握手协议检查出来
**协议改进方案二**
下面的协议可解决Needham-Schroeder协议以及改进方案一可能遭受的攻击
$AB:ID_A||N_A$
$BKDC:ID_B||N_B||E_{KB}[ID_A||N_A||T_B]$
$KDCA:E_{KA}[ID_B||N_A||K_S||T_B]||E_{KB}[ID_A||K_S||T_B]||N_B$
$AB:E_{KB}[ID_A||K_S||T_B]||E_{KS}[N_B]$
协议的具体含义如下
A将新产生的一次性随机数$N_A$与自己的身份$I_{DA}$一起以明文形式发往B$N_A$以后将与会话密钥$K_S$一起以加密形式返回给A以保证A收到的会话密钥的新鲜性
B向KDC发出与A建立会话密钥的请求表示请求的消息包括B的身份一次性随机数$N_B$以及由B与KDC共享的主密钥加密的数据项其中$N_B$以后将与会话密钥一起以加密形式返回给B以向B保证会话密钥的新鲜性请求中由主密钥加密的数据项用于指示KDC向A发出一个证书其中的数据项有证书接收者A的身份B建议的证书截止时间TBB从A收到的一次性随机数
KDC将B产生的$N_B$连同由KDC与B共享的密钥KB加密的$ID_A||K_S||T_B$一起发给A其中$K_S$是KDC分配的会话密钥$E_{KB}[ID_A||K_S||T_B]$由A当作票据用于以后的认证KDC向A发出的消息还包括由KDC与A共享的主密钥加密的$ID_B||N_A||K_S||T_B$A用这一消息可验证B已收到第步发出的消息通过$ID_B$A还能验证这一步收到的消息是新的通过$N_A$这一消息中还包括KDC分配的会话密钥$K_S$以及会话密钥的截止时间$T_B$。
A将票据$E_{KB}[ID_A||K_S||T_B]$连同由会话密钥加密的一次性随机数$N_B$发往BB由票据得到会话密钥$K_S$并由$K_S$$N_B$。$N_B$由会话密钥加密的目的是B认证了自己收到的消息不是一个重放,而的确是来自于A
以上协议为AB双方建立共享的会话密钥提供了一个安全有效的手段再者如果A保留由协议得到的票据就可在有效时间范围内不再求助于认证服务器而由以下方式实现双方的新认证
$AB:E_{KB}[ID_A||K_S||T_B],N'A$
$BA:N'_B,E_{KS}[N'_A]$
$AB:E_{KS}[N'_B]$
B在第步收到票据后可通过$T_B$检验票据是否过时而新产生的一次性随机数$N'_A$、$N'_B$则向双方保证了没有重放攻击
以上协议中时间期限$T_B$是B根据自己的时钟定的因此不要求各方之间的同步
**采用公开密钥算法的机制**
前面的课程曾介绍过使用公钥加密体制分配会话密钥的方法下面的协议也用于这个目的
$AAS:ID_A||ID_B$
$ASA:E_{SK^{AS}}[ID_A||PK_A||T]||E_{SK^{AS}}[ID_B||PK_B||T]$
$AB:E_{SK^{AS}}[ID_A||PK_A||T]||E_{SK^{AS}}[ID_B||PK_B||T||E_{PK^B}[E_{SK^A}[K_S||T]]$
其中$SK_{AS}$、$SK_A$分别是AS和A的秘密钥$PK_A$、$PK_B$分别是A和B的公开钥E为公钥加密算法AS是认证服务器authentication server)。A将自己的身份及欲通信的对方的身份发送给ASAS发给A的两个链接的数据项都是由自己的秘密钥加密即由AS签字分别作为发放给通信双方的公钥证书A选取会话密钥并经自己的秘密钥和B的公开钥加密后连同两个公钥证书一起发往B因会话密钥是由A选取并以密文形式发送给B因此包括AS在内的任何第3者都无法得到会话密钥时戳T用以防止重放攻击所以需要各方的时钟是同步的
下一协议使用一次性随机数因此不需要时钟的同步
$AKDC:ID_A||ID_B$
$KDCA:E_{SK_{AU}}[ID_B||PK_B]$
$AB:E_{PK^B}[N_A||ID_A]$
$BKDC:ID_B||ID_A||E_{PK^{AU}}[N_A]$
$KDCB:E_{SK^{AU}}[ID_A||PK_A]||E_{PK^B}[E_{SK^{AU}}[N_A||K_S||ID_B]]$
$BA:E_{PK^A}[E_{SK^{AU}}[N_A||K_S||ID_B]||N_B]$
$AB:E_{K^S}[N_B]$
其中$SK_{AU}$$PK_{AU}$分别是KDC的秘密钥和公开钥A通知KDC他想和B建立安全连接KDC将B的公钥证书发给A公钥证书包括经KDC签字的B的身份和公钥A告诉B想与他通信并将自己选择的一次性随机数$N_A$发给BB向KDC发出得到A的公钥证书和会话密钥的请求请求中由KDC的公开钥加密的$N_A$用于让KDC将建立的会话密钥与$N_A$联系起来以保证会话密钥的新鲜性
KDC向B发出A的公钥证书以及由自己的秘密钥和B的公开钥加密的三元组$\{N_A,K_S,ID_B\}$。三元组由KDC的秘密钥加密可使B验证三元组的确是由KDC发来的由B的公开钥加密是防止他人得到三元组后假冒B建立与A的连接B新产生一个一次性随机数$N_B$,连同上一步收到的由KDC的秘密钥加密的三元组一起经A的公开钥加密后发往AA取出会话密钥再由会话密钥加密$N_B$后发往B以使B知道A已掌握会话密钥
以上协议可进一步做如下改进 在第⑤、⑥两步出现$N_A$的地方加上$ID_A$以说明$N_A$的确是由A产生的而不是其他人产生的这时$\{ID_A,N_A\}$就可惟一地识别A发出的连接请求
#### 7.2.2 单向认证
电子邮件等网络应用有一个最大的优点就是不要求收发双方同时在线发送方将邮件发往接收方的信箱邮件在信箱中存着直到接收方阅读时才打开邮件消息的报头必须是明文形式以使SMTPsimple mail transfer protocol-简单邮件传输协议或X.400等存储-转发协议能够处理然而通常都不希望邮件处理协议要求邮件的消息本身是明文形式否则就要求用户对邮件处理机制的信任
所以用户在进行保密通信时需对邮件消息进行加密以使包括邮件处理系统在内的任何第3者都不能读取邮件的内容再者邮件接收者还希望对邮件的来源即发方的身份进行认证以防他人的假冒与双向认证一样在此仍分为单钥加密和公钥加密两种情况来考虑
**采用对称密码算法的机制**
对诸如电子邮件等单向通信来说图5.2所示的无中心的密钥分配情况不适用因为该方案要求发送方给接收方发送一请求并等到接收方发回一个包含会话密钥的应答后才向接收方发送消息所以本方案与接收方和发送方不必同时在线的要求不符在图5.1所示的情况中去掉第步和第步就可满足单向通信的两个要求协议如下
$AKDC:ID_A||ID_B||N_1$
$KDCA:E_{K^A}[K_S||ID_B||N_1||E_{K^B}[K_S||ID_A]]$
$AB:E_{K^B}[K_S||ID_A]||E_{K^S}[M]$
本协议不要求B同时在线但保证了只有B能解读消息同时还提供了对消息的发方A的认证然而本协议不能防止重放攻击为此需在消息中加上时戳但由于电子邮件处理中的延迟时戳的作用极为有限
**采用公开密钥算法的机制**
公钥加密算法可对发送的消息提供保密性认证性或既提供保密性又提供认证性为此要求发送方知道接收方的公开钥保密性或要求接收方知道发送方的公开钥认证性或要求每一方都知道另一方的公开钥
如果主要关心保密性则可使用以下方式
$AB:E_{PK^B}[K_S]||E_{K^S}[M]$
其中A用B的公开钥加密一次性会话密钥用一次性会话密钥加密消息只有B能够使用相应的秘密钥得到一次性会话密钥再用一次性会话密钥得到消息这种方案比简单地用B的公开钥加密整个消息要有效得多
如果主要关心认证性则可使用以下方式
$AB:M||E_{SK^A}[H(M)]$
这种方式可实现对A的认证但不提供对M的保密性如果既要提供保密性又要提供认证性可使用以下方式
$AB:E_{PK^B}[M||E_{SK^A}[H(M)]]$
后两种情况要求B知道A的公开钥并确信公开钥的真实性为此A还需同时向B发送自己的公钥证书表示为
$AB:M||E_{SK^A}[H(M)]||E_{SK^{AS}}[T||ID_A||PK_A]$
$AB:E_{PK^B}[M||E_{SK^A}[H(M)]||E_{SK^{AS}}[T||ID_A||PK_A]]$
其中$E_{SK^{AS}}[T||ID_A||PK_A]$是认证服务器AS为A签署的公钥证书
#### 7.3 身份证明
身份证明又称为身份识别身份认证它是证实客户的真实身份与其所声称的身份是否相符的过程
用户的身份识别是许多应用系统的第一道防线身份证明对确保系统和数据的安全保密是极其重要的
- 身份证明的手段三种途径之一或他们的组合
1所知Knowledge:密码口令
2所有Possesses):身份证护照信用卡钥匙
3个人特征指纹笔迹声纹手型血型视网
虹膜DNA以及个人动作方面的一些特征
4你做的事情如手写签名
- 设计依据
安全水平系统通过率用户可接受性成本等
#### 7.3.1 身份证明机制分类
- 口令机制
- 交互式证明
- 零知识证明协议
#### 7.3.2 口令认证
- Passwordsweak authentication系统检查口令是否与系统拥有的相应用户数据相匹配批准声明的身份访问资源
- 用户ID是声称的身份
- 口令是支持声称的证据固定口令PIN和通行密钥
![](files/2018-04-02-16-50-51.png)
![](files/2018-04-02-16-51-45.png)
![](files/2018-04-02-16-52-02.png)
![](files/2018-04-02-16-52-33.png)
![](files/2018-04-02-16-54-38.png)
![](files/2018-04-02-16-55-28.png)
![](files/2018-04-02-16-56-04.png)
![](files/2018-04-02-16-56-36.png)
![](files/2018-04-02-16-56-51.png)
![](files/2018-04-02-16-57-26.png)
- 加强固定口令安全性的措施
- 避免口令
- 口令加盐
- 口令扩展为通行短语
- 放慢口令映射多次迭代函数上面的撒盐机制
- 定义口令生存期
- 限制口令的尝试次数
- 登录需输入指定图片中的随机数和字母的组合
![](files/2018-04-02-16-58-51.png)
![](files/2018-04-02-16-59-29.png)
![](files/2018-04-02-16-59-50.png)
![](files/2018-04-02-17-00-16.png)
![](files/2018-04-02-17-00-38.png)
![](files/2018-04-02-17-01-03.png)
#### 7.3.3 交互式证明
- 示证者P(Prover)知道某一秘密使V相信自己掌握这一秘密
- 验证者V(Verifier)验证P掌握秘密每轮V向P发出一询问P向V做应答V检查P是否每一轮都能正确应答
P知道某一秘密如公钥密码体制的秘密钥或一平方剩余x的平方根P希望使V相信自己的确掌握这一秘密交互证明由若干轮组成在每一轮P和V可能需根据从对方收到的消息和自己计算的某个结果向对方发送消息比较典型的方式是在每轮V都向P发出一询问P向V做出一应答所有轮执行完后V根据P是否在每一轮对自己发出的询问都能正确应答以决定是否接受P的证明
交互证明和数学证明的区别是 数学证明的证明者可自己独立地完成证明而交互证明是由P产生证明V验证证明的有效性来实现因此双方之间通过某种信道的通信是必需的
交互证明系统须满足以下要求
完备性: 如果P知道某一秘密V将接受P的证明
正确性: 如果P能以一定的概率使V相信P的证明则P知道相应的秘密
#### 7.3.4 简化的Fiat-Shamir身份识别方案
**协议及原理**
设n=pq其中p和q是两个不同的大素数x是模n的平方剩余y是x的平方根。又设n和x是公开的而p、q和y是保密的。证明者P以y作为自己的秘密。4.1.8节已证明,求解方程$y^2≡x\space mod\space n$与分解n是等价的因此他人不知n的两个素因子pq而计算y是困难的P和验证者V通过交互证明协议P向V证明自己掌握秘密y从而证明了自己的身份
**协议如下:**
P随机选$r(0<r<n)$计算$ar^2\space mod\space n$将a发送给V
V随机选$e∈{0,1}$将e发送给P
P计算$bry^e\space mod\space n$即e=0时b=re=1时$b=ry\space mod\space n$。将b发送给V
$b^2ax^e\space mod\space n$V接受P的证明
在协议的前3步P和V之间共交换了3个消息这3个消息的作用分别是 第1个消息是P用来声称自己知道a的平方根第2个消息e是V的询问如果e=0P必须展示a的平方根即r如果e=1P必须展示被加密的秘密即ry mod n第3个消息b是P对V询问的应答
**协议的完备性、正确性和安全性**
- 完备性
如果P和V遵守协议且P知道y则应答$bry^e\space mod\space n$应是模n下axe的平方根在协议的第步V接受P的证明所以协议是完备的
- 正确性
假冒的证明者E可按以下方式以1/2的概率骗得V接受自己的证明
E随机选$r(0<r<n)$$\widetilde{e}\in \{0,1\}$计算$a\equiv r^2x^{-\widetilde{e}}\space mod\space n$
将a发送给V
V随机选$e∈{0,1}$将e发送给E
E将r发送给V
根据协议的第V的验证方程是$r^2\equiv ax^e\space mod\space n\equiv r^2x^{-\widetilde{e}}x^e\space mod\space n$$\widetilde{e}=e$验证方程成立V接受E的证明即E欺骗成功因的概率是1/2所以E欺骗成功的概率是1/2另一方面1/2是E能成功欺骗的最好概率否则假设E以大于1/2的概率使V相信自己的证明那么E知道一个a对这个a他可正确地应答V的两个询问e=0和e=1意味着E能计算$b^2_1≡a\space mod\space n$$b_2^2ax\space mod\space n$$\frac{b_2^2}{b_1^2}\equiv x\space mod\space n$因此E由$\frac{b_2}{b_1}mod\space n$即可求得$x$的平方根$y$矛盾
- 安全性
协议的安全性可分别从证明者P和验证者V的角度来考虑根据上面的讨论假冒的证明者E欺骗V成功的概率是1/2对V来说这个概率太大了为减小这个概率可将协议重复执行多次设执行t次则欺骗者欺骗成功的概率将减小到2-t
下面考虑P的安全性因为V的询问是在很小的集合{0,1}中选取的V没有机会产生其他信息而P发送给V的信息仅为P知道x的平方根这一事实因此V无法得知x的平方根
### 7.4 零知识证明
零知识证明起源于最小泄露证明在交互证明系统中设P知道某一秘密并向V证明自己掌握这一秘密但又不向V泄露这一秘密这就是最小泄露证明进一步如果V除了知道P能证明某一事实外不能得到其他任何信息则称P实现了零知识证明相应的协议称为零知识证明协议
#### 7.4.1 简单迷宫
<div id="left">
右图表示一个简单的迷宫C与D之间有一道门需要知道秘密口令才能将其打开。P向V证明自己能打开这道门但又不愿向V泄露秘密口令。
</div>
<div id="right">
![](files/2018-04-10-09-06-26.png)
#### 7.4.1 简单迷宫
可采用如下协议:
- V在协议开始时停留在位置A。
- P一直走到迷宫深处随机选择位置C或位置D。
- P消失后V走到位置B然后命令P从某个出口返回位置B。
- P服从V的命令必要时利用秘密口令打开C与D之间的门。
- P和V重复以上过程n次。
协议中如果P不知道秘密口令就只能从来路返回B而不能走另外一条路。此外P每次猜对V要求走哪一条路的概率是1/2因此每一轮中P能够欺骗V的概率是1/2。假定n取16则执行16轮后P成功欺骗V的概率是$\frac{1}{216}=\frac{1}{65536}$。于是如果P16次都能按V的要求返回V即能证明P确实知道秘密口令。还可以看出V无法从上述证明过程中获取丝毫关于P的秘密口令的信息所以这是一个零知识证明协议。
#### 7.4.2 哈密尔顿Hamilton回路
1959 年 William Rowan Hamilton 发明了一个小玩具,这个玩具是一个木刻的正十二面体,每面系正五角形,三面交于一角,共 20 个角,没每个角上标有世界上一个重要城市。他提出一个问题:要求沿着正十二面体的边寻找一条路,通过 20 个城市而每个城市只通过一次最后返回原地。Hamilton 将此问题称为周游世界问题,并且坐了肯定的回答。
![](files/2018-04-10-09-12-21.png)
图中的回路是指始点和终点相重合的路径若回路通过图的每个顶点一次且仅一次则称为哈密尔顿回路构造图的哈密尔顿回路是NPC问题。现在假定P知道图G的哈密尔顿回路并希望向V证明这一事实可采用如下协议
- P随机地构造一个与图G同构的图$\widetilde{G}$并将交给V。
- V随机地要求P做下述两件工作之一
- 证明图G和图$\widetilde{G}$同构;
- 指出图的一条哈密尔顿回路。
- P根据要求做下述两件工作之一
- 证明图G和图$\widetilde{G}$同构但不指出图G或图$\widetilde{G}$的哈密尔顿回路;
- 指出图$\widetilde{G}$的哈密尔顿回路但不证明图G和图$\widetilde{G}$同构。
- P和V重复以上过程n次。
协议执行完后V无法获得任何信息使自己可以构造图G的哈密尔顿回路因此该协议是零知识证明协议。事实上如果P向V证明图G和图$\widetilde{G}$同构这个结论对V并没有意义因为构造图$\widetilde{G}$的哈密尔顿回路和构造图G的哈密尔顿回路同样困难。如果P向V指出图$\widetilde{G}$的一条哈密尔顿回路这一事实也无法向V提供任何帮助因为求两个图之间的同构并不比求一个图的哈密尔顿回路容易。在协议的每一轮中P都随机地构造一个与图G同构的新图因此不论协议执行多少轮V都得不到任何有关构造图G的哈密尔顿回路的信息。
### 7.4.2 哈密尔顿Hamilton回路
注:两个图$G_1$和$G_2$是同构的是指从$G_1$的顶点集合到$G_2$的顶点集合之间存在一个一一映射π,当且仅当若$x$、$y$是$G_1$上的相邻点,$π(x)$和$π(y)$是$G_2$上的相邻点。
### 7.4.3 Fiat-Shamir身份识别方案
**1. 协议及原理**
在简化的Fiat-Shamir身份识别方案中验证者V接受假冒的证明者证明的概率是1/2为减小这个概率将证明者的秘密改为由随机选择的t个平方根构成的一个向量$y=(y_1,y_2,…,y_t)$模数n和向量$x=(y^2_1,y^2_2,…,y^2_t)$是公开的其中n仍是两个不相同的大素数的乘积。
协议如下:
① P随机选$r(0<r<n)$计算$ar^2\space mod\space n$将a发送给V
V随机选$e=(e_1,e_2,…,e_t)$,其中$e_i\in \{0,1\}(i=1,2,…,t)$将e发送给P。
P计算$b\equiv r\prod^{t}_{i=1}y_i^{e_i}\space mod\space n$将b发送给V
$b^2\not\equiv a\prod^{t}_{i=1}x_i^{e_i}\space$ V拒绝P的证明协议停止
P和V重复以上过程k次
**2. 协议的完备性、正确性和安全性**
- 完备性
若P和V遵守协议则V接受P的证明
- 正确性
如果假冒者E欺骗V成功的概率大于$2^{-kt}$意味着E知道一个向量$A=(a^1,a^2,…,a^k)$,其中$a^j$是第j次执行协议时产生的对这个AE能正确地回答V的两个不同的询问$E=(e_1,e_2,…,e_k)$、$F=(f_1,f_2,…,f_k)$(每一元素是一向量),$E≠F$。
$EF$可设$e^jf^j$$e^j$$f^j$是第j次执行协议时V的两个不同的询问为向量简记为$e=e^j$和$f=f^j$,这一轮对应的$a^j$简记为a。所以E能计算两个不同的值
$$b_1^2\equiv a\prod^{t}_{i=1}x_i^{f_i-e_i}\space mod\space nb_2^2\equiv a\prod^{t}_{i=1}x_i^{f_i}\space mod\space n$$
$\frac{b_2^2}{b_1^2}\equiv \prod^{t}_{i=1}x_i^{f_i-e_i}\space mod\space n$
所以E可由$\frac{b_2}{b_1}\space mod\space n$求得$x\equiv \prod^{t}_{i=1}x_i^{f_i-e_i}\space mod\space n$的平方根矛盾
- 安全性
Fiat-Shamir身份识别方案是对简化的Fiat-Shamir身份识别方案的推广首先将V的询问由一个比特推广到由t个比特构成的向量再者基本协议被执行k次假冒的证明者只有能正确猜测V的每次询问才可使V相信自己的证明成功的概率是$2^{-kt}$。