Crypto add (#17)

* add some crypto lesson

* change some crypto lesson
This commit is contained in:
odyssey 2019-02-25 20:29:55 +08:00 committed by Firmy Yang
parent 681ff36e21
commit 2dc03dbe1f
238 changed files with 4593 additions and 0 deletions

View File

@ -0,0 +1,520 @@
# CRYPT-1 密码学导论
**author:Odyssey@cyberpeace**
## 知识点
- 密码体制
- 古典密码
- 密码安全性
## 学习目标
- 掌握密码技术的基本思想
- 掌握密码体制的组成结构
- 熟悉置换、代替和代数等古典密码的编码方法
- 掌握密码体制的分类
- 掌握密码安全性的概念
- 了解密码在信息安全领域的实际应用
## 目录
1.1 密码学基本思想
1.2 密码体制组成
1.3 古典密码学
1.4 单表置换密码
1.5 多表置换密码
### 1.1 密码学基本思想
**为什么会有密码学**
![](files/1-1-1.png)
**密码学的定义**
密码学是构建和分析不同加密解密方法的科学,该科学实际上包含两个部分:
- 密码使用学是构建功能更强大、更有效的新密码的加密解密方法的科学。
- 密码分析学则是发现已有加密法的弱点,以便不用密钥就能还原成明文的科学。
密码分析是确保密码体制安全的唯一方法,是密码学不可缺少的部分。密码学与通信有着密不可分的关系,往往还能决定着战争的胜负。
**密码与信息安全**
- 密码总会被破解
- 密码的算法总会被公开
- 弱密码比不加密更危险
- 密码只是信息安全的一部分
**安全性原则**
- 计算安全性
- 可证明安全性
- 无条件安全性
### 1.2 密码学分类
- 密码使用学
- 密码分析学
#### 1.2.1 密码使用学分类
- 无秘钥算法
- 对称秘钥算法
- 公开秘钥算法
![](files/1-2-1.png)
**对称密钥算法**
双方共享一个密钥,并使用相同的加密和解密方法。
![](files/1-2-1-2.png)
**对称密钥算法**
对称密钥算法重要术语:
明文被传递的消息。用M表示它可能是位序列、文本文件、位图、数字化的语音序列或数字化的视频图像等。对于计算机M指的是二进制数据。
密文加密后的消息。用C表示对于计算机C指的是二进制数据。
加密函数作用于明文M得到密文C用E表示。
>数学公式:𝐶=𝐸(𝑀)
解密函数作用于密文C还原明文M用D表示。
>数学公式:𝑀=𝐷(𝐶)
先加密后解密,原始明文将恢复:𝐷(𝐸(𝑀))=𝑀
**公开密钥算法**
公钥密码体制使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。解密密钥是接收者专用的秘钥,对其他人都保密。
![](files/1-2-1-3.png)
公开密钥算法重要术语:
发送者 A 用 B 的公钥 PKB 对明文 X 加密E 运算)后,在接收者 B 用自己的私钥 SKB 解密D 运算),即可恢复出明文:
$$D_{SK_{B}}(Y)=D_{SK_{B}}(E_{PK_B}(X))=X$$
加密密钥是公开的,但不能用它来解密,即:
$$D_{PK_B}(E_{PK_B}(X))\neq X$$
#### 1.2.2 密码分析学分类
![](files/1-2-4.png)
### 1.3 古典密码学
#### 1.3.1 古今密码学
密码学已经存在了几千年密码学一词源于希腊语kryptós“隐藏的”和gráphein“书写”。古典密码学的编码和破译通常依赖于设计者和敌手的创造力与技巧作为一种实用性艺术存在并没有对于密码学原理的清晰定义。而现代密码学则起源于20世纪末出现的大量相关理论这些理论使得现代密码学成为了一种可以系统而严格地学习的科学。
#### 1.3.2 常见替换密码
单表替换加密法:明文中的同一字母在加密时被同一固定的字母代换。
- 凯撒密码
- 简单替换密码
- 仿射密码
- Polybius密码
多表替换加密法:明文中的同一字母在加密时不是完全被同一固定的字母代换,可能是多个。
- 维吉尼亚密码
- ADFGVX密码
- Enigma密码机
### 1.4 单表置换密码
#### 1.4.1 凯撒密码
恺撒密码英语Caesar cipher或称恺撒加密、恺撒变换、变换加密是一种最简单且最广为人知的加密技术。当年恺撒曾用此方法与其将军们进行联系。
现在已经无法弄清恺撒密码在当时有多大的效果,但是有理由相信它是安全的。因为恺撒大部分敌人都是目不识丁的,而其余的则可能将这些消息当作是某个未知的外语。即使有某个敌人获取了恺撒的加密信息,根据现有的记载,当时也没有任何技术能够解决这一最基本、最简单的替换密码。
**算法:**
明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。𝐶=(𝑀+𝑘)𝑚𝑜𝑑26
例如当偏移量是3的时候所有的字母A将被替换成DB变成E以此类推。
![](files/1-3-3.png)
**破解凯撒密码**
由于使用恺撒密码进行加密的语言一般都是字母文字系统,因此密码中可使用的偏移量也是有限的,因此可以通过穷举法,很轻易地进行破解。
>密文Q TQSM BW LZQVS UQTS
>明文I LIKE TO DRINK MILK
![](files/1-3-4.png)
### 小实验
破解一个凯撒密码
密文GR BRXO LNHF UBSWRJUDSKB
凯撒秘密在线分析网站
```
https://planetcalc.com/1434/
```
### 1.4.2 简单替换密码
将明文中所使用的字母替换为另一套字母表,形成新的对应关系。这种替换可以是任意的一对一关系。
例如:现有一个简单替换密码表
![](files/1-3-5.png)
```
明文: crypto
密文: hzkrqb
```
简单替换密码很难通过穷举法来破译。
密钥空间26=26×25×24××3×2×1
**破译简单替换密码**
已知一段密文:
```
UZQSOVUOHXMOPVGPOZPEVSGZWSZOPFPESXUDBMETSXAIZVUEPHZHMDZSHZOWSFPAPPDTSVPQUZWYMXUZUHSXEPYEPOPDZSZUFPOMBZWPFUPZHMDJUDTMOHMQ
```
>有用信息:
>明文使用标准英文书写
>使用简单替换密码
>每个明文字母被唯一的密文字母替代
语言的每个字母都有其自身的特性,这是就像语言的指纹一样
最容易观察出的特性就是字母出现的频率
![](files/1-3-6.png)
- 高频字母可以成为线索
- 低频字母可以成为线索
- 常见的字母组合可以成为线索the , it , here , per 等)
- 密文越长越容易被破解
- 需要加入适当的猜测和推理
我们再次分析密文:
```
UZQSOVUOHXMOPVGPOZPEVSGZWSZOPFPESXUDBMETSXAIZVUEPHZHMDZSHZOWSFPAPPDTSVPQUZWYMXUZUHSXEPYEPOPDZSZUFPOMBZWPFUPZHMDJUDTMOHMQ
```
频率分析:
![](files/1-3-6-2.png)
1. 猜测P Z可能是e和t
2. 统计字母的相对频率-双字母
3. 猜测ZW可能是th因此ZWP可能是the
4. 经过反复猜测、分析和处理,得到明文
>it was disclosed yesterday that several informal but direct contacts have been made with political representatives of the viet cong in moscow
在线进行词频分析网站
```
https://quipqiup.com/
```
### 1.4.3 仿射密码
它的加密函数是$C=(aM+b) mod\space 26$,其中
- 数字对ab为密钥
- a和26互素$gcd(a,26)=1$
- b为小于26的正整数
- 在英文中有26个字母因此是 $mod\space 26$
它的解密函数是$M=a^{1} (Cb)mod\space 26$
解密函数,推导过程如下:
$$\begin{gathered}
C\equiv (aM+b)\space mod\space 26 \\
aM+b\equiv C\space mod\space 26 \\
M\equiv a^{1}(Cb)\space mod\space 26
\end{gathered}$$
$gcd(a,26)=1$ 的原因解密时需要求密钥参数a的逆元。如果a的逆元存在则元素a与模数必须互素。
**实例**
字母A-Z对应的数字
![](files/1-3-7.png)
加密
若密钥对为58即函数中a为5b为8我们使用的是英文字母即m为26
![](files/1-3-7-2.png)
**破解仿射密码**
仿射密码和简单替换密码类似,最后都会形成一个明文字母和密文字母一对一的关系,然而区别在于,仿射密码的对应关系是由加密函数生成的,我们可以通过给定一个已知的明文攻击,求解出仿射方程式。
- 通过对密文进行频率分析确定两个替换关系例如e被替换成了ct被替换成了f
- 将字母转换成数字,模拟加密过程,求方程组:
$2=(a×4+b)mod\space 26$【 e对应数字4被替换成c对应数字2的过程 】
$5=(a×19+b)mod\space 26$【t对应数字19被替换成f对应数字5的过程】
- 得到密钥对21,22
### 小实验
用仿射密码传送一个消息:
offensive time tomorrow morning at ten o'clock
密钥对为7,10
### 1.4.4 Polybius密码
这是一种简单的单码加密法,它将字母表的字母填充在一个正方形中,加上行列编号。
![](files/1-3-9.png)
由于只有25个位置所以去除字母j因为 j 出现的频率低,用 i 来替代,不影响文字的可读性。
明文中的a被替换成11b被替换成12依次类推。
### 1.4.5 摩尔斯电码
![](files/1-3-10.png)
### 1.4.6 PIGPEN密码猪圈密码
![](files/1-3-11.png)
### 1.4.7 跳舞小人
![](files/1-3-12.png)
### 1.4.8 培根密码
由法兰西斯·培根发明的一种隐写术。
第一步:加密时,明文中的每个字母都会转换成一组五个英文字母。其转换依靠下表:
![](files/1-3-13.png)
第二步加密者需使用两种不同字体。准备好一篇包含相同AB字数的假信息后即两种字体分别代表A型和B型。然后假信息中的每个字母按字体来决定其代表“A”还是“B”。
例如:
>密文LOVE
>密钥:对应的转换表
>密码算法普通字体为A斜体为B
>密文载体messages is in the words
>第一步ABABA ABBAB BAABB AABAA
>第二步messages is in the words
### 1.4.9 Hill密码
希尔密码(Hill Cipher)是基于线性代数多重代换密码由Lester S. Hill在1929年发明。
每个字母转换成26进制数字A=0, B=1, C=2...Z=25一串字母当成n维向量跟一个n×n的矩阵相乘再将得出的结果MOD26。
![](./files/1532172224.jpg)
Hill密码的解密
![](./files/1532172225.jpg)
Hill密码证明和求逆主要参考线性代数知识。
对于单表加密法,破译人员可以通过密文频率分析对密文进行破译,有些需要花费很大的耐心,有些则通过工具可以直接破解。总的来说,这种加密方法还是太过于脆弱,下一节 ,我们将使用更复杂的方法让频率分析法失效。
### 1.5 多表置换密码
#### 1.5.1 维吉尼亚密码
维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。
维吉尼亚密码以布莱斯·德·维吉尼亚的名字来命名,然而其真正的发明者是莱昂·巴蒂斯塔·阿尔伯蒂。而维吉尼亚则发明过一种更强大的自动密钥密码。
为了生成密码需要使用表格法。这一表格包括了26行字母表每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的在过程中会不断地变换。
>明文ATTACKATDAWN
>密钥LEMONLEMONLE
>密文LXFOPVEFRNHR
![](files/1-4-1.png)
**破译维吉尼亚密码**
对于维吉尼亚密码,直接的频率分析却并不适用。
由于在维吉尼亚密码中,同一个字母可以被加密成不同的密文,因而简单的频率分析在这里并没有用。
如右图所示,任意截取了一段英文文章,加密后频率分布趋向平滑。
![](files/1-4-2.png)
破译维吉尼亚密码的关键在于它的密钥是循环重复的。如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。
此时我们可以使用IC测试也可以称为一致性索引IC是基于凹凸度量理念。
如果字母完全平滑分布说明密文中每个字母出现的概率相同都为1/26。然而标准英文中字母频率分布不是平滑的因此凹凸度量是密文中字母实际频率与完全平滑频率1/26之差。
![](files/1-4-2-2.png)
若选取的字母为𝛼出现频率为p_𝛼密文总字数为n𝑓𝛼是密文中字母𝛼的个数
MR为完全偏差a~z所有字母的偏差的平方和为
$$MR=\sum_{\alpha =a}^z(p_\alpha -\frac{1}{26})^2$$
进行一定的取舍计算后得到:
$$MP=\sum_{\alpha =a}^zp_\alpha ^2 -0.038$$
IC的定义
$$IC=\frac{\sum_{\alpha =a}^z f_\alpha (f_\alpha -1)}{n(n-1)}$$
单码加密法的IC值大概为0.066对于完全平滑文字其值为0.038如果IC值位于0.038与0.066之间说明加密的密钥长度不同。不同长度的密钥对应不同的IC值。
![](files/1-4-2-3.png)
如果明文中的字母组合重复出现,被关键字加密后,密文也可能包含重复的字母组合,并且间距是密钥长度倍数。
有一段密文如下:
>DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD
- 两个DYDUXRMH的出现相隔了18个字母则密钥的长度是18的约数
- 两个NQD相距20个字母则密钥长度是20的约数
- 最大公约数是2则基本可以判断密钥长度为2
维吉尼亚在线解密网站
```
https://planetcalc.com/2468/
```
#### 1.5.2 ADFGVX 密码
ADFGVX密码是德军在第一次世界大战中使用的栏块密码。事实上它是早先一种密码 ADFGX 的增补版。1918年3月Fritz Nebel上校发明了这种密码并提倡使用。它结合了改良过的Polybius方格替代密码与单行换位密码。这个密码以使用于密文当中六个字母 A, D, F, G, V, X命名。ADFGVX 是被法国陆军中尉 Georges Painvin 所破解的。以古典密码学的标准来说此密码破解的工作是属于格外困难的在这期间Painvin 更因此健康蒙受了严重损伤。他破解的方法是依靠于找到多份开头相同的讯息,这表示说它们是被相同的分解钥匙和移位钥匙加密的。
**加密方式:**
第一步:替换
将25个字母 i / j 视为同一字母任意填充至方格的灰色区域不能重复或缺少用字母所在的行列字母替代原有字母。如b为AAg为GA
![](files/1-4-3.png)
第二步:排列
假设我们需要发送明文讯息 “Attack at once”
替换后的密文为AFADADAFGFDXAFADDFFXGFXF
将得到的密文按密钥的长度进行排列:
![](files/1-4-3-2.png)
第三步:移动
![](files/1-4-3-3.png)
>A:FAXDF
>C:ADDDG
>G:DGFFF
>O:AFAXX
>R:AFAFX
最终得到FAXDF ADDDG DGFFF AFAXX AFAFX
#### 1.5.3 ENIGMA密码机
恩尼格玛密码机在1920年代早期开始被用于商业一些国家的军队与政府也曾使用过它其中的主要使用者是第二次世界大战时的纳粹德国。
![谢尔比乌斯Arthur Scherbius](files/1-4-4.png)
![ENIGMA密码机](files/1-4-4-2.png)
**ENIGMA密码机工作原理**
![](files/1-4-5.png)
- 当键盘上的一个键被按下时相应的密文在显示器上显示然后转子的方向就自动地转动一个字母的位置在示意图中就是转动1/6圈而在实际中 转动1/26圈
- 相当于有26 个替换表的Vigenere加密
![](files/1-4-5-2.png)
为了解决转子转动一圈重复的问题,密码机多增加了几个转子
![](files/1-4-5-3.png)
- ENIGMA里有三个转子不重复的方向个数达到26*26*26 =17576个
- 相当于有17576个替换表的Vigenere密码
**ENIGMA密码机反射器**
ENIGMA密码机反射器的加密与解密过程相同
- 反射器和 转子一样,把某一个字母连在另一个字母上,但是它并不转动。
- 反射器可以使译码的过程和编码的过程完全一 样。
- 反射器从不把输入映射成自身
![](files/1-4-5-4.png)
**ENIGMA密码机连接板**
从26个字母中取出6对进行交换比如A/J, S/O, T/D, B/W, K/F, U/Y
- 选择12个字母的可能性$26!(12!\times 14!)$
- 12个字母组合交换的可能性$(\frac{12!}{6!\times 6!})\times 6!\div 2$
两者相乘,共计:$3.21\times 10^{17}$
另外,三个转子本身还有 17576 种可能性,所以,表的个数约有$3.38\times 10^{17}$
![](files/1-4-5-5.png)
**Enigma曾在13年时间里1926-1939被认为坚不可摧**
**Enigma的密钥管理**
- 算法公开
- 连接板交换6对字符A/L , P/R, T/D, B/W, K/F, O/Y
- 转子的顺序,比如: 2,3,1
- 转子的初始方向Q-C-W
- 密钥保密
- 每月发送当月每天的密钥
- 每条密文使用不同的密钥
- 每条电文的开头是加密的临时密钥,由三个字母重复两次加密而成, 称为indicator
![](files/1-4-5-6.png)
**Enigma的破译波兰人**
- 可证明对于任何的连线变化都不影响循环圈的个数和每个循环圈上字母的个数;
- 尝试所有3 个rotors的初始位置可以得到所有密钥的”fingerprint”即循环圈的个数、每个循环圈上字母的个数:
- 需要操作的次数26 * 26 * 26 17576
- 考虑3个转子交换顺序3!用6台Enigma协作运算
- 建立这样一个档案book of fingerprints用了一年时间
- 1938年, 德国人提升了密码强度
- Enigma密码机另外增加了2个转子: 5*4*3 = 60
- 连接板交换6对字符提升至10对字符
- 波兰人没有足够经费造出足够多的Enigma密码机
- 德国人汉斯-提罗·施密特停止提供情报和密码本
- 1939年4月, 德国撕毁与波兰签订的和平协定,波兰处于战争乌云阴影之中。
- 1939年7月, 波兰人将破译成果展示给英法同行
- 1939年9月, 希特勒下令闪电战入侵波兰,波兰亡国
**Enigma的破译布莱切利公园**
破译小组于1939年在布莱切利公园组建其中的成员包括
- 填字游戏爱好者
- 国际象棋专家
- 语言学家
- 数学家
- 电脑科学家
**Enigma的弱点**
* 过于简单的密钥比如DFG
* 重复使用的密钥比如CIL (cillie), -> silly
* 已知明文攻击(Know plaintext)候选单词crib
- weather report
- Heil Hitler
- Nothing to report
- Seeding, to get cribs
* 明文中的同一个字母在密码中几乎可以变成任意的其它字母,但就是无法成为它本身。
* 过分严格的规定
- 转子的位置不得重复: 如对3个rotor位置, 不是6 ,而是 2
- 连接板上的相邻的字符不得链接
* 其他手段:盟军可以通过间谍偷取密码本
**Enigma的破译图灵的方法**
* Alan Turing(1912-1954)
- 1931年进入剑桥大学提出图灵机模型
- 1933年受聘于GCCS1939进入布莱切利公园
* 图灵认为:波兰的方法依赖密钥的重复,如果德军改变密钥规则怎么办?
* 图灵的方法在候选单词的明文和密文之间找到字母循环圈的特征指纹
![](files/1-4-7.png)
- 根据Enigma的弱点明文中的同一个字母在密码中几乎可以变成任意的其它字母但就是无法成为它本身。因此在破译时我们可以确定A 绝对不会是 AB 绝对不会是 B ...
- 利用这个漏洞,破译者可以先尝试猜测一个可能会出现在密码中的词语或短语,比如德语 “Heil Hitler”希特勒万岁然后把这个词语放在密文中任意的位置上与整段密码进行比对如果发现有重合的字母那就说明该词语与当前的位置不匹配一旦找到了一个没有重复字母的位置那么很有可能那段密码所对应的明文正是 “Heil Hitler”。
- 在确定了至少一组正确的对应字母的前提下,破译者便可以通过假设和推理的方法猜测出一些可能的接线板上的字母配对。由于接线板上的一条接线会将两个字母绑定在一起,因此,如果我们猜测 A 接 B ,而由此却推导出了 C 接 A 的话,那么 A 接 B 的方案就是错的,而且由 A 接 B 所推导出来的一切可能的方案也全部都是错的;当接线板上,一个字母与所有其它字母的配对都被否决后,就说明问题出在转子上。这时,破译者要么更换转子,要么变动转子的位置,要么设定新的转子起始位置,再继续排查下去 ... 这就是破译 “恩尼格玛” 的通用方法。
- 由于人力操作需要耗费大量的时间,英国数学家艾伦·图灵专门设计制造了一台 “炸弹机”Bombe通过电子技术运用上述的排除法来破译 “恩尼格玛”最快的一次仅用了大约20分钟。
### 小结
多表替换加密都具有这样的特征:一个明文字母可映射到多个密文字母,这种加密可以干扰字母频率分析法,通常来说,多表替换密码肯定比单表密码更加安全。尽管加密的方法看上去十分复杂,这并不意味着它就是安全的,解密者会通过多种方式来寻找加密方法的线索,社会工程学就是他们必要技能,他们会想尽一切办法去破译密码。

506
doc/CRYPT-2_流密码.md Normal file
View File

@ -0,0 +1,506 @@
# CRYPT-2 流密码
**author : Odyssey@cyberpeace**
## 知识点
- 流密码的基本概念
- 线性反馈移位寄存器
- m序列的伪随机性
- m序列密码的破译
- 非线性序列
## 学习目标
- 掌握流密码的基本概念;
- 了解常用伪随机性的评价方法;
- 掌握线性移位寄存器的结构与输出序列的伪随机性;
- 熟悉非线性序列的概念与基本产生方法;
- 掌握一种典型流密码,祖冲之密码或 RC4 密码。
## 目录
2.1 流密码的基本概念
2.2 通用伪随机数生成器PRNG
2.3 基于位移寄存器的流密码
2.4 非线性流密码
2.5 常见的流密码
### 2.1 流密码的基本概念
流密码的基本思想:
密钥:$k$
产生一个密钥序列:$z=z_0 z_1...z_i$
明文串:$x=x_0 x_1 x_2…x_i$
加密:$y=y_0 y_1 y_2…=E_{z_0}(x_0)E_{z_1}(x_1)E_{z_2}(x_2)…$
密钥序列发生器f$z_i=f(k,σ_i)$
$σ_i$是加密器中的记忆元件存储器在时刻i的状态f是由密钥$k$和$σ_i$产生的函数。
#### 2.1.1 二元加法流密码
二元加法流密码是目前最为常用的流密码体制其单独加密明文的每一位。它通过将密钥序列S中的每个位与明文位进行异或XOR运算。
我们用 $x_i,y_i,s_i$来分别代表明文、密文和密钥序列中的每一位,$x_i,y_i,s_i∈{0,1}$
加密:$y_i=e_{s_i}$ $x_i≡x_i+s_i\space mod\space 2$
解密:$x_i=d_{s_i}$ $y_i≡y_i+s_i\space mod\space 2$
![](files/2-1-1.png)
#### 2.1.2 XOR运算
逻辑运算之中,除了 AND 和 OR还有一种 XOR 运算,中文称为“异或运算”,用符号 ⊕ 来表示。
两个值相同时返回false0否则返回true1。XOR可以用来判断两个值是否不同。
XOR运算是模2加法$a⊕b≡a+b\space mod\space 2$
![](files/2-1-2.png)
XOR有一个特点如果对一个值连续做两次 XOR会返回这个**值本身**。
第一次XOR𝟏𝟎𝟏𝟎𝟏𝟏𝟏𝟏=𝟎𝟏𝟎𝟏
第二次XOR𝟎𝟏𝟎𝟏𝟏𝟏𝟏𝟏=𝟏𝟎𝟏𝟎
![](files/2-1-2-2.png)
#### 2.1.3 密钥序列
密钥序列的生成是流密码安全性的核心问题,它决定了流密码的安全性。为了让攻击者无法对序列进行猜测,那密钥序列看上去应该是随机的,也就是随机生成数字。
![](files/2-1-3.png)
#### 2.1.4 随机数
**随机数与伪随机数**
- 真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。
- 使用计算机产生真随机数的方法是获取cpu频率与温度的不确定性以及统计一段时间的运算次数每次都会产生不同的值系统时间的误差以及声卡的底噪等。
- 在实际应用中往往使用伪随机数就足够了。这些数列是“似乎”随机的数,实际上它们是通过一个固定的、可以重复的计算方法产生的。计算机或计算器产生的随机数有很长的周期性。它们不真正地随机,因为它们实际上是可以计算出来的,但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。
**随机数的随机性检验可以分为三个标准:**
- 统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中1的数量大致等于0的数量同理“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。
- 密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
- 真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。
#### 2.1.5 OTP一次性密码本
一次性密码本one-time pad缩写为OTP是古典密码学中的一种加密算法。是以随机的密钥key组成明文且只使用一次。
在理论上,此种密码具有完善保密性,是牢不可破的。它的安全性已由克劳德·艾尔伍德·香农所证明。要使用一次性密码本,必须满足一下条件:
- 通过真随机数生成密钥序列
- 每个密钥序列位都只使用一次,也就是和明文等长
- 只有合法的通信方才知道密钥序列,使用后立即销毁
**为什么无法破译**
这里的无法破译指的不是无法暴力破解,而是无法确认破破译后的正确性。
**为什么没有被广泛使用**
- 最大问题在于密钥的配送
- 密钥的保存
- 密钥的同步
- 密钥的生成
### 2.2 通用伪随机数生成器PRNG
伪随机数生成器从一个初始种子值开始通过各种计算得到序列。通常伪随机数序列是递归地执行以下计算得到的:
$$S_0=seed$$
$$S_i+1\equiv f(S_i),i=0,1,...$$
此表达式的一个推广形式就是$S_{i+1}=f(s_i,s_{i-1},s_{i-2},...,s_{i-t})$所示的生成器其中t是一个固定整数。最常见的例子就是线性同余生成器abm都是整型常量
$$S_0=seed$$
$$S_{i+1}\equiv (aS_i+b)\space mod\space m,i=0,1,2,...$$
许多数学测试都验证PRNG序列的统计行为满足随机性检验标准1也就是说它的输出近乎和真随机相同。
#### 2.2.1 破译通用伪随机数生成器PRNG
PRNG的输出序列非常具有随机性那我们是否可以用它来生成我们的密钥序列呢答案是不能已知明文攻击可以轻松算出PRNG的参数从而对加密后的明文进行破解。
定义一个线性同余发生器:
$$S_0=seed$$
$$S_{i+1}\equiv (aS_i+b)\space mod\space m,i=0,1,2,...$$
其中m为100位长 $S_i$,A,B∈{0,1,2,⋯,m1}。模数m是加密方案的一部分是公开已知的。密钥包含A,B以及种子𝑆_0每个值得长度均为100位。此时密钥长度为200位可以抵挡暴力攻击。
若有一段明文 X加密后的密文为 Y $x_i$为明文 X 的二进制表示的位, $s_i$为PRNG输出的$S_i$的二进制表示的位。加密表达式为:
$$y_i\equiv (x_i+s_i)\space mod\space 2$$
根据之前仿射密码破译的经验,我们尝试使用已知明文攻击。
假如现在通过猜测或者是文件固有的头文件信息得到了明文的前300位300/8=37.5个字节那么我们可以利用以下表达式计算密钥序列的前300位
$$s_i\equiv (y_i+x_i)\space mod\space m ,i=1,2,...,300$$
因为m的长度为100那么我们可以得出PRNG的前三个输出符号$S_1=\{s_1,s_2,...,s_{100}\}$了,$S_2\{s_{101},s_{102},...,s_{200}\}$和$S_3=\{s_{201},s_{202},...,s_{300}\}$,得到两组等式:
$$S_2=(AS_1+B)\space mod\space m$$
$$S_3=(AS_2+B)\space mod\space m$$
这是一个基于$Z_m$的线性等式系统拥有两个未知数A和B。但是两个值都是密钥我们可以立即求解该系统得到
$$A\equiv \frac{S_2-S_3}{S_1-S_2}\space mod\space m$$
$$B\equiv \frac{S_1(S_2-S_3)}{S_1-S_2}\space mod\space m$$
在$gcd((S_1-S_2),m\not=1)$的情况下可以得到多个解,因为这个等式系统基于 $Z_m$。然而,在大多数情况下,如果得到已知明文的第四片消息,就可以唯一地检测出密钥。
**例题:**
假设窃密者得到密文串101101011110010和相应的明文串011001111111001得密钥流为110100100001011。进一步假定窃密者还知道密钥流是使用5级线性反馈移位寄存器产生的那么窃密者可分别用密文串中的前10个比特和明文串中的前10个比特建立如下方程
$$
(a_6\space a_7\space a_8\space a_9\space a_{10})=(c_5\space c_4\space c_3\space c_2\space c_1)
\left\{
\begin{matrix}
a_1& a_2& a_3& a_4& a_5 \\
a_2& a_3& a_4& a_5& a_6 \\
a_3& a_4& a_5& a_6& a_7 \\
a_4& a_5& a_6& a_7& a_8 \\
a_5& a_6& a_7& a_8& a_9
\end{matrix}
\right\}
$$
$$
(0\space 1\space 0\space 0\space 0)=\space (c_5\space c_4\space c_3\space c_2\space c_1)
\left\{
\begin{matrix}
1&1&0&1&0 \\
1&0&1&0&0 \\
0&1&0&0&1 \\
1&0&0&1&0 \\
0&0&1&0&0
\end{matrix}
\right\}
$$
$$
\left\{
\begin{matrix}
1&1&0&1&0 \\
1&0&1&0&0 \\
0&1&0&0&1 \\
1&0&0&1&0 \\
0&0&1&0&0
\end{matrix}
\right\}^{-1}=
\left\{
\begin{matrix}
0&1&0&0&1 \\
1&0&0&1&0 \\
0&0&0&0&1 \\
0&1&0&1&1 \\
1&0&1&1&0
\end{matrix}
\right\}
$$
$$
(C_5\space C_4\space C_3\space C_2\space C_1)=(0\space1\space0\space0\space0)
\left\{
\begin{matrix}
0&1&0&0&1 \\
1&0&0&1&0 \\
0&0&0&0&1 \\
0&1&0&1&1 \\
1&0&1&1&0
\end{matrix}
\right\}
$$
$$
(C_5\space C_4\space C_3\space C_2\space C_1)=(1\space 0\space0\space1\space0)
$$
$$a_{i+5}=c_5a_i\oplus c_2a_{i+3}=a_i\oplus a_{i+3}$$
### 2.3 基于位移寄存器的流密码
#### 2.3.1 线性反馈移位寄存器LFSR
一个LFSR由若干时钟存储原件触发器和一个反馈路径有多种情况但只能选择使用一种组成。存储原件的数目给出了LFSR的度。一个拥有m个触发器的LFSR可以称为“度为m”。在每个时钟周期内内部状态位会右移一位并执行XOR计算。
以度m=3为例此时LFSR有三个触发器FF0FF1FF2初始状态s_0,𝑠_1,𝑠_2以及如图的反馈路径。工作方式如下
![](files/2-3-1.png)
#### 2.3.1 线性反馈移位寄存器LFSR
用一个简单的公式来表示这个LFSR的功能
$$s_3\equiv (s_1+s_0\space) mod\space 2$$
$$s_4\equiv (s_2+s_1\space) mod\space 2$$
$$s_5\equiv (s_3+s_2\space) mod\space 2$$
$$⋮$$
$$s_{i+3}\equiv (s_{i+1}+s_i\space) mod\space 2$$
当然这只是在m=3的情况下成立的接下来看一下通用的LFSR
如图显示了一个度为m的LFSR的通用形式。此LFSR拥有m个触发器和m个可能的反馈位置。反馈路径是否启用取决于反馈系数 $p_0,p_1,p_2,...,p_{m-1}$
如果$p_i=1$启用路径对应触发器输出的值加入XOR运算
如果$p_i=0$中断路径对应触发器输出的值不会加入XOR运算
![](files/2-3-1-2.png)
假设某个LFSR初始加载的值为$s_0,s_1,...,s_{m-1}$则LFSR的下一个输出位$s_m$可以表示为:
$$s_m\equiv (s_{m-1}p_{m-1}+...+s_1p_1+s_0p_0)\space mod\space 2$$
同理可推得下一个LFSR输出的计算式
$$s_{i+m}\equiv \sum^{m-1}_{j=0}p_j\times s_{i+j}\space mod\space 2;s_i,p_j\in\{0,1\};i=0,1,2,...$$
线性反馈移位寄存器因其实现简单、速度快、有较为成熟的理论等优点而成为构造密钥流生成器的最重要的部件之一。
由于可重复性出现状态的数量有限所以LFSR的输出序列会周期性重复。并且LFSR可以根据反馈系数的生成不同长度的输出序列LFSR的最大长度与其度m有关$2^m1$
只有设置特定的$(p_0,p_1,...,p_{m-1})$才能得到最大长度的LFSR。
例如同样度m=4
1反馈路径为$(p_3=0,p_2=0,p_1=1,p_0=1)$的LFSR输出序列的周期为$2^4-1=15$
2反馈路径为$(p_3=1,p_2=1,p_1=1,p_0=1)$的LFSR输出序列的周期为5
每个LFSR有一个关联多项式它与决定下一个移入位的函数不同。该多项式与LFSR的数学结果相关。特征式为
$$p(x)=p_nx^n+p_{n-1}x^{n-1}+...+p_ix+1$$
如果$p_i$位的路径打开,那么$p_i=1$否则为0。
事实证明如果LFSR的特征多项式是不可约分的那么LFSR就有一个最大的序列。如果不能约分了且将$p(x)$分为$x^k-1$的最小整数k为$2^n-1$那么多项式的次数n、 𝑝(𝑥)是基本的。
在线性反馈移位寄存器中总是假定$p_0,p_1,...,p_{m-1}$中至少有一个不为0否则$s_{i+m}\equiv 0$这样的话在n个脉冲后状态必然是00…0且这个状态必将一直持续下去。
若只有一个系数不为0设仅有$p_i$为1实际上是一种延迟装置。
一般对于m级线性反馈移位寄存器总是假定$p_i=1$。
流密码的安全性取决于密钥流的安全性,要求密钥流序列有好的随机性,以使密码分析者对它无法预测。也就是说,即使截获其中一段,也无法推测后面是什么。如果密钥流是周期的,要完全做到随机性是困难的。严格地说,这样的序列不可能做到随机,只能要求截获比周期短的一段时不会泄
露更多信息,这样的序列称为伪随机序列。
#### 2.3.2 破译LFSR流密码
由于LFSR是线性关系由其输入输出之间的线性关系来决定。然而在密码体制中线性关系会使密钥变得非常不安全已知明文攻击通过求解可以对其进行破译。
假设攻击者已知一段长度为2m的明文$x_0,x_1,x_2,⋯,x_(2m-1)$,它对应的密文$y_0,y_1,y_2,⋯y_(2m-1)$此时攻击者可以重构开头的2m个密钥序列
$$s_i\equiv x_i+y_i\space mod \space 2;i=0,1,2,...,2m-1$$
由于每个 i 值都会生成不同的等式,因此我们可以得到 i 个等式:
$$i=0,\space s_m\equiv s_{m-1}p_{m-1}+...+s_1p_1+s_0p_0\space mod2$$
$$i=1,\space s_{m+1}\equiv s_mp_{m-1}+...+s_2p_1+s_1p_0\space mod2$$
$$i=2,\space s_{m+2}\equiv s_{m+1}p_{m-1}+...+s_3p_1+s_2p_0\space mod2$$
$$⋮$$
$$i=m-1,\space s_{2m-2}p_{m-1}+...+s_mp_1+s_{m-1}p_0 \space mod2$$
对于这个等式可以使用高斯消去法、矩阵求逆或其他方法来求解此线性等式系统。即使m的值非常大现代计算机仍然能够在较短时间计算求解。
当然这并不代表LFSR无法应用到密码体系中去我们可以通过使用多个LFSR进行组合构建一个健壮的密码体制。
### 2.4 非线性流密码
**非线性密钥流生成器可分解为驱动子系统和非线性组合子系统**
- 驱动子系统常用一个或多个线性反馈移位寄存器来实现
- 非线性组合子系统用非线性组合函数F来实现
为了使密钥流生成器输出的二元序列尽可能复杂应保证其周期尽可能大、线性复杂度和不可预测性尽可能高因此常使用多个LFSR来构造二元序列称每个LFSR的输出序列为驱动序列显然密钥流生成器输出序列的周期不大于各驱动序列周期的乘积因此提高输出序列的线性复杂度应从极大化其周期开始。
二元序列的线性复杂度指生成该序列的最短LFSR的级数最短LFSR的特征多项式称为二元序列的极小特征多项式。
#### 2.4.1 Geffe 序列生成器
Geffe序列生成器由3个LFSR组成其中LFSR2作为控制生成器使用
![](files/2-4-1.png)
当LFSR2输出1时LFSR2与LFSR1相连接当LFSR2输出0时LFSR2与LFSR3相连接。
若设LFSRi的输出序列为$\{a^{(i)}_k\} (i=1,2,3)$,则输出序列{$b_k$}可以表示为
$$b_k=a_k^{(1)}a_k^{(2)}+a_k^{(3)}\overline{a_k^{(2)}}=a_k^{(1)}a_k^{(2)}+a_k^{(3)}a_k^{(2)}+a_k^{(3)}$$
Geffe序列生成器也可以表示为图2.13的形式其中LFSR1和LFSR3作为多路复合器的输入LFSR2控制多路复合器的输出。设LFSRi的特征多项式分别为ni次本原多项式且ni两两互素则Geffe序列的周期为
$$\prod ^{3}_{i=1}(2^{n_i}-1)$$
线性复杂度为
$$(n_1+n_3)n_2+n_3$$
![](files/2-4-1-5.png)
Geffe序列的周期实现了极大化且0与1之间的分布大体上是平衡的。
#### 2.4.2 J-K触发器
J-K触发器如图所示它的两个输入端分别用$J(x_1)$和$K(x_2)$表示,其输出$c_k$不仅依赖于输入,还依赖于前一个输出位$c_{k-1}$,即
$$c_k=\overline{(x_1+x_2)}\space c_{k-1}+x_1$$
![](files/2-4-2-2.png)
在图2.15中,令驱动序列{$a_k$}和{$b_k$}的度分别为m、n则有
$$c_k=\overline{a_k+b_k}\space c_{k-1}+a_k=(a_k+b_k+1)c_{k-1}+a_k$$
如果令$c_{-1}=0$则输出序列的最初3项为
![](files/2-4-2-4.png)
当m与n互素且a0+b0=1时序列{ck}的周期为:(2m-1)(2n-1)
m=2, n=3两个驱动m序列分别为
${a_k}=0,1,1,…$
${b_k}=1,0,0,1,0,1,1,…$
于是,输出序列${c_k}$是
0,1,1,0,1,0,0,1,1,1,0,1,0,1,0,0,1,0,0,1,0,…,
其周期为$(2^2-1)(2^3-1)=21$
由表达式$𝑐_𝑘=(𝑎_𝑘+𝑏_𝑘)\cdot 𝑐_{𝑘1}+𝑎_𝑘$可得
![](files/2-4-2-5.png)
因此,如果知道${c_k}$中相邻位的值$c_{k-1}$和$c_k$,就可以推断出$a_k$和$b_k$中的一个。而一旦知道足够多的这类信息,就可通过密码分析的方法得到序列${a_k}$和${b_k}$。为了克服上述缺点Pless 提出了由多个J-K触发器序列驱动的多路复合序列方案称为Pless 生成器。
#### 2.4.3 Pless生成器
Pless生成器由8个LFSR、4个J-K触发器和1个循环计数器构成由循环计数器进行选通控制假定在时刻t输出第t(mod 4)个单元,则输出序列为
a0b1c2d3a4b5d6
![](files/2-4-3.png)
#### 2.4.4 钟控序列生成器
钟控序列最基本的模型是用一个LFSR控制另外一个LFSR的移位时钟脉冲如图所示。
![](files/2-4-4.png)
假设LFSR1和LFSR2分别输出序列{ak}和{bk}其周期分别为p1和p2。当LFSR1输出1时移位时钟脉冲通过与门使LFSR2进行一次移位从而生成下一位。当LFSR1输出0时移位时钟脉冲无法通过与门影响LFSR2。因此LFSR2重复输出前一位。假设钟控序列{ck}的周期为p可得如下关系
![](files/2-4-4-2.png)
![](files/2-4-4-3.png)
又设{ak}和{bk}的极小特征多项式分别为GF(2)上的m和n次本原多项式f1(x)和f2(x)且m|n。因此p1=2m-1, p2=2n-1。又知w1=2m-1 因此
gcd(w1, p2)=1所以p=p1p2=(2m-1)(2n-1)。
此外,也可推导出{ck}的线性复杂度为n(2m-1),极小特征多项式为
![](files/2-4-4-4.png)
#### 2.4.5 Trivium算法
Trivium算法是一种对称密钥同步序列密码算法。它的设计目的是在计算能力有限的硬件上高效实现安全加密同时兼顾软件实现效率。
Trivium的标准输入为一个80位的密码和一个80位的起始向量IV。和大部分同步序列密码算法一样Trivium的核心组件是一个密码学安全的伪随机数生成器CSPRNG。通过将密码和起始向量加载到该伪随机数生成器中Trivium算法将计算出所需的密钥流。然后通过将明文位依次与密文位进行异或操作计算并输出密文。
Trivium伪随机数生成器可以看作由三个线性反馈移位寄存器组成。它们的长度分别是93、84和111位。寄存器和寄存器之间通过非线性逻辑连接。
寄存器A、B、C的长度分别为93、84和111位加密过程分为两个阶段
![](files/2-4-5.png)
**第一阶段:**
- 将80位的密钥加载到寄存器A的左边并将寄存器A的剩余位以0填充。
- 将80位的IV加载到寄存器B的左边并将寄存器B的剩余位以0填充。
- 将寄存器C的最后三位以1填充并将寄存器C的剩余位以0填充。
- 重复1152次“下一状态算法”中的操作同时并不输出密钥。
**第二阶段:**
使用$X_i$表示上一状态的第 $X$ 个寄存器中的第 $i$ 位使用Xi表示当前状态的第X个寄存器中的第i位使用i ^ j表示i 、j 两位的逻辑异或,使用 i & j表示 i、j 两位的逻辑与,使用:=表示赋值。各个寄存器的第一位以1标记。s表示密钥流。
"s:=s+((C109&C110)^C111^C66)^((A91&A92)^A93^A66)^((B82&B83)^B84^B69)"
将所有寄存器向右移1位,丢弃最后一位,并将空出的首位按照下述规则填充:
"A1:=A69^((C109&C110)^C111^C66)"
"B1:=B78^((A91&A92)^A93^A66)"
"C1:=C87^((B82&B83)^B84^B69)"
### 2.5 常见的流密码
#### 2.5.1 A5/1
A5 / 1是用于在GSM蜂窝电话标准中提供无线通信隐私的流密码。它是为GSM使用指定的七种算法之一。最初是保密的但通过泄漏和逆向工程成为公众的知识。 密码中存在一些严重的弱点。
A5/1算法使用3个线性反馈移位寄存器简称为LFSR。三个寄存器的分别为19位、22位、23位。这里要使用三个共包含64位二进制的线性反馈移位寄存器这个设计绝非偶然。A5/1算法的密钥K也是64位。该密钥用于三个线性反馈移位寄存器的初始填充也就是说该密钥用于充当三个寄存器的初始值。这三个寄存器用密钥填充之后就可以开始生成密钥流了。
![](files/2-5-1.png)
A5 / 1流密码使用三个LFSR。如果一个寄存器的时钟位橙色与其他两个寄存器中的一个或两个的时钟位一致则该寄存器会被时钟控制。
A5 / 1的每个回合步骤可以拆分为取KEY反馈多项式Feedback Polynomial位移
1. 取Key
取三个寄存器的最后一位也就是19位、22位、23位进行XOR操作得到的结果为这一轮Key的一位。
2. 反馈多项式Feedback Polynomial
LFSR进行位移的前置操作具体可以分成两步判定是否需要进行位移判定新的充填的值。
判定是否需要进行位移:
这里使用的是择多原则三个寄存器中选择三个钟控信号19位中的第8位22位23位中皆为第10位两种二进制0,1必定有0或1数量居多居多的寄存器需要进行位移操作。
判定新的充填的值:
这里需要用到反馈多项式:
![](files/2-5-4-2.png)
XOR后得到的值是充填到第0位的值。
3. 位移:
三个寄存器由上一步的判定后进行位移空出第0位用于充填反馈多项式得到的值。
**A5/1的安全性**
在欧洲和美国使用A5 / 1 。A5 / 2是对某些出口地区的算法的有意削弱。A5 / 1是在1987年开发的当时GSM尚未考虑在欧洲以外使用而A5 / 2是在1989年开发的。虽然两者最初都保密但总体设计在1994年泄露算法完全在1999年由Marc Briceno从GSM电话机中逆向工程。2000年大约1.3亿GSM客户依靠A5 / 1来保护其语音通信的机密性; 到2014年为72亿。
爱德华斯诺登在2013年泄露的文件称NSA“可以处理加密的A5 / 1”。
#### 2.5.2 RC4算法
在密码学中RC4来自Rivest Cipher 4的缩写是一种流加密算法RC4是有线等效加密WEP中采用的加密算法也曾经是TLS可采用的算法之一。
由美国密码学家罗纳德·李维斯特Ronald Rivest在1987年设计的。由于RC4算法存在弱点2015年2月所发布的 RFC 7465 规定禁止在TLS中使用RC4加密算法。
RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据而且在加密过程中S盒会变化。
RC4开始时是商业密码没有公开发表出来但是在1994年9月份的时候它被人匿名公开在了Cypherpunks 邮件列表上很快它就被发到了sci.crypt 新闻组上随后从这传播到了互联网的许多站点。随之贴出的代码后来被证明是真实的因为它的输出跟取得了RC4版权的私有软件的输出是完全相同的。由于算法已经公开RC4也就不再是商业秘密了只是它的名字“RC4”仍然是一个注册商标。
密钥序列由两部分算法生成:
- 密钥调度算法KSA
密钥调度算法被用于初始化“S”盒“密钥长度”被定义为密钥中的字节数并且可以在1≤keylength≤256的范围内通常在5和16比特之间对应于密钥长度为40-128 位。
- 初始化长度为256的S盒。第一个for循环将0到255的互不重复的元素装入S盒。第二个for循环根据密钥打乱S盒。
```c
for i from 0 to 255
S[i] := i
end for
j := 0
for( i=0 ; i<256 ; i++)
j := (j + S[i] + key[i mod keylength]) % 256
swap values of S[i] and S[j]
end for
```
下面i,j是两个指针。每收到一个字节就进行while循环。通过一定的算法$((a),(b))$定位S盒中的一个元素并与输入字节异或得到k。循环中还改变了S盒$((c))$。如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文。
```c
i := 0
j := 0
while GeneratingOutput:
i := (i + 1) mod 256 //a
j := (j + S[i]) mod 256 //b
swap values of S[i] and S[j] //c
k := inputByte ^ S[(S[i] + S[j]) % 256]
output K
endwhile
```
#### 2.5.4 破译RC4算法
CR4被广泛用于常用协议中包括有线等效保密WEP用于无线网络的安全算法以及HTTPS的安全套接字层SSL和传输层安全TLS协议事实上在所有TLS流量中约有50%的流量目前在使用RC4算法来保护。
一个256位的RC4密码共有256种可能即$2^{1600}$ 种可能,这样就使得穷举攻击变得不可能。
但是RC4算法不可能从根本上模拟随机数因此仍然存在一定的弱点。例如在第一阶段KSA中KSA永远不会生成某类密钥例如$j=j+1$与$S(j)=1$。事实证明这类密钥的数量是所有可能密钥数的2^(2n)。在256位中28就是256/2^16 。
40比特的RC4密码曾被广泛使用在WEP中然而攻击者通过已知明文攻击借助字典在几分钟之内进行快速破解。
#### 2.5.5 祖冲之密码算法
祖冲之算法集ZUC算法是由我国学者自主设计的加密和完整性算法包括祖冲之算法、加密算法128-EEA3和完整性算法128-EIA3。ZUC算法由3个基本部分组成依次为:1、比特重组2、非线性函数F3、线性反馈移位寄存器(LFSR)。
应用领域4G无线通信、新一代宽带无线移动通信系统LTE国际标准
在2011年9月19日至21日日本福岗召开的第53次第三代合作伙伴计划3GPP系统架构组SA会议上我国祖冲之密码算法ZUC被批准成为新一代宽带无线移动通信系统LTE国际标准。这是我国商用密码算法首次走出国门参与国际标准竞争并取得重大突破。
### 小结
流密码的算法可以分成两种:
- 针对软件设计CR4、SEAL等
- 针对硬件设计基于LFSR算法的A5/1、A5/2、Trivium等
在过去的许多年里,许多流密码已经被认为安全性未知,在一些安全性要求比较高的地方不适合使用。
但流密码仍然具有很多天然优势,尤其是一些存储空间有限、功耗要求苛刻、性能羸弱的硬件应用程序中,流密码仍然被广泛使用。
即使一个伪随机数生成器生成的随机数具有良好的统计学属性,但不一定适用于加密。

409
doc/CRYPT-3_分组密码.md Normal file
View File

@ -0,0 +1,409 @@
# CRYPT-3 分组密码
**author : Odyssey@cyberpeace**
## 目录
3.1 分组密码概述
3.2 分组加密法的模式
3.3 乘积加密法
3.4 DES加密技术
3.5 差分密码分析与线性密码分析
3.6 3DES加密技术
3.7 AES算法
## 3.1 分组密码概述
在今天我们所使用的加密法中,分组加密是最常见的类型。分组加密法每次作用于固定大小的分组(与流密码相反,流密码每次只加密一位)。此外,一个分组的比特数就称为分组长度。
![](files/3-1.png)
## 3.1 分组密码概述
在许多密码系统中单钥分组密码是系统安全的一个重要组成部分用分组密码易于构造伪随机数生成器、流密码、消息认证码MAC和杂凑函数等还可进而成为消息认证技术、数据完整性机制、实体认证协议以及单钥数字签字体制的核心组成部分。实际应用中对于分组密码可能提出多方面的要求除了安全性外还有运行速度、存储量程序的长度、数据分组长度、高速缓存大小、实现平台硬件、软件、芯片、运行模式等限制条件。这些都需要与安全性要求之间进行适当的折中选择。
#### 3.1.1 分组密码的设计原则
**设计的算法应满足下述要求**
① 分组长度n要足够大使分组代换字母表中的元素个数2n足够大防止明文穷举攻击法奏效。
DES、IDEA、FEAL和LOKI等分组密码都采用n=64在生日攻击下用232组密文成功概率为1/2同时要求232×64b=215MB存贮故采用穷举攻击是不现实的。
② 密钥量要足够大(即置换子集中的元素足够多),尽可能消除弱密钥并使所有密钥同等地好,以防止密钥穷举攻击奏效。
但密钥又不能过长,以便于密钥的管理。
DES采用56比特密钥太短了IDEA采用128比特密钥据估计在今后3040年内采用80 比特密钥是足够安全的。
③ 由密钥确定置换的算法要足够复杂,充分实现明文与密钥的扩散和混淆,没有简单的关系可循,能抗击各种已知的攻击,如差分攻击和线性攻击;有高的非线性阶数,实现复杂的密码变换;使对手破译时除了用穷举法外,无其它捷径可循。
④ 加密和解密运算简单易于软件和硬件高速实现。如将分组n化分为子段每段长为8、16或者32。在以软件实现时应选用简单的运算使作用于子段上的密码运算易于以标准处理器的基本运算如加、乘、移位等实现避免用以软件难于实现的逐比特置换。为了便于硬件实现加密和解密过程之间的差别应仅在于由秘密密钥所生成的密钥表不同而已。这样加密和解密就可用同一器件实现。设计的算法采用规则的模块结构如多轮迭代等以便于软件和VLSI快速实现。此外差错传播和数据扩展要尽可能地小。
⑤ 数据扩展尽可能地小。一般无数据扩展,在采用同态置换和随机化加密技术时可引入数据扩展。
⑥ 差错传播尽可能地小。
#### 3.1.2 混淆与扩散
扩散和混淆是由Shannon提出的设计密码系统的两个基本方法目的是抗击攻击者对密码系统的统计分析。
如果攻击者知道明文的某些统计特性,如消息中不同字母出现的频率、可能出现的特定单词或短语,而且这些统计特性以某种方式在密文中反映出来,那么攻击者就有可能得出加密密钥或其一部分,或者得出包含加密密钥的一个可能的密钥集合。
- 混淆Confusion是一种使密钥与密文之间的关系尽可能模糊的加密操作。设计者希望让密文的统计特性与密钥的取值之间的关系尽可能复杂化以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。实现混淆常用的一个元素就是替换这个元素都在DES和AES中都有使用。
- 扩散Diffusion是一种为了隐藏明文的统计属性而将一个明文符号的影响扩散到多个密文符号的加密操作以便在大量的密文中消除明文的统计结构。最简单的扩散元素就是置换它常用于DES中而AES则使用更高级的Mixcolunm操作。
扩散和混淆成功地实现了分组密码的本质属性,因而成为设计现代分组密码的基础。
### 3.2 分组加密法的模式
**什么是模式**
分组密码只能加密固定长度的分组但是我们需要加密的明文长度可能会超过分组密码的分组长度这时就需要对分组密码算法进行迭代以便将一段很长的明文全部加密。这个迭代的方法就称为分组密码的模式mode
在介绍模式前我们引入两个术语:
明文分组($M_n$):指分组密码算法中作为加密对象的明文,明文分组的长度与分组密码算法的分组长度是等长的。
密文分组($C_n$):指使用分组密码算法将明文分组加密之后所生成的密文。
#### 3.2.1 电子编码薄模式ECB
这是分组加密最简单的一种模式,即明文的每一个块加密成密文的每一个块。明文被分为若干块$(M_1,M_2,M_3,M_4, … ,M_n)$,通过加密方法$E_k$,得到密文$(C_1,C_2,C_3,C_4,…,C_n)$,当最后一个明文分组小于分组长度时,需要用一些特定的数据进行填充。
![](files/3-2-1.png)
解密过程也是一次对一个分组解密,而且每次解密都使用同一密钥。
![](files/3-2-1-2.png)
- ECB模式的特点
ECB模式是所有模式中最简单的一种。ECB模式中明文分组与密文分组是一一对应关系因此如果明文中存在多个相同的明文分组则这些明文分组最终都将被转换为相同的 密文分组。这样一来只要观察一下密文就可以知道明文中存在怎么样的重复组合并可以以此为线索来破译密码因此ECB模式是存在一定风险的。
- 对ECB模式的攻击
ECB模式中每个明文分组都是各自独立地进行加密和解密但这其实是一个很大的弱点。假如存在一个攻击者当他作为中间人截获两方的通信时他能够改变密文的分组顺序当接收者对密文进行解密时由于密文分组的顺序被改变了因此相应的明文分组的顺序也被改变了那么接收者实际上是解密出了一段被篡改后的密文。在这种场景中攻击者不需要破译密码也不需要知道分组密码的算法他只需要知道哪个分组记录了什么样的数据。
思考一个模拟的场景:
假设分组的长度为128比特16字节某银行的转账请求数据由以下三个分组构成。
分组1付款人的银行账号
分组2收款人的银行账号
分组3转账金额
此时我们模拟一个转账请求数据从A-5374帐号向B-6671帐号转账1亿元用16进制数据表示
明文分组1=41 2D 35 33 37 34 20 20 20 20 20 20 20 20 20 20 付款人A-5374
明文分组2=42 2D 36 36 37 31 20 20 20 20 20 20 20 20 20 20 收款人B-6671
明文分组3=31 30 30 30 30 30 30 30 30 20 20 20 20 20 20 20 转账金额100000000
接下来攻击者将密文分组1和2的内容进行对调。此时攻击者并不知道分组的具体内容但知道这是付款人信息
明文分组2=42 2D 36 36 37 31 20 20 20 20 20 20 20 20 20 20 收款人B-6671
明文分组1=41 2D 35 33 37 34 20 20 20 20 20 20 20 20 20 20 付款人A-5374
明文分组3=31 30 30 30 30 30 30 30 30 20 20 20 20 20 20 20 转账金额100000000
当银行对信息进行解密时,信息的内容实际上已经发生了改变,付款人的身份和收款人的身份已经被调换了。
这就是ECB模式的最大弱点可以在不破译密文的情况下操纵密文。
#### 3.2.2 密码分组链接模式CBC
这个模式的实现更复杂、更安全因此它是使用最普遍的块加密模式。在这种模式下来自上一块的密文与当前明文块做XOR逻辑运算得到的结果才是加密的位块。
![](files/3-2-2.png)
如果为每个消息传输选取不同的IV那么两个相同的消息即使使用相同的密钥也将有不同的密文。这大大提高了安全性。问题在于接收端如何知道所使用的IV呢
一种方法是在不安全的通道上发送该IV并且该IV只使用一次永不重复。
另外一种方法就是基于唯一数的概念。唯一数是一个唯一的数字永远不重复使用的密钥它不一定非得保密它可以是消息的数目等。用块加密法将唯一数加密后生成IV。如果唯一数附加到密文前面接收端就可以还原IV。
- CBC模式的特点
在CBC模式中我们无法单独对一个中间的明文分组进行加密加入要生成第三组密文那么至少需要凑齐分组1,2,3才行。
观察CBC模式的解密过程我们发现如果加密后的分组C2出现内容错误存储介质故障或者网络传输中的误码等使得一个分组中的0变成了1。那么解密的时候最多只会让2个分组内容受到数据损坏的影响。
![](files/3-2-2-2.png)
但是,如果不是数据出错,而是密文分组中有比特缺失,那么即使丢失一个比特,也会导致密文分组的长度发生变化,后续的分组发生错位,最终导致后面的所有密文分组都会解密出无效的数据。
![](files/3-2-2-3.png)
- 对CBC模式的攻击
1. 比特反转
如果攻击者截获了传递信息在这段信息中包含了初始向量IV根据CBC模式的解密方式我们可以看出如果攻击者对IV中的任意比特进行反转1变为00变为1那么明文中相应的比特位就会发生反转。
![](files/3-2-2-4.png)
- 对CBC模式的攻击
2. 填充提示攻击
填充提示是一种利用分组密码中太难冲部分来进行攻击的方法。在分组密码中当明文长度不为分组长度的整数倍时需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中攻击者会反复发送一段密文每次发送时都对填充内容进行少许修改。由于接收者服务器在无法正确解密时会返回一个错误消息攻击者通过这个错误消息就可以获取一部分与明文相关的信息当然这个方法不仅仅适用于CBC模式而是适用于所有需要进行分组填充的模式。要防御这种攻击就必须验证密文是否是由合法的发送者在知道明文内容的前提下生成的。
#### 3.2.3 密文反馈模式CFB
在CFB模式中前一个密文分组会被送回到密码算法的输入端这里的反馈指的是返回输入端的意思。
在ECB模式和CBC模式中明文分组都是通过密码算法进行加密的然而在CFB模式中明文分组并没有通过密码算法来直接进行加密。
![](files/3-2-3.png)
CFB模式的解密过程如图所示解密算法和加密的算法是相同的因为我们可以将CFB模式看作是一种通过分组密码来实现流加密的方式CFB模式中的密码算法相当于用来生成伪随机数和密文进行XOR运算。通过之前对流密码的学习我们知道流密码的加密解密的算法是相同。
![](files/3-2-3-2.png)
**对CFB模式的攻击**
1. 重放攻击
举一个例子Alice向Bob发送了一条消息这条消息由4个密文分别组成。攻击者将消息的后3个密文分组保存下来第二天Alice又向Bob发送了内容不同的4个密文分组这里我们假设Alice使用的密钥是没有变的。攻击者将昨天保存下来的3个分组分别替换了这段密文的后3个分组。当Bob解密的时候4个分组中只有第一个可以解密成功而第2组就会产生错误然而第3和第4则被替换成了攻击者保存下来的之前使用过的分组Bob仍然可以正常解密。此时第2个分组成为了一个错误的分组但Bob无法确认是网络传输过程中的通信错误还是被人篡改的。
#### 3.2.3 密文反馈模式CFB
![](files/3-2-3-3.png)
#### 3.2.4 输出反馈模式OFB
这个模式使用分组加密法来生成一个密钥流。密钥和块加密法的初始输入启动这个加密过程通过将块加密法的输出加密。解密的过程同样是对初始向量做加密运算将得到的密钥流与密文做XOR运算。
![](files/3-2-4.png)
- CFB模式与OFB模式的对比
OFB模式和CFB模式的区别仅仅在于密码算法的输入。
CFB模式中密码算法的输入是前一个密文分组也就是将密文分组反馈到密码算法中因此就有了“密文反馈模式”这个名字。
OFB模式中密码算法的输入则是密码算法的前一个输出也就是将输出反馈给密码算法因此就有了“输出反馈模式”这个名字。
#### 3.2.5 计数器模式CTR
CTR模式中每个分组对应一个逐次累加的计数器并通过对计数器进行加密来生成密钥流。也就是说最终的密文分组是通过将计数器加密得到的比特流与明文分组进行XOR运算得到的。
![](files/3-2-5.png)
- 计数器的生成方法
每次加密是都会生成一个不同的值nonce来作为计数器的初始值。例如当分组长度为128比特16字节计数器的初始值可能是像这样的形式。
![](files/3-2-5-2.png)
其中前8个字节为nonce这个值在每次加密时必须都是不同的。后8个字节为分组序号这个部分是会在加密的过程中逐次累加的。
66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 01 明文分组1的计数器
66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 02 明文分组2的计数器
66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 03 明文分组3的计数器
66 1F 98 CD 37 A3 8B 4B 00 00 00 00 00 00 00 04 明文分组4的计数器
### 3.3 乘积加密法
**乘积加密法的概念**
1973年 Feistel提出了一种乘积加密法它成为今天所用的对称加密法的体系结构基础。
乘积加密法指的是:顺序地执行两个或多个基本密码系统,使得最后结果的密码强度高于每个基本密码系统产生的结果.
Feistel还提出了实现代换和置换的方法。其思想实际上是Shannon提出的利用乘积密码实现混淆和扩散思想的具体应用。
#### 3.3.1 乘积加密法的结构
![](files/3-3-1.png)
输入是分组长为2𝑤的明文和一个密钥K。将每组明文分成左右两半𝐿_0和𝑅_0 在进行完n轮迭代后左右两半再合并到一起以产生密文分组。其第i轮迭代的输入为前一轮输出的函数
$ L_i = R_{i-1} $
$R_i=L_{i-1} \bigoplus F(R_{i-1},K_i)$
其中,$K_i$是第i轮用的子密钥由加密密钥K得到。通常各轮子密钥彼此不同而且与K也不同。
#### 3.3.2 乘积加密法的解密过程
乘积加密法解密过程本质上和加密过程是一样的算法使用密文作为输入但使用子密钥Ki的次序与加密过程相反即第1轮使用Kn第2轮使用Kn-1……最后一轮使用K1。这一特性保证了解密和加密可采用同一算法。
![](files/3-3-2.png)
在加密过程中:
$LE_{16}=RE_{15}$
$RE_{16}=LE\bigoplus F(RE_{15},K_{16})$
在解密过程中:
$LD_1=RD_0=LE_{16}=RE_{15}$
$RD_1=LD_0 \bigoplus F(RD_0,K_{16})=RE_{16} \bigoplus F(RE_{15},K_{16})$
$=[LE_{15} \bigoplus F(RE_{15},K_{16})] \bigoplus F(RE_{15},K_{16})$
$=LE_{15}$
所以解密过程第1轮的输出为LE15‖RE15等于加密过程第16轮输入左右两半交换后的结果。容易证明这种对应关系在16轮中每轮都成立。一般地加密过程的第i轮有
$LE_i=RE_{i-1}$
$RE_i=LE_{i-1}\bigoplus F(RE_{i-1},K_{i})$
因此
$RE_{i-1}=LE_i$
$LE_{i-1}=RE_i \bigoplus F(RE_{i-1},K_i)=RE_i \bigoplus F(LE_i,K_i)$
#### 3.3.3 乘积加密法的特点
乘积加密法的实现与以下参数和特性有关:
① 分组大小: 分组越大则安全性越高但加密速度就越慢。分组密码设计中最为普遍使用的分组大小是64比特。
② 密钥大小密钥越长则安全性越高但加密速度就越慢。现在普遍认为64比特或更短的密钥长度是不安全的通常使用128比特的密钥长度。
③ 轮数单轮结构远不足以保证安全性但多轮结构可提供足够的安全性。典型地轮数取为16。
④ 子密钥产生算法:该算法的复杂性越大,则密码分析的困难性就越大。
⑤ 轮函数:轮函数的复杂性越大,密码分析的困难性也越大。
在设计乘积加密法Feistel网络还有以下两个方面需要考虑
① 快速的软件实现:在很多情况中,算法是被镶嵌在应用程序中,因而无法用硬件实现。此时算法的执行速度是考虑的关键。
② 算法容易分析:如果算法能被无疑义地解释清楚,就可容易地分析算法抵抗攻击的能力,有助于设计高强度的算法。
### 3.4 DES加密技术
- DES的诞生与谢幕
数据加密标准( data encryption standard, DES 是1977年美国联邦信息处理标准FIPS中所采用的一种对称密码。
它是由美国IBM公司研制的是早期的称作Lucifer密码的一种发展和修改。DES在1975年3月17日首次被公布在联邦记录中经过大量的公开讨论后DES于1977年1月15日被正式批准并作为美国联邦信息处理标准即FIPS-46同年7月15日开始生效。规定每隔5年由美国国家保密局national security agency, NSA作出评估并重新批准它是否继续作为联邦加密标准。
最后的一次评估是在1994年1月美国已决定1998年12月以后将不再使用DES。1997年DESCHALL小组经过近4个月的努力通过Internet搜索了3×1016个密钥找出了DES的密钥恢复出了明文。1998年5月美国EFF(electronics frontier foundation)宣布他们以一台价值20万美元的计算机改装成的专用解密机用56小时破译了56 比特密钥的DES。美国国家标准和技术协会已征集并进行了几轮评估、筛选产生了称之为AES(advanced encryption standard) 的新加密标准。尽管如此DES对于推动密码理论的发展和应用毕竟起了重大作用对于掌握分组密码的基本理论、设计思想和实际应用仍然有着重要的参考价值。
#### 3.4.1 DES算法概述
尽管DES密钥有64位但用户只能定义其中的56位其余的8位由算法提供。分别放在8、16、24、32、40、48、56和64位上。也就是每8位的密钥中包含了用户提供的7位和DES确定的1位这样做是为了让每个8位的块都有奇数个奇偶校验位即1的个数为奇数
![](files/3-4-1.png)
DES的基本结构是由乘积加密算法组成的。它对明文中每一个分组的加密过程都包含16轮且每轮的操作完全相同。每一轮都会使用不同的子密钥每个子密钥ki都是从主密钥k中推导出来的。
![](files/3-4-1-2.png)
#### 3.4.2 DES算法的结构
![](files/3-4-2.png)
![](files/3-4-2-2.png)
根据Feistel算法可知在每一轮中实际是将右半部分Ri送入函数f中函数的输出将与32位的左半部分Li进行XOR运算最后左右交换。
#### 3.4.3 初始置换和逆初始置换
如图所示初始置换IP与逆初始置换IP-1都是按位置换。我们可以简单地想象成一个简单替换密码。例如输入的第58位在置换后映射到第1位。
![](files/3-4-3.png)
如果再取逆初始置换Y=IP-1(X)=IP-1(IP(M)),可以看出,每个比特位的初始顺序将被恢复。
![](files/3-4-3-2.png)
#### 3.4.4 f函数
f函数在DES的安全性中扮演着重要的角色。在第i轮中f函数的输入为前一轮输出的右半部分Ri-1和当前轮子密钥ki。f函数的输出将用来参与XOR运算加密左半部分输入位Li-1。
F函数的结构如图所示
![](files/3-4-3-3.png)
- 将输入分成8个4位的分组然后将每个分组扩展为6位从而将32位的输入扩展为48位。这个过程在E-盒中进行。
- 接着将扩展后的48位与本轮的子密钥ki进行XOR运算将48位拆为8个6位长的分组分别放入8个不同的替换盒中这个替换盒叫S-盒。
- 从S盒中得到32位的输出然后再用置换P进行按位置换。
**E-盒**
E-盒是一种特殊的置换。它需要将32位的比特扩展为48位。
- 将32比特分为8个4位的分组
- 将4位的分组拓展为6位变成8个6位分组
![](files/3-4-4.png)
**S-盒**
S盒是DES的核心它将6位的输入映射为4位的输出为DES提供了非线性特征这意味着即使给定一个输入-输出值的集合也很难预估所有S盒的输出。 尽管NBS/NIST早在1977年就发布DES的完整规范但却从来没有完整披露过S-盒表的选择动机。这个事实引发了人们的很多猜测尤其是关于是否存在只有NSA才能破解的秘密后门的可能性或一些其他故意构造的缺陷。
对每个盒Si其6比特输入中第1个和第6个比特形成一个2位二进制数用来选择Si的4个代换中的一个。6比特输入中中间4位用来选择列。行和列选定后得到其交叉位置的十进制数将这个数表示为4位二进制数即得这一S盒的输出。
**S-盒**
例如S1 的输入为011001行选为01即第1行列选为1100即第12列行列交叉位置的数为9其4位二进制表示为1001所以S1的输出为1001。
S盒的每一行定义了一个可逆代换。
![](files/3-4-4-1.png)
![](files/3-4-4-2.png)
![](files/3-4-4-3.png)
![](files/3-4-4-4.png)
![](files/3-4-4-5.png)
![](files/3-4-4-6.png)
![](files/3-4-4-7.png)
![](files/3-4-4-8.png)
**S-盒的设计准则**
- 每个S-盒都有6个输入位和4个输出位
- 任意一个输出位都不应该太接近于输入位的线性组合
- 如果输入的最高位和最低位都是固定的只有中间的4个位是可变的则每个可能的4位输出值都必须只出现一次。
- 对于S-盒的两个输入如果仅有1位不同则输出必须至少有两位不同。
- 对于S-盒的两个输入,如果只有中间两位不同,则输出必须至少有两位不同。
- 对于S-盒的两个输入,如果开头的两位不同,但最后两位相同,则输出必须不同。
- 对任意有6位非零差分的输入对32对输入中至多有8对有相同的输出差分。
- 8个S-盒对应的32位输出的冲突零输出差异只有在三个相邻的S-盒的情况下才有可能。
**置换P**
32位的输出会根据下表中给出的置换P进行按位置换。与初始置换IP以及逆初始置换IP-1不同置换P将扩散引入到DES中因此每个S-盒的四位输出都会进行置换使得每位在下一轮中会影响多个不同的S-盒。
由扩充带来的扩散、S-盒与置换P可以保证在第五轮结束时每个位都是明文位与密钥位的函数。这种行为称为雪崩效应。
![](files/3-4-4-9.png)
#### 3.4.5 密钥生成
![](files/3-4-5.png)
#### 3.4.5 密钥生成
- 用置换表PC-1进行置换操作同时去除奇偶校验位。
- 将密钥分为C0和D0两个部分并进行左位移循环移位操作生成C1和C2。
- C1和C2根据置换表PC-2再次进行置换操作生成子密钥k1。
- C1和C2进行左位移操作生成C3和C4。
#### 3.4.5 密钥生成
**初始密钥置换PC-1**
在置换表中忽略第8、16、24、32、40、48、56、64位在置换的同时去掉奇偶校验。置换表如下
![](files/3-4-5-2.png)
**移位操作**
得到的56位密钥被分为C0和D0两部分周期性地向左移动一位或者两位即循环移位移动的具体位数则取决于轮数i其规则为
- 当i=1,2,9,16轮时左右两部分向左移动一位
- 当i≠1,2,9,16轮时左右两个部分向左移动两位。
注意:循环移位要么发生在左半部分,要么发生在右半部分。
循环移动位置的总数为$4*1+12*2=28$ 。这将带来一个有趣的属性,即$C_0=C_{16}$和$D_0=D_{16}$ 。
**PC-2**
为了得到48位的子密钥ki左右两部分需要再次根据PC-2进行按位置换。由于Ci和Di共有56位因此PC-2需要忽略其中的8位只置换48位。置换关系如下
![](files/3-4-5-3.png)
#### 3.4.6 DES的解密过程
DES的优势之一就是其解密过程与加密过程在本质上是完全相同的。这主要是因为DES是基本Feistel网络。与加密相同相比解密过程中只有密钥编排逆转了即解密的第一轮需要子密钥16第二轮需要子密钥15依次类推。
#### 3.4.7 DES软件实现与硬件实现
**软件**
最简单直观的软件实现遵循DES描述的数据流按部就班进行实现但是这种方法性能通常较差这主要的是因为很多原子级的DES操作都涉及到位置换尤其是E置换和P置换这会使软件实现变得很慢。为此人们提出了加快DES软件实现的算法通常的思路就是使用一些表这些表里的数据来自一些DES操作预计算的值比如一些S-盒预计算值和置换预计算值。
**硬件**
DES的一个设计标准就是硬件实现效率。类似E置换、P置换、IP置换等操作非常易于使用硬件实现因为它们只需要布线而不需要逻辑、S-盒在硬件实现上也相当简单通常它们是使用布尔逻辑实现的即逻辑门电路平均下来一个S-盒大概需要100个门。
### 课堂实验
**在CAP4软件中实现DES加密**
CAP4中提供了两个版本的DES即标准的DES实现和一个小型版本S-DES。两者操作的方法相同都是先输入明文或密文然后选取Ciphers菜单中DES或S-DES。CAP4中的DES实现还提供了一个评估选项你可以对DES进行两种类型的雪崩条件测试。
### 3.5 差分密码分析与线性密码分析
差分密码分析是迄今已知的攻击迭代密码最有效的方法之一,其基本思想是: 通过分析明文对的差值对密文对的差值的影响来恢复某些密钥比特。
线性密码分析是对迭代密码的一种已知明文攻击,它利用的是密码算法中的“不平衡(有效)的线性逼近”。
#### 3.5.1 差分密码分析
差分密码分析法的基本思想是比较密文与相应的明文之间的差异。基于这些差异就可以对密钥的位进行合理的猜测。差分密码分析在1990被提出理论上它可以破任何分组密码然而事实证明DES的S-盒可以很好地抵抗这种攻击。实际上在差分密码分析被公布后一位参与设计DES密码的研究员透露他们在设计的时候就已经意识到这种攻击的存在据说之所以没有向公众公布S-盒设计标准的原因也在于设计组不想公开差分密码分析这种强大的攻击手段。如果这是真的——当然所有的事实也支持这个说法——这意味着IBM和NSA小组已经领先学术界15年当然在20时机70年代和80年代只有相当少的人还在积极研究密码学。
#### 3.5.1 差分密码分析
对分组长度为n的r轮迭代密码两个n比特串$Y_i$和$Y_i^{*-1}$的差分定义为
$$\Delta Y_i=Y_i \bigotimes Y_i^{*-1}$$
其中$\bigotimes$表示n比特串集上的一个特定群运算$Y_i^{*-1}$表示$Y_i^{*}$在此群中的逆元。
由加密对可得差分序列
$$\Delta Y_{0}, \Delta Y_{1},..., \Delta Y_{r}$$
其中$Y_0$和$Y_0^{*}$是明文对,$Y_i$和$Y_i^{*}$(1≤i≤r)是第i轮的输出它们同时也是第i+1轮的输入。第i轮的子密钥记为$K_i$F是轮函数且$Y_i=F(Y_{i-1}, $K_i$)$。
![](files/3-5-1.png)
对r-轮迭代密码的差分密码分析过程可综述为如下的步骤:
① 找出一个(r-1)-轮特征$\Omega (r-1)=a_0,a_1,...,a_{r-1}$,使得它的概率达到最大或几乎最大。
② 均匀随机地选择明文$Y_0$并计算$Y_0^{*}$,使得$Y_0^{*}$和$Y_0^{*}$的差分为$a_0$,找出$Y_0$和$Y_0^{*}$在实际密钥加密下所得的密文$Y_r$和$Y_r^{*}$。若最后一轮的子密钥$K_r$(或$K_r$的部分比特)有$2^m$个可能值$K_r^j$(1≤j≤2m),设置相应的$2^m$个计数器$\Lambda_j$(1≤j≤2m);用每个$K_r^j$解密密文$K_r$和$Y_r^{*}$,得到$Y_{r-1}$和$Y_{r-1}^{*}$,如果$Y_{r-1}$和$Y_{r-1}^{*}$的差分是$a_{r-1}$,则给相应的计数器$\Lambda_j$加1。
③ 重复步骤②,直到一个或几个计数器的值明显高于其他计数器的值,输出它们所对应的子密钥(或部分比特)。
#### 3.5.2 线性密码分析
设明文分组长度和密文分组长度都为n比特密钥分组长度为m比特。记
明文分组P[1]P[2],…,P[n]
密文分组C[1]C[2]C[n]
密钥分组K[1]K[2]K[m]。
定义:
$$A[i,j,...,k]=A[i]\bigoplus A[j]\bigoplus ... \bigoplus A[k]$$
线性密码分析的目标就是找出以下形式的有效线性方程:
$$P[i_1,i_2,...,i_a]\bigoplus C\bigoplus [j_1,j_2,...,j_b]=K[k_1,k_2,...,k_c]$$
其中1≤a≤n,1≤b≤n,1≤c≤m。
如果方程成立的概率p≠1/2则称该方程是有效的线性逼近。如果|$p- \dfrac{1}{2}$|是最大的,则称该方程是最有效的线性逼近。
设N表示明文数T是使方程左边为0的明文数。如果T>N/2则令
![](files/3-5-2.png)
如果T<N/2则令
![](files/3-5-2-2.png)
从而可得关于密钥比特的一个线性方程。对不同的明文密文对重复以上过程,可得关于密钥的一组线性方程,从而确定出密钥比特。
![](files/3-5-2-3.png)
#### 3.5.3 其他密码分析方法
如何对差分密码分析和线性密码分析进行改进,降低它们的复杂度仍是现在理论研究的热点,目前已推出了很多改进方法,例如,高阶差分密码分析、截段差分密码分析truncated differential cryptanalysis、不可能差分密码分析、多重线性密码分析、非线性密码分析、划分密码分析和差分-线性密码分析再如针对密钥编排算法的相关密钥攻击、基于Lagrange插值公式的插值攻击及基于密码器件的能量分析power analysis另外还有错误攻击、时间攻击、Square攻击和Davies攻击等。

749
doc/CRYPT-4_公钥密码.md Normal file
View File

@ -0,0 +1,749 @@
## CRYPT-4 公钥密码
**author : Odyssey@cyberpeace**
## 知识点
- 公钥密码体制
- 常见公钥密码
## 学习目标
- 掌握公钥密码体制的基本思想
- 掌握公钥密码体制中的数学原理
- 掌握常见公钥密码的加解密原理
- 了解公钥密码体制在信息安全领域的实际应用
## 目录
4.1 公钥密码体制的基本概念
4.2 公钥密码中的数学知识
4.3 RSA密码体制
4.4 基于离散对数的密码体制
4.5 椭圆曲线密码体制
### 4.1 公钥密码体制的基本概念
#### 4.1.1 对称密码与非对称密码
非对称密码与诸如AES或DES的对称算法完全不同。绝对大多数公钥算法都是基于数论函数这点与对称密码大不相同对称密码的目标通常是让输入与输出之间不存在紧凑的数学描述关系。尽管人们常用数学结构来描述对称密码内的小型分组比如AES中的S-盒,但这并不意味着整个密码形成了一个紧凑的数学描述。
在公钥密码体制以前的整个密码学史中,所有的密码算法,包括原始手工计算的、由机械设备实现的以及由计算机实现的,都是基于代换和置换这两个基本工具。而公钥密码体制则为密码学的发展提供了新的理论和技术基础,一方面公钥密码算法的基本工具不再是代换和置换,而是数学函数;另一方面公钥密码算法是以非对称的形式使用两个密钥,两个密钥的使用对保密性、密钥分配、认证等都有着深刻的意义。可以说公钥密码体制的出现在密码学史上是一个最大的而且是惟一真正的革命。
#### 4.1.2 对称密码的一些缺点
- 密钥分配问题:通信双方必须使用信道传输密钥,但是通信信道是不安全的,所以直接在信道上传输密钥这种最简单的密钥分配方式是不可取的。
- 密钥个数即使解决了密钥分配问题我们仍然需要保存和处理大量密钥。在一个拥有n个用户的网路中如果每对用户之间都需要一个单独的密钥对那么网络上的密钥对个数会变成$\frac {n*(n-1)}{2}$ 。
- 缺少对欺骗行为的防御机制。由于通信双方的密钥相同,任意一方都可以伪造另外一方的信息或否认自己发送的信息。
#### 4.1.3 公钥密码解决的问题
公钥密码体制的概念是在解决单钥密码体制中最难解决的这两个问题时提出的。
- 单钥密码体制在进行密钥分配时, 要求通信双方或者已经有一个共享的密钥,或者可籍助于一个密钥分配中心。对第一个要求,常常可用人工方式传送双方最初共享的密钥,这种方法成本很高,而且还完全依赖信使的可靠性。第二个要求则完全依赖于密钥分配中心的可靠性。
- 第二个问题数字签字考虑的是如何为数字化的消息或文件提供一种类似于为书面文件手书签字的方法。
1976年W.Diffie和M.Hellman对解决上述两个问题有了突破从而提出了公钥密码体制。
#### 4.1.4 公钥密码体制的原理
公钥密码算法的最大特点是采用两个相关密钥将加密和解密能力分开,其中一个密钥是公开的,称为公开密钥,简称公开钥,用于加密;另一个密钥是为用户专用,因而是保密的,称为秘密密钥,简称秘密钥,用于解密。因此公钥密码体制也称为双钥密码体制。算法有以下重要特性:
已知密码算法和加密密钥,求解密密钥在计算上是不可行的。
![](files/2018-05-15-11-28-30.png)
<center>公钥体制加密的框图</center>
加密过程有以下几步:
- 要求接收消息的端系统产生一对用来加密和解密的密钥如图中的接收者B产生一对密钥$PK_B$$SK_B$,其中$PK_B$是公开钥,$SK_B$是秘密钥。
- 端系统B将加密密钥如上图中的$PK_B$)予以公开。另一密钥则被保密(图中的$SK_B$)。
- A要想向B发送消息m则使用B的公开钥加密m表示为$c=E_{PKB}[m]$,其中c是密文E是加密算法。
- B收到密文c后用自己的秘密钥$SK_B$解密,表示为$m=D_{SKB}[c]$其中D是解密算法。
### 4.2 公钥密码中的数学知识
#### 4.2.1 公钥密码体制算法条件
- 产生一对密钥是计算可行的
- 已知公钥、明文,产生密文是计算可行的
- 利用私钥、密文,得到明文是计算可行的
- 利用公钥来推断私钥是计算不可行的
- 利用公钥、密文,得到明文是计算不可行的
- 加密和解密的顺序可交换(可选条件)
#### 4.2.2 单向函数
上述条件条件用数学表示即为:
- $y=f(x)$在计算上是容易的
- $x=f^{-1}(y)$在计算上是不可行的
这样的函数我们称为单向函数。
想要理解公钥密码算法,并知道什么样的算法属于单向函数,我们需要学习一些数论知识,包括欧几里得算法、欧拉函数、费马小定理、欧拉定理等。
#### 4.2.3 素数和互素数
**1. 因子**
设$a$$b(b≠0)$是两个整数,如果存在另一整数$m$,使得$a=mb$,则称$b$整除$a$,记为 $b$ | $a$,且称 $b$ 是 $a$ 的因子。
整数具有以下性质:
① $a$ | 1那么 $a=±1$。
② $a$ | $b$ 且 $b$ | $a$,则 $a=±b$。
③ 对任一$b(b≠0)$$b$ | $0$。
④ $b$ | $g$$b$ | $h$,则对任意整数 $m$、$n$ 有 $b$ | $(mg+nh)$。
性质④的证明: 由 $b$ | $g$$b$ | $h$ 知,存在整数$g_1$、$h_1$,使得$g=bg_1$, $h=bh_1$ 所以 $mg+nh=mbg_1+nbh_1=b(mg_1+nh_1)$,因此$b$ | $(mg+nh)$。
**2. 素数**
称整数 $p(p>1)$ 是素数,如果$p$的因子只有±1±p。任一整数 $a(a>1)$ 都能惟一地分解为以下形式:
$$a=p_1\cdot p_2\cdot p_3 ... p_t$$
其中 $p_1<p_2<<p_t$ 是素数$a_i>0 (i=1,…,t)$。例如:
$$91=7\times 11$$ $$11011=7\times 11^2\times 13$$
这一性质称为整数分解的惟一性,也可如下陈述:
设P是所有素数集合则任意整数a (a>1)都能惟一地写成以下形式:
$$a=\prod_{p\in P}{P^{a_p}}$$
其中$a_{p}\geq 0$,等号右边的乘积项取所有的素数,然而大多指数项$a_p$为0。相应地任一正整数也可由非0指数列表表示。
例如: 11011可表示为
${a_7=1, a_{11}=2, a_{13}=1}$,即$11011=2^0\times 3^0\times 5^0 \times 7\times 9^0\times 11^2\times 13$
两数相乘等价于对应的指数相加,即由$k=mn$ 可得:对每一素数$p$, $k_p=m_p+n_p$。而由 $a$ | $b$ 可得: 对每一素数$p$$a_p\leq b_p$。这是因为$p_k$只能被$p_j(j\leq k)$整除。
**3. 互素数**
称 $c$ 是两个整数 $a$、$b$ 的最大公因子,如果
① $c$ 是 $a$ 的因子也是 $b$ 的因子,即 $c$ 是 $a$ 、$b$ 的公因子。
② $a$ 和 $b$ 的任一公因子,也是 $c$ 的因子。
表示为 $c =gcd(a, b)$。
如果 $gcd(a, b)=1$,则称$a$和$b$互素
由于要求最大公因子为正所以gcd(a,b)=gcd(a,-b)=gcd(-a,b)=gcd(-a,-b)。一般gcd(a,b)=gcd(|a|,|b|)。由任一非0整数能整除0可得gcd(a,0)=|a|。如果将ab都表示为素数的乘积则gcda, b极易确定。
例如:
$300=2^2\times 3^1\times 5^2$
$18=2^1\times 3^2$
$gcd(18,300)=2^1\times 3^1\times 5^0=6$
一般由 $c=gcd(a,b)$ 可得:对每一素数 $p$$c_p=min(a_p,b_p)$。
#### 4.2.4 欧几里得算法
然而对于一个大整数而言我们很难去因式分解欧几里得算法提供了一个更有效的算法计算gcd这个算法基于一简单的观察
$gcd(r_0,r_1)=gcd(r_0-r_1,r_1)$
其中,通常假设$r_0 >r_1$,并且两个数均为正整数。此属性的证明非常简单:
假设$gcd(r_0,r_1)=g$由于g可以同时除$r_0$和$r_1$,则可以记作$r_0=g\cdot x$和$r_1=g\cdot y$,其中$x>y$且x和y为互素的整数即它们没有公共因子。此外证明x-y与y互素也非常简单。因此可以得到
$gcd(r_0-r_1,r_1)=gcd(g\cdot (x-y),g\cdot y)=g$
**实例:**
假设$r_0=973$$r_1=301$gcd的计算方式为
步骤|运算
--|--
$973=3\times 301+70$ |$gcd(973,301)=gcd(301,70)$
$301=4\times 70+21$ |$gcd(301,70)=gcd(70,21)$
$70=3\times 21+7$ |$gcd(70,21)=gcd(21.7)$
$21=3\times 7+0$ |$gcd(21,7)=gcd(7,0)=7$
**欧几里得算法伪代码实现**
输入:正整数$r_0$和$r_1$,且$r_0>r_1$
输出:$gcd(r_0,r_1)$
初始化:$i=1$
算法:
>do
>$i=i+1$
>$r_1=r_{i-2}\space mod\space r_{i-1}$
>while $r_i\neq 0$
>return $gcd(r_0,r_1)=r_{i-1}$
当计算到余数$r_i=0$时此算法结束前一轮迭代计算得到的余数就是原始问题的gcd。
即使处理非常长的数字这些数字通常在公钥密码学中使用欧几里得算法依然高效。迭代次数与输入操作数的位数有紧密的关系。这意味着如果一个gcd涉及的数字都是1024位则此gcd的迭代次数就是1024乘以一个常数。几千次迭代的算法在当今PC上很容易实现。
#### 4.2.6 模运算
设n是一正整数a是整数如果用n除a得商为q余数为r
$a=qn+r,0\leq r\leq n,q=\lfloor \frac {a}{n}\rfloor$
$\lfloor \frac {a}{n}\rfloor$表示对$\frac {a}{n}$进行下取整
用 $a\space mod\space n$ 表示余数 $r$,则$a=\lfloor \frac {a}{n}\rfloor n+amodn$。
如果$a\space mod\space n=b\space mod\space n$,则称两整数 $a$ 和 $b$ 模 $n$ 同余,记为$a≡b\space mod\space n$。称与 $a$ 模 $n$ 同余的数的全体为 $a$ 的同余类,记为$[a]$,称 $a$ 为这个同余类的表示元素。
*注意: 如果 $a≡0\space mod\space n$,则 $n$ | $a$*
同余有以下性质:
① 若 $n$ | $(a-b)$,则 $a≡b\space mod\space n$
② $a\space mod\space n≡b\space mod\space n$,则$a≡b\space mod\space n$
③ $a≡b\space mod\space n$,则$b≡a\space mod\space n$
④ $a≡b\space mod\space n$$b≡c\space mod\space n$,则$a≡c\space mod\space n$
从以上性质易知,同余类中的每一元素都可作为这个同余类的表示元素。
求余数运算简称求余运算a mod n将整数a映射到集合{0,1, …,n-1},称求余运算在这个集合上的算术运算为模运算,模运算有以下性质:
① $[(a\space mod\space n)+(b\space mod\space n)] mod\space n=(a+b) mod\space n$。
② $[(a\space mod\space n)-(b\space mod\space n)] mod\space n=(a-b)\space mod\space n$。
③ $[(a\space mod\space n)×(b\space mod\space n)] mod\space n=(a×b)\space mod\space n$。
性质①的证明: 设 $a\space mod\space n=r_a$$b\space mod\space n=r_b$,则存在整数$j$、$k$ 使得 $a=j\cdot n+r_a$$b=k\cdot n+r_b$。
因此
$(a+b)\space mod\space n=[(j+k)n+r_a+r_b]\space mod\space n=(r_a+r_b)\space mod\space n
= [(a\space mod\space n)+(b\space mod\space n)]\space mod\space n$ (证毕)
性质②、③的证明类似。
#### 4.2.7 扩展的欧几里得算法
在讲欧几里得算法的时候我们已经知道两个整数 $r_0$ 和 $r_1$ 的gcd的计算可以通过不断进行迭代地减小操作数来实现。然而事实证明欧几里得算法的主要应用并不在计算gcd。扩展的欧几里得算法可以用来计算模逆元而模逆元在公钥密码学中占有举重若轻的地位。拓展的欧几里得算法除了可以计算gcd外还能计算以下形式的线性组合
$gcd(r_0,r_1)=s\cdot r_0+t\cdot r_1$
其中s和t均表示整型系数。这个等式通常也称为丢番图方程。
这个算法的思路是:执行标准欧几里得算法,但将每轮迭代中的余数$r_i$表示为以下形式的线性组合:
$r_i=s_ir_0+t_ir_i$
如果这个过程成功了,则最后一轮迭代对应的等式为:
$r_i=gcd(r_0,r_1)=s_ir_0+t_ir_1=sr_0+tr_1$
这也意味着最后一个系数$s_i$也是等式所寻找的系数s同时$t_i=t$。
#### 4.2.8 费马小定理和欧拉定理
**费马小定理**
定理:若 $p$ 是素数a是正整数且 $gcd(a, p)=1$,则 $a^{p-1}≡1\space mod\space p$。
若 $n$ 不能整除 $a-b$$x>0$$(x,n)=1$,则$n$也不能整除 $x(a-b)$。$A$ 为所有小于 $p$ 的集($A$ 构成 $p$ 的完全剩余系,即 $A$
中不存在两个数同余 $p$ $B$ 是 $A$ 中所有的元素乘以 $a$ 组成的集合。因为 $A$ 中的任何两个元素之差都不能被 $p$ 整除,所以 $B$ 中的任何两个元素之差也不能被 $p$ 整除。
换句话说,$gcd(a,p)=1$,考虑 $1*a,2*a,3*a,....(p-1)*a$ 共 $(p-1)$ 个数,将它们分别除以 $p$,余数分别为 $r_{1},r_{2},r_{3},....,r_{p-1}$,则集合 ${r1,r2,r3,...,rp-1}$ 为集合 ${1,2,3,...,(p-1)}$ 的重新排列,即 $1,2,3,....,(p-1)$ 在余数中恰好各出现一次;这是因为对于任两个相异 $k*a$ 而言$k=1,2,3,...,(p-1)$其差不是p的倍数所以不会有相同余数且任一个 $k*a$ 亦不为 $p$ 的倍数所以余数不为0
因此
{\displaystyle 1\cdot 2\cdot 3\cdot \dots \cdot (p-1)\equiv (1\cdot a)\cdot (2\cdot a)\cdot \dots \cdot ((p-1)\cdot a){\pmod {p}},} {\displaystyle 1\cdot 2\cdot 3\cdot \dots \cdot (p-1)\equiv (1\cdot a)\cdot (2\cdot a)\cdot \dots \cdot ((p-1)\cdot a){\pmod {p}},}
{\displaystyle W\equiv W\cdot a^{p-1}{\pmod {p}},} W\equiv W\cdot a^{{p-1}}{\pmod {p}},
在这里W=1·2·3·...·(p-1),且(W, p) = 1因此将整个公式除以W即得到
{\displaystyle a^{p-1}\equiv 1{\pmod {p}}} a^{{p-1}}\equiv 1{\pmod {p}}
证明:由前面的讨论知,当 $gcd(a, p)=1$ 时,$a×z_p=z_p$其中a×Zp表示a与Zp中每一元素做模p乘法。又知a×0≡0 mod p所以a×Zp-{0}=Zp-{0}a×(Zp-{0})=Zp-{0}。即
{a mod p,2a mod p,…,(p-1)a mod p}={1,2,…,p-1}
**费马小定理**
所以:
$a×2a××(p-1)a≡[(a mod p)×(2a mod p)×…×$
((p-1)a mod p)] mod p≡(p-1)! mod p
另一方面
$a×2a××(p-1)a=(p-1)!ap-1$
因此
$(p-1)!ap-1≡(p-1)! mod p$
由于(p-1)!与p互素因此(p-1)!有乘法逆元,由乘法可约律得$a_{p-1}\equiv 1 mod p$。(证毕)
费马小定理也可写成如下形式: 设p是素数a是任一正整数则$a_p\equiv a mod p$。
**欧拉函数**
设n是一正整数小于n且与n互素的正整数的个数称为n的欧拉函数记为$\phi (n)$。
例如: $\phi (6)=2$ $\phi (7)=6$ $\phi (8)=4$。
若n是素数则显然有$\phi (n)=n-1$。
定理: 若n是两个素数p和q的乘积则$\phi (n)=\phi (p)× \phi (q)=(p-1)×(q-1)$。
证明:考虑$Z_n={0,1,…,pq-1}$其中不与n互素的数有3类$A={p,2p,…,(q-1)p}$$B={q,2q,…,(p-1)q},C={0}$,且$A∩B=Φ$
否则$ip=jq$,其中$1≤i≤q-1$$1≤j≤p-1$,则$p$是$jq$的因子,因此是$j$的因子,设$j=kp$$k≥1$。则$ip=kpq$$i=kq$,与$1≤i≤q-1$矛盾。
所以$φ(n)=|Zn|-[|A|+|B|+|C|]=pq-[(q-1)+(p-1)+1]$
$=(p-1)×(q-1)=φ(p)×φ(q)$ (证毕)
例如由21=3×7得$\phi (21)=\phi (3)× \phi (7)=2×6=12$。
定理若a和n互素则aφ(n)≡1 mod n。
证明: 设$R=\{x_1, x_2, …, x_{\phi (n)}\}$是由小于n且与n互素的全体数构成的集合$a×R=\{ax_1\space mod\space n, ax_2\space mod\space n,…, ax_{\phi (n)}\space mod\space n\}$,对$a×R$中任一元素$ax_i\space mod\space n$因a与n互素$x_i$与n互素所以$ax_i$与n互素且$ax_i\space mod\space n < n$因此$ax_i mod n\in R$所以$a\times R\subseteq R$。
![](files/2018-05-15-11-40-03.png)
#### 4.2.9 素性检验
素性检验是指对给定的数检验其是否为素数。对于大数的素性检验来说没有简单直接的方法,本节介绍一个概率检验法,为此需要以下引理。
引理: 如果p为大于2的素数则方程$x^2≡1(mod\space p)$的解只有x≡1和x≡-1。
证明:由$x^2≡1\space mod\space p$,有$x^2-1≡0\space mod\space p$$(x+1)(x-1)≡0\space mod\space p$,因此$p|(x+1)$或$p|(x-1)$或 $p|(x+1)$且$p|(x-1)$。
若$p|(x+1)$且$p|(x-1)$,则存在两个整数$k$和$j$,使得$x+1=kp$$x-1=jp$,两式相减得$2=(k-j)p$,为不可能结果。所以有$p|(x+1)$或$p|(x-1)$。
设$p|(x+1)$,则$x+1=kp$,因此$x≡-1(mod\space p)$。
类似地可得 $x≡1(mod\space p)$。(证毕)
引理的逆否命题为:如果方程$x^2≡1\space mod\space p$有一解
$x_0 \notin {-1,1}$那么p不为素数。
例如: 考虑方程$x^2≡1(mod\space 8)$由模乘法的结果得
$1^2≡1 mod 8$, $3^2≡1\space mod\space 8$, $5^2≡1\space mod\space 8$, $7^2≡1\space mod\space 8$
又$5≡-3\space mod\space 8$$7≡-1\space mod\space 8$所以方程的解为1-13-3可见8不是素数。
下面介绍Miller-Rabin的素性概率检测法。首先将n-1表示为二进制形式bkbk-1…b0并给d赋初值1则算法Witness(a,n)的核心部分如下:
```
for i=k downto 0 do
{
x←d;
d←(d×d) mod n;
if d=1 and(x≠1)and(x≠n-1)then return False;
if bi=1 then d←(d×a) mod n
}
if d≠1 then return False;
return True.
```
此算法有两个输入参数n是待检验的数a是小于n的整数。如果算法的返回值为False则n肯定不是素数如果返回值为True则n有可能是素数。
for循环结束后有$d≡a^{n-1}\space mod\space n$由Fermat定理知若n为素数则d为1。因此若d≠1则n不为素数所以返回False。
因为n-1≡-1 mod n所以(x≠1)and(x≠n-1),指$x^2≡1 (mod\space n)$有不在{-1,1}中的根因此n不为素数返回False。
该算法有以下性质: 对s个不同的a重复调用这一算法只要有一次算法返回为False就可肯定n不是素数。如果算法每次返回都为True则n是素数的概率至少为$1-2^{-s}$因此对于足够大的s就可以非常肯定地相信n为素数。
#### 4.2.10 中国剩余定理
中国剩余定理是数论中最有用的一个工具,定理说如果已知某个数关于一些两两互素的数的同余类集,就可重构这个数。
例如Z_{10}中每个数都可从这个数关于2和510的两个互素的因子的同余类重构。比如已知x关于2和5的同余类分别是[0]和[3]即x mod 2≡0x mod 5≡3。可知是偶数且被5除后余数是3所以可得8是满足这一关系的惟一的x。
利用中国剩余定理还可以将大数用小数表示、大数的运算通过小数实现。
例如假设只能处理5以内的数则要考虑15以内的数可将15分解为两个小素数的乘积$15=3\times 5$将1到15之间的数列表示表的行号为0-1列号为0-4将1-15的数填入表中使得其所在行号为该数除3得到的余数列号为该数除5得到的余数。如$12\space mod\space 3=0,12\space mod\space 5=2$所以12应该填在第0行第二列。
$\space$|0|1|2|3|4
-|-|-|-|-|-
0|0|6|12|3|9
1|10|1|7|13|4
2|5|11|2|8|14
例如: 求$12\times 13(mod\space 15)$
因为12和13所在的行号分别为0和112和13所在的列号分别为2和3由$0\times 1\equiv 0\space mod\space 3$;$2\times 3\equiv 1\space mod\space 5$得$12\times 13(mod\space 15)$所在的列号和行号分别为0和1这个位置上的数是6所以得到$12\times 13(mod\space 15)\equiv 6$
又因为$0+1\equiv 1\space mod\space 3$;$2+3\equiv 0\space mod\space 5$第1行、第0列为10所以$12+13\equiv 10\space mod\space 15$
定理4.5(中国剩余定理) 设$m_1,m_2,…,m_k$是两两互素的正整数,$M=$则一次同余方程组
$$
\begin{cases}
a_1(mod \space m_1) \equiv x \\
a_2(mod \space m_2) \equiv x \\
... \\
a_k(mod \space m_k) \equiv x
\end{cases}
$$
对模M有惟一解:
$x\equiv (\frac{M}{m_1}e_1a_1+\frac{M}{m_2}e_2a_2+...+\frac{M}{m_k}e_ka_k)(mod \space M)$
其中$e_i$满足$\frac{M}{m_i}e_i\equiv 1(mod\space m_i)\space(i=1,2,...,k)$
证明:设$M_i=\frac{M}{m_i}=\prod^{k}_{l=1,l\not = i}m_i$,$i=1,2,…,k$,由$M_i$的定义得$M_i$与$m_i$是互素的,可知$M_i$在模$m_i$下有惟一的乘法逆元,即满足$\frac{M}{m_i}e_i\equiv 1(mod\space m_i)$的$e_i$是惟一的。
下面证明对$\forall i\in {1,2,…,k}$上述x满足$a_i(mod\space m_i)\equiv x$。注意到当$j≠i$时,$m_i|M_j$,即$M_j\equiv 0(mod\space m_i)$。所以
$$
(M_j\times e_j\space mod\space m_j)\space mod\space m_i
≡((M_j mod m_i)\times ((e_j\space mod\space m_j)\space mod\space m_i))\space mod\space m_i
≡0
$$
而$(M_i\space (e_i\space mod\space m_i))\space mod\space m_i≡(M_i\times e_i)\space mod\space m_i\equiv 1$
所以$x(mod\space m_i)\equiv a_i$,即$a_i(mod\space m_i)\equiv x$
下面证明方程组的解是惟一的。设$x'$是方程组的另一解,即
$x'\equiv a_i (mod\space m_i)\space (i=1,2,…,k)$
由$x\equiv a_i (mod\space m_i)$得$x'-x\equiv 0(mod\space m_i)$
即$m_i|(x'-x)$。再根据$m_i$两两互素,有$M|(x'-x)$,即$x'-x\equiv 0(mod\space M)$,所以$x'(mod\space M)=x(mod\space M)$。(证毕)
中国剩余定理提供了一个非常有用的特性即在模M下可将非常大的数x由一组小数$(a_1, a_2,…,a_k)$表达。
用中国剩余定理可对数据库文件加密。一个数据库文件由若干数据域组成,将每一数据域看成一个整数,用中国剩余定理可对该文件加密,使得一个用户可解密一个特定的数据域,但无法解密其他数据域。
设数据库文件是$D=<a_1,a_2,...,a_k>$k个用户的解密密钥也称读密钥分别是正整数$m_1,m_2,...,m_k$(两两互素)。设$M=\prod^{k}_{i=1}m_i$则对D的加密过程如下
求与解密密钥$m_1$对应的加密密钥(也称写密钥)$F_i=\frac{M}{m_i}e_i,(i=1,2,...,k)$,其中$e_i$满足$\frac{M}{m_i}e_i\equiv 1(mod\space m_i)$。
D对应的密文为$x\equiv (F_1a_1+F_2a_2+...+F_ka_k)(mod\space M)$
由中国剩余定理知用户i对$x$解密可得$x(mod\space m_i)\equiv a_i$但得不到$a_j(j\not =i)$
#### 4.2.11 公钥密码体制的要求
公钥体制的基本原理是陷门单向函数。
陷门单向函数是满足下列条件的可逆函数f
- 对于任意的x计算y = f (x)是容易的。
- 对于任意的y计算x使得y = f (x)是困难的。
- 存在陷门t已知t时对于任意的y计算x使得y = f (x)则是容易的。
**1大整数分解问题factorization problem**
若已知两个大素数p和q求n = pq是容易的只需一次乘法运算而由n求p和q则是困难的这就是大整数分解问题。
** 2离散对数问题discrete logarithm problem**
给定一个大素数pp-1含另一大素数因子q则可构造一个乘法群它是一个p-1阶循环群。设g是的一个生成元1gp-1。已知x求$y=g^x\space mod\space p$是容易的而已知y、g、p求x使得$y = g^x\space mod\space p$成立则是困难的,这就是离散对数问题。
**3多项式求根问题**
有限域GFp上的一个多项式
$y=f(x)=x^n+a_{n-1}x^{n-1}+...+a_1x+a_0\space mod\space p$
已知$a_0,a_1,...,a_{n-1}$, p和x求y是容易的而已知y,$a_0,a_1,...a_{n-1}$求x则是困难的这就是多项式求根问题。
**4判断Diffie-Hellman问题**
给定素数p令g是的一个生成元。已知$a=g^x$,$b=g^y$,$c=g^z$,判断等式:$z=x^y\space mod\space p$是否成立这就是判断性Diffie-Hellman问题。
**5二次剩余问题quadratic residue problem**
给定一个合数n和整数a判断a是否为mod n的二次剩余这就是二次剩余问题。在n的分解未知时求$x^2=a\space mod\space n$的解也是一个困难问题。
**6背包问题knapsack problem**
给定向量$A=(a_1,a_2,...,a_n)$(a_i为正整数)和$x=(x_1,x_2,...,x_n) (x_i∈{0,1})$,求和式:
$s=f(x)=a_1x_1+a_2x_2+...+a_nx_n$
是容易的而由A和S求x则是困难的这就是背包问题又称子集和问题。
### 4.3 RSA密码体制
![](files/4-3.png)
RSA是1977年由罗纳德·李维斯特Ron Rivest、阿迪·萨莫尔Adi Shamir和伦纳德·阿德曼Leonard Adleman一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
#### 4.3.1 算法描述
**1密钥生成**
① 选取两个保密的大素数p和q。
② 计算$n = p\times q$$\phi (n)=(p-1)(q-1)$其中是n的欧拉函数值。
③ 随机选取整数e满足$1 < e < \phi (n) $ $gcd(e,\phi (n))=1$。
④ 计算d满足。$de\equiv 1\space mod \space \phi (n)$
⑤ 公钥为$(e,n)$,私钥为$(d, n)$。
**2加密**
首先对明文进行比特串分组使得每个分组对应的十进制数小于n然后依次对每个分组m做一次加密所有分组的密文构成的序列即是原始消息的加密结果。即m满足$0≤m< n$则加密算法为
$c=m^e\space mod \space n$
c为密文且 $0 ≤ c < n$
**3解密**
对于密文0≤cn解密算法为
$m=c^d \space mod \space n$
![](files/4-3-1-3.png)
![](files/4-3-1-4.png)
#### 4.3.2 RSA算法中的计算问题
**RSA的加密与解密过程**
RSA的加密、解密过程都为求一个整数的整数次幂再取模。如果按其含义直接计算则中间结果非常大有可能超出计算机所允许的整数取值范围。如上例中解密运算$66^{77} mod 119$先求6677再取模则中间结果就已远远超出了计算机允许的整数取值范围。而用模运算的性质
(a×b) mod n=[(a mod n)×(b mod n)] mod n
就可减小中间结果。
**RSA的加密与解密过程**
再者,考虑如何提高加、解密运算中指数运算的有效性。例如求$x^{16}$直接计算的话需做15次乘法。然而如果重复对每个部分结果做平方运算即求x$x^2$$x^4$$x^8$$x^{16}$则只需4次乘法。
求$a^m$可如下进行其中am是正整数
将m表示为二进制形式$b_k$ $b_{k-1}$…$b_0$,即
$m=b_k2^k+b_{k-1}2^{k-1}+…+b_12+b_0$
因此
![](files/4-3-2.png)
**RSA密钥的产生**
产生密钥时需要考虑两个大素数p、q的选取以及e的选取和d的计算。
因为n=pq在体制中是公开的因此为了防止敌手通过穷搜索发现p、q这两个素数应是在一个足够大的整数集合中选取的大数。如果选取p和q为$10^{100}$左右的大素数那么n的阶为$10^{200}$每个明文分组可以含有664位$10^{200}\approx 2^{664}$即83个8比特字节这比DES的数据分组8个8比特字节大得多这时就能看出RSA算法的优越性了。因此如何有效地寻找大素数是第一个需要解决的问题。
寻找大素数时一般是先随机选取一个大的奇数(例如用伪随机数产生器),然后用素性检验算法检验这一奇数是否为素数,如果不是则选取另一大奇数,重复这一过程,直到找到素数为止。素性检验算法通常都是概率性的,但如果算法被多次重复执行,每次执行时输入不同的参数,算法的检验结果都认为被检验的数是素数,那么就可以比较有把握地认为被检验的数是素数。
可见寻找大素数是一个比较繁琐的工作。然而在RSA体制中只有在产生新密钥时才需执行这一工作。
p和q决定出后下一个需要解决的问题是如何选取满足1<e<φ(n)和gcd(φ(n),e)=1的e并计算满足d·e1 mod φ(n)的d这一问题可由推广的Euclid算法完成
#### 4.3.3 RSA的安全性
RSA的安全性是基于分解大整数的困难性假定之所以为假定是因为至今还未能证明分解大整数就是NP问题也许有尚未发现的多项式时间分解算法。如果RSA的模数n被成功地分解为p×q则立即获得φ(n)=(p-1)(q-1)从而能够确定e模φ(n)的乘法逆元d即d≡e-1 mod φ(n),因此攻击成功。
随着人类计算能力的不断提高原来被认为是不可能分解的大数已被成功分解。例如RSA-129即n为129位十进制数大约428个比特已在网络上通过分布式计算历时8个月于1994年4月被成功分解RSA-130 已于1996年4月被成功分解。RSA-140 已于1999年2月被成功分解RSA-155512比特 已于1999年8月被成功分解得到了两个78位十进制的素数。
对于大整数的威胁除了人类的计算能力外还来自分解算法的进一步改进。分解算法过去都采用二次筛法如对RSA-129的分解。而对RSA-130的分解则采用了一个新算法称为推广的数域筛法该算法在分解RSA130时所做的计算仅比分解RSA-129多10%。将来也可能还有更好的分解算法因此在使用RSA算法时对其密钥的选取要特别注意其大小。估计在未来一段比较长的时期密钥长度介于1024比特至2048比特之间的RSA是安全的。
是否有不通过分解大整数的其他攻击途径?
下面证明由n直接确定φ(n)等价于对n的分解。
设$n=p×q$其中,$p>q$,由φ(n)=(p-1)(q-1),则有
p+q=n-φ(n)+1
以及
![](files/4-3-3.png)
由此可见由p、q确定φ(n)和由φ(n)确定p、q是等价的。
为保证算法的安全性还对p和q提出以下要求
**1$|p-q|$要大**
由$\frac{(p+q)^2}{4}-n=\frac{(p+q)^2}{4}-pq=\frac{(p-q)^2}{4}$,如果|p-q|小,则$\frac{(p-q)^2}{4}$也小,因此$\frac{(p+q)^2}{4}$稍大于n$\frac{p+q}{2}$稍大于$\sqrt{n}$。可得n的如下分解步骤
- 顺序检查大于$\sqrt{n}$的每一整数$x$,直到找到一个$x$使得$x^2-n$是某一整数记为y的平方。
- 由$x^2-n=y^2$,得$n=(x+y)(x-y)$。
**(2)p-1和q-1都应该有大素因子**
这是因为RSA算法存在着可能的重复加密攻击法。设攻击者截获密文c可如下进行重复加密
$c^e\equiv (m^e)^e\equiv m^{e^2}(mod\space n)$
$c^{e^2}\equiv (m^e)^{e^2}\equiv m^{e^3}(mod\space n)$
...
$c^{e^{t-1}}\equiv (m^e)^{e^{t-1}}\equiv m^{e^t}(mod\space n)$
$c^{e^t}\equiv (m^e)^{e^t}\equiv m^{e^{t+1}}(mod\space n)$
若$m^{e^{t+1}}\equiv c(mod\space n)$,即$(m^{e^t})^e\equiv c(mod\space n)$,则
有$m^{e^t}\equiv m(mod\space n)$,即$c^{e^{t-1}}\equiv m(mod\space n)$所以在上述重复加密的倒数第2步就已经恢复出明文m这种攻击法只有在t较小时才是可行的。为了抵抗这种攻击p、q的选取应保证使t很大。
![](files/4-3-3-4.png)
设m在模n下阶为k由$m^{e^t}\equiv (mod n)$
得$m^{e^t-1}\equiv 1(mod\space n)$,所以$k|(e^t-1)$,即$e^t\equiv 1(mod\space k)$t取为满足上式的最小值为e在模k下的阶。又当e与k互素时$t| φ(k)$。为使t大k就应大且$φ(k)$应有大的素因子。
此外,研究结果表明,如果$e < n$$d < n^{\frac{1}{4}}$则d能被容易地确定
#### 4.3.4 对RSA的攻击
RSA存在以下两种攻击并不是因为算法本身存在缺陷而是由于参数选择不当造成的。
**1. 共模攻击**
在实现RSA时为方便起见可能给每一用户相同的模数n虽然加解密密钥不同然而这样做是不行的。
设两个用户的公开钥分别为e1和e2且e1和e2互素一般情况都成立明文消息是m密文分别是
$c_1≡m^{e1}(mod n)$
$c_2≡m^{e2}(mod n)$
敌手截获c1和c2后可如下恢复m。用推广的Euclid算法求出满足
re_1+se_2=1
的两个整数r和s其中一个为负设为r。再次用推广的Euclid算法求出c-11由此得
(c^{-1}_1)^{-r}c^s_2≡m(mod n)。
**2. 低指数攻击**
假定将RSA算法同时用于多个用户为讨论方便以下假定3个然而每个用户的加密指数即公开钥都很小。设3个用户的模数分别为ni (i=1,2,3)当i≠j时gcd(ni,nj)=1否则通过gcd(ni,nj)有可能得出ni和nj的分解。设明文消息是m密文分别是
$c1≡m^3(mod n1)$
$c2≡m^3(mod n2)$
$c3≡m^3(mod n3)$
由中国剩余定理可求出$m^3(mod n1n2n3)$。由于m3<n1n2n3可直接由$m^3$开立方根得到m
### 4.4 基于离散对数的密码体制
上节已经介绍了RSA公钥方案。从中我们可以了解到RSA基于大整数因式分解的难度。整数因式分解问题也称为RSA的单向函数。从前面可知大致来讲如果计算函数$f(x)=y$很容易但计算其逆函数$f^{-1}(y)=x$在计算上却是不可能,则这个函数就可以称为单向函数。
现在的问题是我们能否找到构建非对称密码方案的单向函数。现实证明绝大多数具有实用性的非RSA公钥算法都是基于另一个单向函数即离散对数问题。
#### 4.4.1 ElGamal公钥密码
在密码学中ElGamal加密系统是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。它在1985年由塔希尔·盖莫尔提出。[1]GnuPG和PGP等很多密码学系统中都应用到了ElGamal算法。
ElGamal加密算法可以定义在任何循环群 {\displaystyle G} G上。它的安全性取决于 {\displaystyle G} G上的离散对数难题。
ElGamal加密算法由三部分组成密钥生成、加密和解密。
#### 4.4.2 DiffieHellman密钥交换
**1密钥生成**
- 选取大素数p且要求$p-1$有大素数因子。是一个本原元。
- 随机选取整数$x$,$1≤x≤p-2$,计算$y=g^x\space mod\space p$。
- 公钥为$y$,私钥为$x$。
> p和g是公共参数被所有用户所共享这一点与RSA算法是不同的。另外在RSA算法中每个用户都需要生成两个大素数来建立自己的密钥对这是很费时的工作而ElGamal算法只需要生成一个随机数和执行一次模指数运算就可以建立密钥对。
**2. 加密**
对于明文,首先随机选取一个整数$k$$1\leq k\leq p-2$,然后计算:$c_1=g^k\space mod\space p$$c_2=my^k\space mod\space p$,则密文$c=(c_1,c_2)$。
**3. 解密**
为了解密一个密文$c=(c_1,c_2)$,计算:
$m=\frac{c_2}{c^x_1}mod\space p$
#### 4.4.3 ElGamal的安全性
在ElGamal公钥密码体制中$y=g^x\space mod\space p$。从公开参数g和y求解私钥x需要求解离散对数问题。目前还没有找到一个有效算法来求解有限域上的离散对数问题。因此ElGamal公钥密码体制的安全性是基于有限域上离散对数问题的困难性。为了抵抗已知的攻击p应该选取至少160位以上的十进制数并且p-1至少应该有一个大的素因子。
### 4.5 椭圆曲线公钥密码
椭圆曲线密码学英语Elliptic curve cryptography缩写为 ECC一种建立公开密钥加密的算法基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。
ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射基于Weil对或是Tate对双线性映射已经在密码学中发现了大量的应用例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。
### 4.5.1 实数域上的椭圆曲线
椭圆曲线并非椭圆之所以称为椭圆曲线是因为它的曲线方程与计算椭圆周长的方程相似。一般的椭圆曲线指的是由维尔斯特拉斯Weierstrass方程
$y^2=axy+by=x^3+cx^2+dx+e$
其中abcde是满足某些简单条件的实数。定义中包括一个称为无穷点的元素记为O。下图是椭圆曲线的两个例子。
![](files/2018-05-15-16-26-52.png)
图4-5-1 椭圆曲线的两个例子
从图可见椭圆曲线关于x轴对称。
椭圆曲线上的加法运算定义如下: 如果其上的3个点位于同一直线上那么它们的和为O。
进一步可如下定义椭圆曲线上的加法律(加法法则):
- O为加法单位元即对椭圆曲线上任一点P有P+O=P。
- 设$P_1=(x,y)$是椭圆曲线上的一点, 它的加法逆元定义为$P_2=-P_1=(x,-y)$。
这是因为$P_1$、$P_2$的连线延长到无穷远时得到椭圆曲线上的另一点O即椭圆曲线上的3点$P_1$、$P_2$O共线所以$P_1+P_2+O=O$$P_1+P_2=O$,即$P_2=-P_1$。
由O+O=O还可得O=-O
- 设Q和R是椭圆曲线上x坐标不同的两点Q+R的定义如下 画一条通过Q、R的直线与椭圆曲线交于P1这一交点是惟一的除非所做的直线是Q点或R点的切线此时分别取$P_1=Q$和$P_1=R$)。由$Q+R+P_1=O$得$Q+R=-P_1$。
- 点Q的倍数定义如下 在Q点做椭圆曲线的一条切线设切线与椭圆曲线交于点S定义$2Q=Q+Q=-S$。类似地可定义$3Q=Q+Q+Q+,…,$等。
以上定义的加法具有加法运算的一般性质,如交换律、结合律等。
#### 4.5.2 有限域上的椭圆曲线
密码中普遍采用的是有限域上的椭圆曲线有限域上的椭圆曲线是指曲线方程定义式中所有系数都是某一有限域GF(p)中的元素其中p为一大素数。其中最为常用的是由方程
$y^2\equiv x^3+ax+b(mod\space p)$
$(a,b∈GF(p),4a^3+27b^2(mod\space p)≠0)$
定义的曲线。
#### 4.5.2 有限域上的椭圆曲线
因为$\Delta=(\frac{a}{3})^3+(\frac{b}{2})^2=\frac{1}{108}(4a^3+27b^2)$是方程$x^3+ax+b=0$的判别式,当$4a^3+27b^2=0$时,方程$x^3+ax+b=0$有重根。设为$x_0$,则点$Q_0=(x_0,0)$是方程$y^2=x^3+ax+b$的重根。令$F(x,y)=y^2-x^3-ax-b$,则$\frac{\partial F}{\partial x}|_{Q_0}=\frac{\partial F}{\partial y}|_{Q_0}=0$,所以$\frac{dy}{dx}=-\frac{\partial F}{\partial x}/\frac{\partial F}{\partial y}$在$Q_0$点无定义,即曲线$y^2\equiv x^3+ax+b$在$Q_0$点的切线无定义,因此点$Q_0$的倍点运算无定义。
例: p=23a=b=1$4a^3+27b^2(mod\space 23)\equiv 8≠0$ ,方程为$y^2≡x^3+x+1$其图形是连续曲线由图4-5-1(b)所示。
然而我们感兴趣的是曲线在第一象限中的整数点。设$E_p(a,b)$表示方程所定义的椭圆曲线上的点集$\{(x,y)|0≤x<p,0y<p\}$且x,y均为整数并上无穷远点O本例中$E_23(1,1)$由下表给出表中未给出O
(0,1)|(0,22)|(1,7)|(1,16)|(3,10)|(3,13)|(4,0)|(5,4)|(5,19)
-|-|-|-|-|-|-|-|-|-|-|-
(6,4)|(6,19)|(7,11)|(7,12)|(9,7)|(9,16)|(11,3)|(11,20)|(12,4)
(12,19)|(13,7)|(13,16)|(17,3)|(17,20)|(18,3)|(18,20)|(19,5)|(19,18)
一般来说,$E_p(a,b)$由以下方式产生:
- 对每一x(0≤x<p且x为整数计算$x^3+ax+b(mod\space p)$。
- 决定①中求得的值在模p下是否有平方根如果没有则曲线上没有与这一x相对应的点如果有则求出两个平方根y=0 时只有一个平方根)。
Ep(a,b)上的加法定义如下:
设PQ∈Ep(a,b),则
- P+O=P。
- 如果P=(x,y),那么(x, y)+(x, -y)=O即 (x, -y)是P的加法逆元表示为-P。
由Ep(a,b)的产生方式知,-P也是Ep(a,b)中的点,如上例,$P=(13,7)∈E_{23}(1,1)$-P=(13, -7),而$-7 mod 23≡16$,所以-P=(13, 16),也在$E_{23}(1,1)$中。
- 设$P=(x_1,y_1)$$Q=(x_2,y_2)$P≠-Q则$P+Q=(x_3,y_3)$由以下规则确定:
>$x_3≡λ^2-x_1-x_2(mod p)$
>$y_3≡λ(x_1-x_3)-y_1(mod p)$
其中
$$
\lambda = \begin{cases}
\frac{y_2-y_1}{x_2-x_1}\space P\not=Q \\
\frac{3x^2_1+a}{2y_1}\space P\not=Q
\end{cases}
$$
例: 仍以$E_{23}(1,1)$为例设P=(3,10)Q=(9,7),则
![](files/2018-05-15-20-10-58.png)
所以P+Q=17,20仍为$E_{23}(1,1)$中的点。
若求2P则
![](files/2018-05-15-20-11-28.png)
所以2P=(7,12)。
倍点运算仍定义为重复加法,如
4P=P+P+P+P
从例题看出,加法运算在$E_{23}(1,1)$中是封闭的,且能验证还满足交换律。对一般的$E_p(a,b)$,可证其上的加法运算是封闭的、满足交换律,同样还能证明其上的加法逆元运算也是封闭的,所以$E_p(a,b)$是一个Abel群。
#### 4.5.3 椭圆曲线上的点数
在上一个例题中GF(23)上的椭圆曲线$y^2\equiv x^3+x+1$在第一象限中的整数点加无穷点O共有28个。一般有以下定理
GF(p)上的椭圆曲线$y^2=x^3+ax+b \space (a,b\in GF(p),4a^3+27b^2\not =0)$在第一象限中的整数点加无穷远点O共有
$1+p+\sum_{x\in GF(p)}(\frac{x^3+ax+b}{p})=1+p+\varepsilon $个
其中$(\frac{x^3+ax+b}{p})$是Legendre符号。
定理中的$\varepsilon$由以下定理给出:
Hasse's 定理
$|\varepsilon |\leq 2\sqrt{p}$
Hasse's 定理也称为Hasse's 边界它说明了点的个数大概在素数p的范围内。这个结论具有非常大的实用性。例如需要一个拥有$2^{160}$个元素的椭圆曲线我们必须使用一个长度大约为160位的素数。
#### 4.5.4 明文消息到椭圆曲线上的嵌入
在使用椭圆曲线构造密码体制之前,需要将明文消息嵌到椭圆曲线上,作为椭圆曲线上的点。设明文消息是$m(0\leq m\leq M)$,椭圆曲线$y^2\equiv x^3+ax+b(mod\space p)$$(a,b∈GF(p),4a^3+27b^2(mod\space p)≠0)$k是一个足够大的整数使得将明文消息嵌入到椭圆曲线上时错误率是$2^{-k}$。实际中k可在30到50之间取值。下面取k=30对明文消息m如下计算一系列$x$
$x=\{mk+j,j=0,1,2,...\}={30m,30m+1,30m+2,...}$
直到$x^3+ax+b(mod\space p)$是平方根,即得到椭圆曲线上的点$(x,\sqrt{x^3+ax+b})$。因为在0到p的整数中由一半是模p的平方剩余一班是模p的非平方剩余。所以k次找到$x$,使得$x^3+ax+b(mod\space p)$是平方根的概率不小于$1-2^{-k}$。
反过来为了从椭圆曲线上的点x,y得到明文消息m只需要$m=\llcorner
\frac{x}{30} \lrcorner$
#### 4.5.5 椭圆曲线上的密码
为使用椭圆曲线构造密码体制,需要找出椭圆曲线上的数学困难问题。
在椭圆曲线构成的Abel群$E_p(a,b)$上考虑方程Q=kP其中P$Q∈E_p(a,b)$k<p则由k和P易求Q但由PQ求k则是困难的这就是椭圆曲线上的离散对数问题可应用于公钥密码体制Diffie-Hellman密钥交换和ElGamal密码体制是基于有限域上离散对数问题的公钥体制下面考虑如何用椭圆曲线来实现这两种密码体制
**1. Diffie-Hellman密钥交换**
首先取一素数$p≈2^{180}$和两个参数a、b则得方程$y^2\equiv x^3+ax+b(mod\space p)$表达的椭圆曲线及其上面的点构成的Abel群$Ep(a,b)$。第2步取Ep(a,b)的一个生成元$G(x_1,y_1)$要求G的阶是一个非常大的素数G的阶是满足nG=O的最小正整数n。$E_p(a,b)$和G作为公开参数。
两用户A和B之间的密钥交换如下进行
① A选一小于n的整数nA作为秘密钥并由$P_A=n_AG$产生$E_p(a,b)$上的一点作为公开钥。
② B类似地选取自己的秘密钥$n_B$和公开钥$P_B$。
③ A、B分别由$K=n_AP_B$和K=n_BP_A产生出双方共享的秘密钥。
这是因为$K=n_AP_B=n_A(n_BG)=n_B(n_AG)=n_BP_A$。
攻击者若想获取K则必须由$P_A$和G求出$n_A$,或由$P_B$和G求出$n_B$,即需要求椭圆曲线上的离散对数,因此是不可行的。
**2. ElGamal密码体制**
密钥产生过程: 首先选择一素数p以及两个小于p的随机数g和x计算$y≡g^x\space mod\space p$。以(y, g, p)作为公开密钥x作为秘密密钥。
加密过程: 设欲加密明文消息M随机选一与p-1互素的整数k计算$C_1≡g^k\space mod\space p$,$C_2≡y^kM\space mod\space p$,密文为$C=(C1,C2)$。
解密过程:$M=\frac{C_2}{C_1^x}\space mod \space p$
这是因为:$\frac{C_2}{C_1^x}\space mod\space p=\frac{y^k}{g^{kx}}\space mod\space p=\frac{y^kM}{y^k}\space mod\space p=M\space mod \space p$
**利用椭圆曲线实现ElGamal密码体制**
首先选取一条椭圆曲线,并得$E_p(a,b)$将明文消息m通过编码嵌入到曲线上得点$P_m$,再对点$P_m$做加密变换。
取$E_p(a,b)$的一个生成元G$E_p(a,b)$和G作为公开参数。
用户A选$n_A$作为秘密钥,并以$P_A=n_AG$作为公开钥。任一用户B若想向A发送消息Pm可选取一随机正整数k产生以下点对作为密文
$C_m={kG,P_m+kP_A}$
A解密时以密文点对中的第二个点减去用自己的秘密钥与第一个点的倍乘
$P_m+kP_A-n_AkG=P_m+k(n_AG)-n_AkG=P_m$
攻击者若想由$C_m$得到$P_m$就必须知道k。而要得到k只有通过椭圆曲线上的两个已知点G和kG这意味着必须求椭圆曲线上的离散对数因此不可行。
#### 4.5.6 椭圆曲线密码体制的优点
与基于有限域上离散对数问题的公钥体制如Diffie-Hellman密钥交换和ElGamal密码体制相比椭圆曲线密码体制有如下优点。
1. 安全性高
2. 密钥量小
3. 灵活性好
**安全性**
攻击有限域上的离散对数问题可以用指数积分法,其运算复杂度为$O(exp\sqrt[3]{(log\space p)(log\space log\space p)^2})$其中p是模数为素数。而它对椭圆曲线上的离散对数问题并不有效。目前攻击椭圆曲线上的离散对数问题的方法只有适合攻击任何循环群上离散对数问题的大步小步法其运算复杂度为$O(exp(log\sqrt{p_{max}}))$,其中$p_{max}$是椭圆曲线所形成的Abel群的阶的最大素因子。因此椭圆曲线密码体制比基于有限域上的离散对数问题的公钥体制更安全。
**密钥量小**
由攻击两者的算法复杂度可知,在实现相同的安全性能条件下,椭圆曲线密码体制所需的密钥量远比基于有限域上的离散对数问题的公钥体制的密钥量小。
有限域$GF(q)$一定的情况下,其上的循环群(即$GF(q)-\{0\}$)就定了。而$GF(q)$上的椭圆曲线可以通过改变曲线参数,得到不同的曲线,形成不同的循环群。因此,椭圆曲线具有丰富的群结构和多选择性。
正是由于椭圆曲线具有丰富的群结构和多选择性并可在保持和RSA/DSA体制同样安全性能的前提下大大缩短密钥长度目前160比特足以保证安全性因而在密码领域有着广阔的应用前景。下表给出了椭圆曲线密码体制和RSA/DSA体制在保持同等安全的条件下各自所需的密钥的长度。
RSA/DSA | 512 | 768 |1024 |2048 |21000
- | - | - | - | - | -
ECC | 106 | 132 | 160 | 211 | 600

View File

@ -0,0 +1,618 @@
# CRYPT-5 消息认证和哈希(杂凑)函数
**author : Odyssey@cyberpeace**
## 目录
5.1 消息认证
5.2 消息认证码MAC
5.3 Hash函数
5.4 MD5哈希函数
5.5 安全H哈希算法SHA-1
5.6 基于分组密码与离散对数的哈希函数
### 5.1 消息认证
消息认证的目标是:收到一条消息,希望确保消息在传递的过程中没有被改变
- 根据消息和秘密密钥生成一个短序列位
- 为了验证消息,通信双方将计算相同的位模式,假设他共享相同的密钥
这不一定包括对消息进行加密或签名
- 消息可以以纯文本形式发送,并附加验证码
- 这不是数字签名接收者可以生成相同的MAC
- 可以使用他的私钥对验证者进行加密以产生 数字签名
- 可以加密消息和认证者
第1章曾介绍过信息安全所面临的基本攻击类型包括被动攻击获取消息的内容、业务流分析和主动攻击假冒、重放、消息的篡改、业务拒绝。抗击被动攻击的方法是前面已介绍过的加密本章介绍的消息认证则是用来抗击主动攻击的。消息认证是一个过程用以验证接收消息的真实性的确是由它所声称的实体发来的和完整性未被篡改、插入、删除同时还用于验证消息的顺序性和时间性未重排、重放、延迟。除此之外在考虑信息安全时还需考虑业务的不可否认性即防止通信双方中的某一方对所传输消息的否认。实现消息的不可否认性可通过数字签字数字签字也是一种认证技术它也可用于抗击主动攻击。"
可能的消息认证攻击:
- 内容修改
- 序列修改:修改一系列消息,包括插入,删除,重新排序
- 定时修改:延迟或重播消息
消息认证机制和数字签字机制都需有产生认证符的基本功能这一基本功能又作为认证协议的一个组成部分。认证符是用于认证消息的数值它的产生方法又分为消息认证码MACmessage authentication code和哈希函数hash function两大类
### 5.2 消息认证码MAC
消息认证码是指消息被一密钥控制的公开函数作用后产生的、用作认证符的、固定长度的数值也称为密码校验和。此时需要通信双方A和B共享一密钥K。设A欲发送给B的消息是MA首先计算$MAC=C_K(M)$其中C_K(·)是密钥控制的公开函数然后向B发送M‖MACB收到后做与A相同的计算求得一新MAC并与收到的MAC做比较如图5.1(a)所示。
![](files/6-1-1.png)
### 5.2 消息认证码的定义及使用方式
如果仅收发双方知道K且B计算得到的MAC与接收到的MAC一致则这一系统就实现了以下功能
- 接收方相信发送方发来的消息未被篡改这是因为攻击者不知道密钥所以不能够在篡改消息后相应地篡改MAC而如果仅篡改消息则接收方计算的新MAC将与收到的MAC不同。
- 接收方相信发送方不是冒充的这是因为除收发双方外再无其他人知道密钥因此其他人不可能对自己发送的消息计算出正确的MAC。
#### 5.2.1 消息认证码的定义及使用方式
AC函数与加密算法类似不同之处为MAC函数不必是可逆的因此与加密算法相比更不易被攻破。
上述过程中由于消息本身在发送过程中是明文形式所以这一过程只提供认证性而未提供保密性。为提供保密性可在MAC函数以后(如图5.1(b))或以前(如图5.1(c))进行一次加密而且加密密钥也需被收发双方共享。在图5.1(b)中M与MAC链接后再被整体加密在图5.1(c)中M先被加密再与MAC链接后发送。通常希望直接对明文进行认证因此图5.1(b)所示的使用方式更为常用。
#### 5.2.1 消息认证码的定义及使用方式
![](files/6-1-1-b.png)
![](files/6-1-1-c.png)
#### 5.2.2 产生MAC的函数应满足的要求
使用加密算法单钥算法或公钥算法加密消息时其安全性一般取决于密钥的长度。如果加密算法没有弱点则敌手只能使用穷搜索攻击以测试所有可能的密钥。如果密钥长为k比特则穷搜索攻击平均将进行$2^{k-1}$个测试。特别地对惟密文攻击来说敌手如果知道密文C则将对所有可能的密钥值$K_i$执行解密运算$P_i=D_{Ki}(C)$,直到得到有意义的明文。
对MAC来说由于产生MAC的函数一般都为多到一映射如果产生n比特长的MAC则函数的取值范围即为$2^n$个可能的MAC函数输入的可能的消息个数N>>2n而且如果函数所用的密钥为k比特则可能的密钥个数为$2^k$。如果系统不考虑保密性即敌手能获取明文消息和相应的MAC那么在这种情况下要考虑敌手使用穷搜索攻击来获取产生MAC的函数所使用的密钥。
假定k>n且敌手已得到$M_1$和$MAC_1$,其中$AC_1=C_{K1}(M_1)$,敌手对所有可能的密钥值$K_i$求$MAC_i=C_{Ki}(M_1)$,直到找到某个$K_i$使得$MAC_i=MAC_1$。由于不同的密钥个数为$2^k$,因此将产生$2^k$个MAC但其中仅有$2^n$个不同,由于$2^k>2^n$,所以有很多密钥(平均有$2^k/2^n=2^{k-n}$个)都可产生出正确的$MAC_1$,而敌手无法知道进行通信的两个用户用的是哪一个密钥,还必须按以下方式重复上述攻击:
第1轮 已知$M_1$、$MAC_1$,其中$MAC_1=C_K(M_1)$。对所有$2^k$个可能的密钥计算$MAC_i=C_{Ki}(M_1)$,得$2^{k-n}$个可能的密钥。
第2轮 已知$M_2$、$MAC_2$,其中$MAC_2=C_K(M_2)$。对上一轮得到的$2^{k-n}$个可能的密钥计算$MAC_i=C_{Ki}(M_2)$,得$2^{k-2×n}$个可能的密钥。
如此下去,如果$k=αn$,则上述攻击方式平均需要$α$轮。例如密钥长为80比特MAC长为32比特则第1轮将产生大约248个可能密钥第2轮将产生216个可能的密钥第3轮即可找出正确的密钥。
如果密钥长度小于MAC的长度则第1轮就有可能找出正确的密钥也有可能找出多个可能的密钥如果是后者则仍需执行第2轮搜索。
所以对消息认证码的穷搜索攻击比对使用相同长度密钥的加密算法的穷搜索攻击的代价还要大。然而有些攻击法却不需要寻找产生MAC所使用的密钥。
例如设M=(X1‖X2‖…‖Xm)是由64比特长的分组$X_i(i=1,…,m)$链接得到的,其消息认证码由以下方式得到:
$\varDelta (M)=X_1\oplus X_2\oplus ...\oplus X_m$
$C_K(M)=E_K[\varDelta(M)]$
其中$\oplus$表示异或运算加密算法是电码本模式的DES。因此密钥长为56比特MAC长为64比特如果敌手得到M‖CK(M)那么敌手使用穷搜索攻击寻找K将需做256次加密。然而敌手还可用以下方式攻击系统 将$X_1$到$X_{m-1}$分别用自己选取的$Y_1$到$Y_{m-1}$替换,求出$Ym=Y_1\oplus Y_2\oplus ...\oplus Y_{m-1}\oplus Δ(M)$,并用$Y_m$替换$X_m$。因此敌手可成功伪造一新消息$M'=Y_1...Y_m$且M'的MAC与原消息M的MAC相同。
考虑到MAC所存在的以上攻击类型可知它应满足以下要求其中假定敌手知道函数C但不知道密钥K
① 如果敌手得到M和CK(M)则构造一满足CK(M)=CK(M)的新消息M在计算上是不可行的。
② CK(M)在以下意义下是均匀分布的: 随机选取两个消息M、MPr[CK(M)=CK(M)]=2-n其中n为MAC的长。
③ 若M是M的某个变换即M=f(M)例如f为插入一个或多个比特那么Pr[CK(M)=CK(M)]= 2-n。
第1个要求是针对上例中的攻击类型的此要求是说敌手不需要找出密钥K而伪造一个与截获的MAC相匹配的新消息在计算上是不可行的。第2个要求是说敌手如果截获一个MAC则伪造一个相匹配的消息的概率为最小。最后一个要求是说函数C不应在消息的某个部分或某些比特弱于其他部分或其他比特否则敌手获得M和MAC后就有可能修改M中弱的部分从而伪造出一个与原MAC相匹配的新消息。
#### 5.2.3 数据认证算法
数据认证算法是最为广泛使用的消息认证码中的一个已作为FIPS PublicationFIPS PUB 113并被ANSI作为X9.17标准。
算法基于CBC模式的DES算法其初始向量取为零向量。需被认证的数据消息、记录、文件或程序被分为64比特长的分组D1D2DN其中最后一个分组不够64比特的话可在其右边填充一些0然后按以下过程计算数据认证码见图6.2
![](files/6-1-3.png)
数据认证算法
![](files/6-1-3-2.png)
其中E为DES加密算法K为密钥。
数据认证码或者取为$O_N$或者取为$O_N$的最左M个比特其中16≤M≤64。
### 5.3 Hash函数
Hash函数是一个将任意长度的消息message映射成固定长度消息的函数。
![](files/5-1-1.png)
将h称为一个Hash函数hash function或称为哈希函数、散列函数。对于任何消息x 将h(x)称为x的Hash值、散列值、消息摘要message digest
#### 5.3.1 Hash函数的碰撞collision
设x、x是两个不同的消息如果
h(x)=h(x)
则称x和x是Hash函数h的一个碰撞.
#### 5.3.2 Hash函数的分类
* 单向Hash函数one-way
给定一个Hash值y如果寻找一个消息x使得y=h (x)是计算上不可行的则称h是单向Hash函数.
* 弱抗碰撞Hash函数weakly collision-free
任给一个消息x如果寻找另一个不同的消息x使得h(x) =h(x)是计算上不可行的则称h是弱抗碰撞Hash函数.
* 强抗碰撞Hash函数 strongly collision-free
如果寻找两个不同的消息x和x使得h(x)=h(x)是计算上不可行的则称h是强抗碰撞Hash函数.
#### 5.3.3 安全Hash函数
* 安全Hash函数h应具有以下性质
- 对任意的消息x计算h(x)是容易的;
- h是单向的
- h是弱抗碰撞的或是强抗碰撞的。
#### 5.3.4 Hash函数的安全性
* 对Hash函数的攻击是指寻找一对碰撞消息的过程
* 生日悖论birthday paradox
生日问题假设每个人的生日是等概率的每年有365天在k个人中至少有两个人的生日相同的概率大于1/2问k最小应是多少
k人生日都不同的概率是
$(1-\frac{1}{365})(1-\frac{2}{365}...(1-\frac{k-1}{365})$
k人中至少有2人生日相同的概率为
$p(365,k)=1-(1-\frac{1}{365})(1-\frac{2}{365}...(1-\frac{k-1}{365})$
有P(365,23)=0.5073。即在23个人中至少有两个人生日相同的概率大于0.5,这个数字比人们直观猜测的结果小得多,因而称为生日悖论。
#### 5.3.4 Hash函数的安全性
**生日攻击法**
生日悖论原理可以用于构造对Hash函数的攻击
>设Hash函数值有n个比特m是真消息M是伪造的假消息分别把消息m和M表示成r和R个变形的消息。消息与其变形消息具有不同的形式但有相同的含义。将消息表示成变形消息的方法很多例如增加空格、使用缩写、使用意义相同的单词、去掉不必要的单词等。
#### 5.3.4 Hash函数的安全性
**生日攻击法**
分别把消息m和M表示成r和R个变形的消息
![](files/5-1-2.png)
计算真消息m的变形与假消息M的变形发生碰撞的概率
由于n比特长的散列值共有2n个所以对于给定m的变形mi和M的变形Mjmi与Mj不碰撞的概率是1-1/2n。由于M共有R个变形所以M的全部变形都不与mi碰撞的概率是
$(1-\frac{1}{2^n})^R$
因为消息m共有r个变形因此m的变形与M的变形都不碰撞的概
率是:
$(1-\frac{1}{2^n})^{rR}$
m的变形与M的变形发生碰撞的概率是
$P(n)=1-(1-\frac{1}{2^n})^{rR}\approx1-e^{-\frac{rR}{2^n}}$
当r=R=2n/2时P(n)=1e10.63。对于Hash值长度为64比特的Hash函数生日攻击的时间复杂度约为232所以是不安全的。
>为了抵抗生日攻击建议Hash值长度至少为128 比特
**中间相遇攻击in-the-middle attack**
- 用于攻击一类具有特殊结构的Hash函数
- 分析Hash函数运算的中间值相等的概率
- 讨论一类利用加密变换构造的Hash函数
设加密体制为:
$H=M=\sum^n,E_k:H\times M$ →$\sum^n$
对于消息m=(m1, m2),其散列值的计算分以下两步:
1 h1= EK(m1, IV)
2 d=h(m)=EK (m2, h1)
其中IV是加密变换的初始值。
这类Hash函数将遭受中间相遇攻击。
* 用于攻击一类具有特殊结构的Hash函数
* 分析Hash函数运算的中间值相等的概率
* 讨论一类利用加密变换构造的Hash函数
* 攻击方式: 假设攻击者要找出一个假消息M=(M1, M2)使得M与m是一个碰撞。设m的散列值都为d。攻击者首先产生消息M1的r个变形消息M2的R个变形.
![](files/5-1-2-2.png)
令:$\{M_{1,i}|i=1,2,...,r\},\{M_{2,j}=1,2,...,R\}$
计算:$H_1=\{h_{1,i}=E_K(M_{1,i},IV)|i=1,2,...,r\}$
$H_2=\{h_{2,j}=D_K(M_{2,j}),d|j=1,2,...,R\}$
这里DK是解密变换。假设加密变换EK是随机的那么可以使用生日攻击法来分析集合H1和H2中出现相同元素的概率。
如果集合H1与H2有相同元素例如h1, i= h2, j=DK(M2, j, d)则有d=EK (M2, j, h1,i )即M与m有相同的散列值d。
$h_1=E_k(m_1,IV)$
$d=h(m)=E_k(m_2,h_1)$
#### 5.3.5 Hash函数的迭代构造法
**压缩函数compression function**
$f:\{0,1\}^{m+t}$ →$\{0,1\}^m\space (t\geq 1)$
**迭代技术**
设x是一个长度为L的比特串。重复应用压缩函数f对消息x进行多次压缩最后得到x的散列值
![](files/5-1-3.png)
计算消息x的散列值h(x)的步骤
- 预处理: 用一个公开算法在消息x右方添加若干比特得到比特串y使 得y的长度为t的倍数。即有
$y=x||pad(x)=y_1||y_2||...||y_r$
其中| yi|=t (i =1, 2,…, r)pad(x)称为填充函数。典型的填充函数是先添加x长度| x|的值再添加若干比特例如0
- 迭代过程: 设$H_0=IV$是一个长度为m的初始比特串重复使用压缩函数f依次计算
$Hi= f (H_{i-1}|| y_i) (i=1, 2,…,r)$
- 输出变换: 设g: {0,1}m{0,1}t是一个公开函数
$h(x)=g(H_r)$
- 用上述方法构造的Hash函数称为迭代Hash函数。大多数实用Hash函数都是迭代Hash函数
- 在预处理阶段必须保证变换xy是单射。因为如果预处理变换xy不是单射则存在xx使得y=y从而h(x)=h(x)即能够找到h的碰撞。
- 对于任意无碰撞的压缩函数都可以使用迭代技术构造一个无碰撞的Hash函数。
### 5.4 MD5哈希函数
MD5(MD:message digest,消息摘要)
1990年10月, 著名密码学家R. L. Rivest在MIT(Massachusetts Institute of Technology)提出了一种Hash函数,作为RFC 1320 (RFC:互联网研究和开发机构工作记录)公开发表,称为MD4. MD5是MD4的改进版本, 于1992年4月作为RFC 1321公开发表.
* MD5特性
- 直接构造法: 不依赖任何密码系统和假设条件
- 算法简洁
- 计算速度快
- 特别适合32位计算机软件实现
- 倾向于使用低端结构
#### 5.4.1 MD5算法
MD5算法的输入可以是任意长度的消息x对输入消息按512位的分组为单位进行处理输出128位的散列值MD(x)。整个算法分为五个步骤。
**步骤1: 增加填充位**
- 在消息x右边增加若干比特使其长度与448模512同余。也就是说填充后的消息长度比512的某个倍数少64位。
- 即使消息本身已经满足上述长度要求,仍然需要进行填充。
- 例如若消息长为448则仍需要填充512位使其长度为960位。填充位数在1到512之间。填充比特的第一位是1其它均为0。
**步骤2: 附加消息长度值**
用64位表示原始消息x的长度并将其附加在步骤1所得结果之。若填充前消息长度大于264则只使用其低64位。填充方法是把64比特的长度分成两个32比特的字低32比特字先填充高32比特字后填充。
步骤1与步骤2一起称为消息的预处理
- 经预处理后原消息长度变为512的倍数
- 设原消息x经预处理后变为消息
$Y=Y_0Y_1...Y_{L-1}$
其中$Y_i(i =0,1,...,L-1)$是512比特
在后面的步骤中将对512比特的分组$Y_i$进行处理
假设消息为:
x=“abcde”=01100001 01100010 01100011 01100100 01100101=$(61 62 63 64 65)_{16}$,|x|=40=$(28)_16$
在x的右边填充1个“1”和407个“0”将x变成448比特的$x_1$:
$x_1$= $x$ || 1 || 0 (407个)
= $x$ || 800000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
=61626364 65800000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000
$x$=“abcde”=01100001 01100010 01100011 01100100 01100101=(61 62 63 64 65)16, |x|=40=(28)16
处理后的比特串为16进制表示
$x_2=x_1||28$(64位)
=61626364 65800000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 28000000 00000000
**步骤3初始化MD缓冲区**
- MD5算法的中间结果和最终结果都保存在128位的缓冲区里缓冲区用4个32位的寄存器表示。
- 4个缓冲区记为A、B、C、D其初始值为下列32位整数16进制表示
>A=67 45 23 01
>B=EF CD AB 89
>C=98 BA DC FE
>D=10 32 54 76
- 上述初始值以小端格式存储(字的最低有效字节存储在低地址位置 )为:
>字A=01 23 45 67
>字B=89 AB CD EF
>字C=FE DC BA 98
>字D=76 54 32 10
**步骤4压缩函数**
以512位的分组(16个字)为单位处理消息
- MD5是迭代Hash函数, 其压缩函数为:
$H_{MD5}:\{0,1\}^{128+512}$ → $\{0,1\}^{128}$
步骤4是MD5算法的主循环它以512比特作为分组重复应用压缩函数$H_MD5$从消息Y的第一个分组$Y_1$开始,依次对每个分组$Y_i$进行压缩,直至最后分组$Y_{L-1}$然后输出消息x的Hash值。可见MD5的循环次数等于消息Y中512比特分组的数目L。
**MD5压缩函数$H_{MD5}$**
$H_{MD5}:\{0,1\}^{128+512}$ → $\{0,1\}^{128}$
- $H_{MD5}$由四轮处理组成
- 加法是指缓冲区中的4个字与$CV_i$中对应的4个字分别模232相加
![](files/5-2-1.png)
$H_{MD5}$的四轮处理过程的算法结构相同每一轮要对缓冲区ABCD进行16次迭代每次迭代的运算形式为:
$a←b+L^s(a+g(b,c,d)+X[k]+T[i])$
其中a、b、c、d分别为缓冲区A、B、C、D中的字运算结束后再将a、b、c、d循环右移一个字。
![](files/5-2-1-2.png)
* $H_{MD5}$的基本逻辑函数g
- 每一轮使用一个基本逻辑函数g每个基本逻辑函数的输入是三个32位的字输出是一个32位的字它执行位逻辑运算即输出的第n位是其三个输入的第n位的函数
- 基本逻辑函数g的定义符号$\wedge$、$\vee$和$-$分别表示逻辑操作AND、OR、NOT和XOR
|轮数|基本逻辑函数g|g(b,c,d)|
|-|-|-|
|1|F(b,c,d)|$(b\wedge c)\vee (\overline b \wedge d)$|
|2|G(b,c,d)|$(b\wedge d)\vee (c \wedge \overline d)$|
|3|H(b,c,d)|$b\oplus c\oplus d$|
|4|I(b,c,d)|$c\oplus (b\wedge \overline d)$|
$H_MD5$的基本逻辑函数g
基本逻辑函数g的真值表
![](files/5-2-1-3.png)
- 字组X
把当前处理的512比特的分组Yi依次分成16个32比特的字, 分别记为X[0,1,…,15].
- 在每一轮的16步迭代中, 每一步迭代使用一个字,迭代步数不同使用的字也不相同. 因此, 16步迭代恰好用完16个字。
* 对于不同轮处理过程, 使用16个字的顺序不一样.
- 第一轮中使用顺序为X[0,1,…,15]。
- 第二轮中使用顺序由下列置换确定:
$\rho_2(i)= (1+5i)\space mod\space 16$
- 第三轮中使用顺序由下列置换确定:
$\rho_3(i)= (5+3i)\space mod\space 16$
- 第四轮中使用顺序由下列置换确定:
$rho_4(i)= 7i\space mod\space 16$
* 例如第三轮处理过程的第i步迭代使用字
$X[\rho_3(i)]=X[(5+3_i)\space mod\space 16]$
第8步迭代使用字
$X[\rho_3(8)]=X[(5+3\times 8)]=X[29]=X[23]$
* 常数表T64个32位常数
- $T[i] =2^{32}\times abs(sin(i))$的整数部分(i=1,2,…,64)
![](files/5-2-1-4.png)
* 常数表T的作用是“随机化”32位的输入数据即消除输入数据的规律性。
* HMD5的第k轮处理过程使用常数表T的元素
$T[16(k-1)+1, 16(k-1)+2,…,16k] (k=1,2,3,4)$
第k轮的第i次迭代使用元素
$T[16(k-1)+ i](i=1,2,…,16)$
循环左移位数s
$L^s(v)$表示对32位的变量v循环左移s位。s的值与轮数和迭代步数有关。
|步数 \\ 轮数|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|
|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
|1|7|12|17|22|7|12|17|22|7|12|17|22|7|12|17|22|
|2|5|9|14|20|5|9|14|20|5|9|14|20|5|9|14|20|
|3|4|11|16|23|4|11|16|23|4|11|16|23|4|11|16|23|
|4|6|10|15|21|6|10|15|21|6|10|15|21|6|10|15|21|
**步骤5: 输出**
依次对消息的L个512比特的分组进行处理第L个分组处理后的输出值即是消息x的散列值MD(x)。
可将MD5的处理过程归纳如下
- $CV_0=IV$
- $CV_{i+1}=SUM_{32}[CV_i, RF_I(Y_i,RF_H(Y_i,RF_G(Y_i,RF_F(Y_i,CV_i))) )] (i=0,1,…,L-1)$
- $MD=CV_{L-1}$
- $IV$=第三步定义的缓冲区ABCD的初值
- L =消息经第一步和第二步处理后分组的个数
- $Y_i$ =消息的第i个512位分组
- $RF_u$ =使用基本逻辑函数u的轮函数
- $SUM_{32}$=对输入字的模232相加
- MD =散列值
### 5.4.2 MD5的安全性
* Rivest猜测MD5可能是128位Hash函数中强度最大的。
* 目前对MD5的攻击已取得以下结果
- T. Berson1992已经证明对单轮的MD5算法利用差分密码分析可以在合理的时间内找出散列值相同的两条消息。这一结果对MD5四轮运算的每一轮都成立。但是目前尚不能将这种攻击推广到具有四轮运算的MD5上.
- B. Boer和A. Bosselaers1993说明了如何找到消息分组和MD5两个不同的初始值,使它们产生相同的输出. 也就是说, 对一个512位的分组, MD5压缩函数对缓冲区ABCD的不同值产生相同的输出,这种情况称为伪碰撞pseudo-collision.目前尚不能用该方法成功攻击MD5算法.
* 目前对MD5的攻击已取得以下结果(续)
- H. Dobbertin1996找到了MD5无初始值的碰撞(pseudo-collision).给定一个512位的分组,可以找到另一个512位的分组,对于选择的初始值IV0,它们的MD5运算结果相同. 到目前为止, 尚不能用这种方法对使用MD5初始值IV的整个消息进行攻击.
- 我国山东大学王小云教授2004提出的攻击对MD5最具威胁。对于MD5的初始值IV王小云找到了许多512位的分组对它们的MD5值相同.
- 国际密码学家Lenstra利用王小云等提供的MD5碰撞伪造了符合X.509标准的数字证书.
* MD5算法抗密码分析能力较弱,对MD5的生日攻击所需代价为264数量级. 所以, 必须设计新的Hash算法, 使其与MD5相比具有更长的散列值和更高的安全性.
### 5.5 安全Hash算法SHA-1
安全Hash算法SHAsecure hash algorithm由美国标准与技术研究所NIST设计并于1993年作为联邦信息处理标准FIPS 180发布
修改版于1995年发布FIPS 180-1通常称之为SHA-1。该标准称为安全Hash函数。
RFC 3174也给出了SHA-1它基本上是复制FIPS 180-1的内容但增加了C代码实现。
SHA-1算法的输入是长度小于264的任意消息x输出160位的散列值。
#### 5.5.1 SHA-1算法步骤
SHA-1处理消息的过程与MD5类似对输入消息按512位的分组为单位进行处理整个算法分为五个步骤
**步骤1: 增加填充位**
在消息右边增加若干比特使其长度与448模512同余。即使消息本身已经满足上述长度要求仍然需要进行填充。填充位数在1到512之间。填充比特的第一位是“1”其它均为“0”。
**步骤2: 附加消息长度值**
用64位表示原始消息x的长度并将其附加在步骤1所得结果之后。
- 步骤1与步骤2一起称为消息的预处理
经预处理后原消息长度变为512的倍数。设原消息x经预处理后变为消息$Y=Y_0 Y1… Y_{L-1}$,其中$Y_i(i =0,1,…,L-1)$是512比特。在后面的步骤中将对512比特的分组$Y_i$进行处理。
**步骤3: 初始化缓冲区**
SHA-1算法的中间结果和最终结果保存在160位的缓冲区里缓冲区用5个32位的寄存器表示。5个缓冲区记为A、B、C、D、E其初始值为下列32位整数16进制表示
>A=67 45 23 01
>B=EF CD AB 89
>C=98 BA DC FE
>D=10 32 54 76
>E=C3 D2 E1 F0
其中前4个初始值与MD5的初始值相同。SHA1以大端格式存储缓冲区的值即字的最高有效字节存于低地址字节位置。因此上述初始值存储为十六进制
>字A=67 45 23 01
>字B=EF CD AB 89
>字C=98 BA DC FE
>字D=10 32 54 76
>字E=C3 D2 E1 F0
- 步骤4: 以512位的分组16个字为单位处理消息
SHA-1是迭代Hash函数其压缩函数为
$H_{SHA}:\{0,1\}^{160+512}→\{0,1\}^{160}$
- 步骤4是SHA-1算法的主循环它以512比特作为分组重复应用压缩函数HSHA从消息Y的第一个分组$Y_1$开始,依次对每个分组$Y_i$进行压缩直至最后分组Y_{L-1}然后输出消息x的Hash值。
SHA-1循环次数等于消息Y中512比特分组的数目L。
**SHA-1的压缩函数$H_{SHA}$**
* 由四轮处理组成
* 加法是模232相加
<aside class="left">
<img src="./files/5-3-1.png" alt="" height="400" >
</aside>
- 压缩函数HSHA的四轮处理过程的算法结构相同每一轮要对缓冲区ABCDE进行20次迭代每次迭代的运算形式为
$A,B,C,D,E\space ←\space (E+f(B,C,D)+L^5(A)+W_t+K_t),A,L^{30}(B),C,D$
其中A、B、C、D、E分别为五个缓冲区中的字运算结束后再将A、B、C、D、E循环右移一个字。
![](files/5-3-1-2.png)
* 基本逻辑函数f
- 每一轮使用一个基本逻辑函数f每个基本逻辑函数的输入是三个32位的字输出是一个32位的字它执行位逻辑运算即输出的第n位是其三个输入第n位的函数。
|轮数|基本逻辑函数f|f(B,C,D)|
|-|-|-|
|1|$f_1(B,C,D)$|$(B\wedge C)\vee (\overline B \wedge D)$|
|2|$f_2(B,C,D)$|$B\oplus C \oplus D$|
|3|$f_3(B,C,D)$|$(B\wedge C)\vee (B \wedge D)\vee (C\wedge D)$|
|4|$f_4(B,C,D)$|$B\oplus C \oplus D$|
* 基本逻辑函数f
- 基本逻辑函数f的真值表
![](files/5-3-1-3.png)
* 字组$W_t$
- t0≤t≤79代表迭代步数依次表示第一、二、三、四轮处理过程进行的迭代次序
- $W_t(0≤t≤79)$是32比特的字它的前面16个字$W_0,W_1,…,W_{15}$依次取自当前输入分组$Y_i$,其余字为
$W_t=L^1(W_{t-16}\oplus W_{t-14}\oplus W_{t-3})\space (t=16,17,...79)$
加法常数表$K_t$
|迭代步数|十六进制|十进制|
|-|-|-|
|$0\leq t \leq 19$|5A827999|[$2^{30}\times \sqrt{2}$]|
|$20\leq t \leq 39$|6ED9EBA1|[$2^{30}\times \sqrt{3}$]|
|$40\leq t \leq 59$|8F1BBCDC|[$2^{30}\times \sqrt{5}$]|
|$60\leq t \leq 79$|CA62C1D6|[$2^{30}\times \sqrt{10}$]|
**步骤5: 输出**
- 第L个分组处理后的输出值即是消息x的散列值MD(x)
- SHA-1的处理过程归纳如下
+ $CV_0=IV$
+ $CV_{i+1}=SUM_{32}(CV_i, ABCDE_i ) (i=0,1,…, L-1)$
+ $MD= CV_{L-1}$
- 其中:
+ IV =第三步定义的缓冲区ABCDE的初值
+ $ABCDE_i$ =处理第i个消息分组时最后一轮的输出
+ L =消息经第一步和第二步处理后分组的个数
+ SUM_{32}=对输入字的模$2^{32}$相加
+ MD =散列值
#### 5.5.2 SHA-1和MD5的比较
* SHA-1与MD5的算法类似所以它们的性质极为相似
* 抗穷举攻击的能力
- SHA1抗穷举攻击的能力比MD5强
- 用穷举攻击方法产生具有给定散列值的消息
+ MD5需要的代价为2128数量级
+ SHA1需要的代价为2160数量级
- 用穷举攻击方法产生两个具有相同散列值的消息
+ MD5需要的代价为264数量级
+ SHA1需要的代价为280数量级
* 抗密码分析的能力
- MD5算法抗密码分析的能力较弱
- SHA1算法抗密码分析的能力似乎并不弱
* 速度
SHA-1执行的速度比MD5的速度慢得多
* 简洁性
SHA-1和MD5两种算法都易于描述和实现不需要使用大的程序和置换表
* 数据的存储方式
MD5使用little-endian方式SHA-1使用big-endian方式。这两种方式没有本质的差异
### 5.6 基于分组密码与离散对数的Hash函数
**Hash函数的间接构造法**
- 利用已有的密码算法构造Hash函数
- 如果密码算法是安全的那么利用它所构造的Hash函数也是安全的
#### 5.6.1 利用分组密码算法构造Hash函数
**已知条件**
设$E_k$是一个分组长度为n的分组密码的加密算法密钥为k对于任意的消息x首先对x进行分组每组的长度为n。设消息x为:
$x=x_1 x_2…x_L$,
其中$x_i\in GF(2)^n\space (1\leq i\leq L)$
**基于分组密码CBC工作模式构造Hash函数**
首先选取一个初始值: $y_0=IV\in GF(2)^n$
然后依次计算:
$y_i=E_k(x_i\oplus y_{i-1})(1\leq i\leq L)$
最后定义Hash值为: $h_{CBC}(x)=y_L$
![](files/5-4-1.png)
**基于分组密码CFB工作模式构造Hash函数**
- 首先选取一个初始值: y0 =IVGF(2)n
- 然后依次计算:
$y_i=x_i\oplus E_k(y_{i-1})(1\leq i\leq L)$
最后定义Hash值为: $h_{CFB}(x)=y_L$
![](files/5-4-1-2.png)
在密钥公开的情况下基于分组密码CBC工作模式和CFB工作模式构造的Hash函数是不安全的它们甚至不是弱无碰撞的.
#### 5.6.2 基于离散对数问题的Hash函数
* 基于一些困难数学问题诸如离散对数问题、因子分解问题、背包问题等可以构造出一些Hash函数这些Hash函数的安全性依赖于对应数学问题的困难性
* Chaum、Heijst和Pfitzmann1992年提出的基于离散对数问题构造的Hash函数
- 运行速度不是很快
- 可以证明是安全的.
* Chaum-Heijst-Pfitzmann Hash函数的构造
设p是一个大素数$q=(p-1)/2$是一个素数,$\alpha$和$\beta$是$Z_p$的两个本原元。假设离散对数$log_{\alpha}\beta$是计算上不可行的。定义Hash函数$h$为:
$h:Z_p\times Z_p → Z_p^{*}$
$h(x_1,x_2)=\alpha^{x_1}\times \beta^{x_2}\space mod \space p$
Chaum-Heijst-Pfitzmann Hash函数是强抗碰撞的用反证法如果Hash函数h有一对碰撞那么可以证明离散对数$log^{\alpha}\beta$能被有效计算.
设$(x_1, x_2)$$(x_3, x_4)$是h的一对碰撞消息即$(x_1, x_2)\neq (x_3, x_4)$$h(x_1, x_2)=h(x_3, x_4)$,那么
$\alpha^{x_1}\beta^{x_2}=\alpha^{x_3}\beta^{x_4}\space mod\space p \space \Rightarrow\space \alpha^{x_1-x_3}=\beta^{x_4-x_2}\space mod\space p$
记$d=gcd(x_4-x_2, p-1)$。因为p-1=2q且q是一个素数所以$d\in {1,2, q, p-1}$。下面对d的四个取值分别进行讨论。
* 情况1d =1
此时$x_4-x_2$关于模p-1有逆设$y=(x_4-x_2)^{-1}\space mod\space(p-1)$则存在整数k使得$(x_4-x_2)y=1+(p-1)k$,则有
![](files/5-4-2.png)
因此,可计算离散对数
![](files/5-4-2-2.png)
* 情况2d =2
因为$p-1=2q$,且q是奇数,所以$gcd(x_4-x_2, q)=1$。设$y=(x_4-x_2)^{-1}\space mod\space q$则存在整数k使得 $(x_4-x_2) y=1+qk$, 有
![](files/5-4-2-3.png)
由于$\alpha^q=-1\space mod\space p$,所以
![](files/5-4-2-4.png)
容易检验二式中哪一个成立. 即离散对数$log_{\alpha}^{\beta}$能被有效计算。
* 情况3d = q
因为 0≤x2≤q-1, 0≤x4≤q-1
$\rightarrow -(q-1)≤x4-x2≤q-1 \rightarrow gcd(x4-x2, q-1)= q$不成立。
情况3不存在.
* 情况4d =p-1
这种情况只有在$x_2=x_4$时才可能发生。这样就有
$\alpha^{x-1}=\alpha^{x_3}\space mod\space p$
所以$x_1=x_3,(x_1, x_2)= (x_3, x_4)$,与已知矛盾! 即情况4也不存在。

629
doc/CRYPT-6_数字签名.md Normal file
View File

@ -0,0 +1,629 @@
# CRYPT-6 数字签名
**author : Odyssey@cyberpeace**
## 目录
6.1 数字签名概念
6.2 RSA数字签名体制
6.3 ElGamal数字签名体制
6.4 其它数字签名方案
6.5 数字签名标准
6.6 应用
## 6.1 数字签名概念
- 在政治、军事、外交、商业和日常生活中,人们经常需要对纸质材料进行签名。
- 签名起到确认、核准、生效和负责任等多种作用。
- 随着计算机网络技术的发展,电子商务、电子政务和电子金融等系统得到广泛应用,人们需要通过网络信息传输对电子的文件、契约、合同、信件和张单等进行数字签名以替代手写签名。
### 6.1 数字签名概念
- 签名是证明当事人的身份和数据真实性的一种信息。
- 在传统的以书面文件为基础的事物处理中,采用书面签名的形式,如手签、手印和印章等。书面签名得到司法部门的支持,具有一定的法律意义
![](files/6-1.png)
### 6.1 数字签名概念
- 在以计算机文件为基础的现代事物处理中应采用电子形式的签名即数字签名digital signature
- 数字签名的目的是提供一种手段,使得一个实体把他的身份与某个信息捆绑在一起。
- 一个信息的数字签名实际上是一个数,它仅仅依赖于签名者的密钥和被签名的消息。
![](files/6-1-2.png)
#### 6.1.1 数字签名的基本概念
一个数字签名体制是一个满足以下条件的五元组: $(M,S,K,sig,ver)$
- 消息空间M由所有任意长度消息组成的集合
- 签名空间S: 由所有签名组成的集合。签名长度不超过n。
- 密钥空间K
- 签名算法sig$M\times K→S$ $s=sig_k(m)$
- 验证算法ver$M\times S→\{ture,false\}$
$$
ver(m,s)=
\begin{cases}
Ture,s=sig_k(m)\\
False,s\neq sig_k(m)
\end{cases}
$$
- 任意消息$m\in M$,如果$s=sig_k(m)$则将数据对xy称为消息x的一个数字签名或直接把y称为消息x的数字签名
- 数字签名基本要求
- 对每一个密钥K, sigK和verK应该是多项式时间函数
- verK是公开的函数, 而sigK是保密的
- 给定一个消息x, 除了发送者本人以外, 任何其他人找到满足verK(x,y)为真的数字签名y,应该是计算上不可行的
- 如果攻击者能够找到满足verK(x,y)的数据对(x,y),而发送者事先又没有对x签名,则称y是伪造(forgery)的数字签名。
- 数字签名算法必须满足的条件
- 签名者事后不能否认自己的签名;
- 其他人不能伪造签名;
- 当通信双方为签名真伪发生争执时, 可以由第三方解决争端
#### 6.1.1 数字签名的基本概念
**手写签名与数字签名的区别**
- 手写签名是所签文件的物理组成部分,数字签名必须与所签文件捆绑在一起。
- 手写签名通过与标准签名进行比较或检查笔迹来验证,数字签名是通过验证算法来验证。手写签名容易伪造,好的数字签名算法应该使伪造签名十分困难。
- 手写签名不易复制。数字签名是一个二进制串,容易复制。所以必须防止数字签名重复使用。
**签名算法进行分类**
- 按应用目的
- 普通数字签名
- 特殊目的数字签名: 不可否认数字签名、盲签名、群签名等
- 按验证方法
- 在验证时需要输入被签名信息
- 在验证时自动恢复被签名信息
- 按签名时是否使用随机数
- 分成确定性数字签名
- 随机数字签名
#### 6.1.2 数字签名的基本构造方法
利用Hash函数和加密算法可以构造有效的数字签名方案。
1. 基于Hash函数和对称密码算法构造数字签名方案
![](files/6-1-2-2.png)
2. 基于Hash函数和公钥密码算法构造数字签名
![](files/6-1-2-3.png)
具有保密作用的数字签名
公钥密码体制:$S_K$是发送方的私钥,$P_K$是发送方的公钥, $E_1$和$D_1$分别是加密算法与解密算法。
对称密码体制密钥K是双方公用密钥$E_2$和$D_2$分别是对应的加密算法和解密算法。
![](files/6-1-2-4.png)
#### 6.1.3 数字签名的安全需求
**数字签名的攻击模型**
- 唯密钥攻击key-only attack
攻击者E拥有签名者A的公钥K因而能够计算验证函数verK。
- 已知消息攻击known message attack
攻击者E拥有一系列以前由签名者A所签名的消息。即E具有数据对xiyi其中xi是消息yi=sigK (xi)是A对xi的签名i=1, 2, …)。
- 选择消息攻击chosen message attack
攻击者E可以选择一些消息请求签名者A签名。即
E选择消息$x_i$,并将$x_i$发送给签名者A请求A对$x_i$签名。A计算$y_i=sig_K(x_i)$,并将$y_i$发给E。所以E具有A的有效数字签名$x_i,y_i$$i=1, 2, …$)。
**攻击者对数字签名系统的攻击目的**
- 完全破译total break
攻击者E能确定签名者A的私钥K因而能够计算签名函数$sig_K$,可以对任何消息产生有效的签名。
- 选择性伪造selective forgery
攻击者E能以某一个不可忽略的概率对另外某个人选定的消息产生一个有效的签名。也就是说如果给E选定一个消息x那么他能以一个正的概率找到x的签名$y=sig_K(x)$并且签名者A以前未对x签名。
- 存在性伪造existential forgery
攻击者E至少能够为一个消息产生一个有效的签名。也就是说E可能生成一个数据对xy其中x是消息$y=sig_K(x)$。签名者A以前未对$x$签名。
**Hash函数与数字签名的安全性**
- 对消息的散列值签名
![](files/6-1-3.png)
- 使用已知消息攻击的存在性伪造
攻击者E从一个有效的签名(x, y)开始,其中$y=sig_k(h(x))$.然后他计算$z=h(x)$,并企图找到$x'\neq x$,使得$h(x')=h(x)$.如果E能做到这一点,则(x, y)就是一个有效的签名, 从而y是消息x'的一个伪造签名.为了阻止这种攻击, 必须要求Hash函数h是弱无碰撞的.
- 使用选择消息攻击的存在性伪造
攻击者E首先找到$x'\neq x$, 使得$h(x')=h(x)$. 然后将消息x发给签名者A, 并让A对消息的散列值h(x)签名, 从而得到$y=sig_k(h(x))$. 所以E能够成功伪造签名$(x', y)$. 为了阻止这种攻击,必须要求Hash函数h是强无碰撞的.
使用唯密钥攻击的存在性伪造
当签名算法遭到唯密钥攻击时, 即攻击者E拥有签名者A的公钥K.E就可能对一个随机的散列值z伪造签名$y=sig_k(z)$. 此时, 如果Hash函数h不是单向的,则E可能找到一个消息x使得$z=h(x)$.所以E能够成功伪造一个签名(x, y).为了阻止这种攻击, 必须要求Hash函数h是单向的.
### 6.2 RSA数字签名体制
利用RSA加密算法构造的数字签名称为RAS数字签名体制。
#### 6.2.1 RSA数字签名算法描述
1. 密钥生成算法
- 选取两个大素数pq计算
$n=p\times q,\varphi(n)=(p-1)\times (q-1)$
- 任选整数e满足
$0< e <\varphi(n)$$gcd(e ,\varphi(n))=1$
- 用扩展Euclidean算法求e模(n)的逆d
$e\times d=1\space mod\space \varphi(n)$
- 签名者的公钥: {$n,e$},私钥:{ $p,q,d$}。
2. 签名算法
设消息为x则x的RAS签名是
$y=x^d\space mod\space n$
3. 验证算法
当接收方收到签名xy计算
$x'=y^e\space mod\space n$
如果$x= x'$则y是x的RAS签名
#### 6.2.2 RSA数字签名的安全性
1. 一般攻击
- 攻击方法: 设n与e为用户A的公钥攻击者首先随意选择一个数据y并用A的公钥计算
$x=y^e\space mod\space n$
于是可以伪造A的一个RSA数字签名xy。因为
$x^d=(y^e)^d=y^{ed}=y\space mod \space n$
所以用户A对x的RSA数字签名是y。
- 这种攻击实际上成功的概率是不高的
因为对于选择的数据y得到的x=ye mod n具有正确语义的概率是很低的。
- 抵抗措施
- 仔细设计数据格式
- 对数据的Hash值进行签名
2. 选择消息攻击
- 攻击方法假设攻击者E想伪造消息x的签名他容易找到两个数据$x_1$和$x_2$,使得
$x=x_1\times x_2 \space mod \space n$
攻击者E设法让用户A分别对x1和x2 进行签名,得到
$y_1=x_1^d\space mod\space n$$y_2=x_2^d\space mod \space n$
然后E可以计算
$y=y_1\times y_2=x_1^d\times x_2^d=(x_1\times x_2)^d=x^d\space mod \space n$
于是攻击者E得到了用户A对消息x的RSA数字签名y
- 抵抗措施
- 用户不要轻易地对其他人提供的随机数据进行签名
- 对数据的Hash值进行签名
3. 利用签名进行攻击从而获得明文
- 攻击方法
假设攻击者E已截获了秘文$c=x^e \space mod\space n$他想求出明文x。于是他选择一个小的随机数r并计算
$s=r^e\space mod\space n$
$l=s\times c\space mod\space n$
$t=r^{-1}\space mod\space n$
因为s=re,所以sd=( re)d= mod nr=sd mod n.然后E 设法让签名者对l签名. 于是E又获得k=ld mod n. 攻击者E再计算
$t\times k=r^{-1}\times l^d=r^{-1}\times s^d\times c^d=r^{-1}\times r\times c^d=x \space mod \space n$
于是获得了密文x。
- 抵抗措施
- 用户不要轻易地对其他人提供的随机数据进行签名
- 对数据的Hash值进行签名
4. 对先加密后签名方案的攻击
- 攻击方法
假设签名者A采用先加密后签名的方案把消息x发送给接收者B ,则他先用B的公开密钥$e_B$对x加密, 然后用自己的私钥dA签名.设A的模数为nA,B的模数为nB.于是A发送给B的数据为:
$(x^{e_B}\space mod\space n_B)^{d_A}\space mod \space n_A$
如果B是不诚实的,那么B可能伪造A的签名.例如,假设B想抵赖收到A发的消息x, 慌称收到的是x1.因为nB是B的模数,所以B知道nB的分解,于是能够计算模nB的离散对数.即他能找到k满足:
$(x_1)^k=x\space mod \space n_B$
然后B再公布他的新公开密钥为keB。现在B宣布他收到的消息是$x_1$,而不是$x$。
由于下式成立所以A无法争辩。
$(x_1^{ke_B}\space mod\space n_B)^{d_A}\space mod\space n_A=(x^{e_B}\space mod\space n_B)^{d_A}\space mod\space n_A$
- 抵抗措施
- 签名者A应当在发送的数据中加入时间戳从而可证明是用公开密钥eB对x加密而不是用新公开密钥keB对x1加密。
- 对数据的Hash值进行签名。
- 综上所述对于RSA数字签名系统必须采取如下安全措施
- 不直接对消息进行签名而应该对消息的Hash值进行签名。
- 要采用先签名后加密的方式,而不要采用先加密后签名的方式。
### 6.3 ElGamal数字签名体制
- 在1985年ElGamal T. 提出了一个基于离散对数问题的数字签名体制通常称为ElGamal数字签名体制。
- ElGamal签名体制的安全性主要是基于有限域上离散对数问题的难解性。
#### 6.3.1 ElGamal签名算法描述
1. 参数生成算法
- 选取一个大素数$p,g\in Z_p^*$是一个本原元p和g是系统公开参数。
- 任选整数x满足1≤x≤p-2。计算
$y=g^x\space mod\space p$
签名者的公钥为y私钥为x。
2. 签名算法
设$M\in Z_p^{*}$为待签名的消息。签名者随机选择一个秘密整数k1≤k≤p-2计算
$r=g^k\space mod\space p$
$s=(M-x\times r)k^{-1}\space mod\space(p-1)$
签名者对M的ElGamal签名为:
$sig(M)=(r,s)\in Z_P^{*}\times Z_{p-1}^{*}$
签名者将数据(M,(r,s))发送给接收者
3. 验证算法
接收方收到签名(M, (r,s)) 后,验证
$y^r\times r^s=g^M\space mod\space p$
是否成立,如果等号成立,则确认(r, s)是M的有效签名。
- 有效性证明
因为:$s=(M-x\times r)k^{-1}\space mod\space (p-1)$
所以:$k\times s+x\times r=M\space mod\space (p-1)$
因此如果rs是M的正确签名则一定有
$y^r\times r^s=g^{xr}\times g^{ks}=g^{xr+ks}=g^M\space mod\space p$
ElGamal数字签名是一个随机的数字签名体制
例如设p=11g=2是$Z_{11}^*$的本原元。选取私钥为x=8
计算公钥
$y=g^x\space mod \space p=2^8\space mod\space 11=3$
设签名者A要对消息M=5进行签名。签名者A首先秘密选取一个整数k=9计算
$r=g^k\space mod\space p=2^9\space mod \space 11=6$
$s=(M-x\times r)k^{-1}\space mod(p-1)=(5-8\times 6)\times 9^{-1}\space mod\space 10=3$
签名者A对$M=5$的ElGamal签名为6, 3
接收者B可以对消息M=5的签名6, 3进行验证。
因为:$3^6\times 6^3=2^5\space mod\space 11$
#### 6.3.2 ElGamal数字签名的安全性
**ElGamal数字签名算法的实现**
- 需要作一次模指数运算
- 一次扩展Euclidean算法运算求随机数k的逆元
- 二次模乘运算
- 前两个运算可以离线进行
- 是一个随机的数字签名体制
**ElGamal数字签名体制的参数p**
- $p$的选择与在Zp*中计算离散对数的算法有直接关系。从目前的计算水平来看p至少应该是二进制512位的素数从长期安全性考虑应使用1024位或更长的素数。
- $p-1$最好有大的素因子
- 私钥$x$最好是$Z_p^*$的素数阶子群的生成元。
**不知道私钥的攻击**
假设攻击者E不知道私钥$x$要想伪造消息M的签名(r,s), 则E可能使用的攻击方式有
- 攻击者已知消息M,选择一个值r,再求另一个值s.此时,因为有:
$y^r\times r^s=g^M\space mod\space p$
$s=log_r^{g^M\times y^{-r}}\space mod\space p$
所以攻击者E必须计算离散对数。
- 攻击者已知消息M,选择一个值s,再求另一个值r. 此时, 他必须从同余方程
$y^r\times r^s=g^M\space mod\space p$
中求出r。这是一个到目前为止还没有可行方法求解的方程甚至也看不出它与离散对数问题有没有关系。
- 攻击者已知消息M同时求(r,s). 即他必须从同余方程
$y^r\times r^s=g^M \space mod\space p$
中同时求出(r,s)。现在人们对这个方程的认识几乎是一无所有,既没有人发现解这个问题的方法,也没有人能够证明不能解这个问题。
- 攻击者选择数据对(r,s)求消息M。此时必须计算离散对数
$M=log_g^{y^r\times r^s}\space mod\space p$
- 攻击者同时选择数据Mr和s使得(r, s)是M的签名。这种攻击方法可能获得成功。攻击者首先选择整数i和j$0\leq i,j\leq p-2,gcd(j,p-1)=1$,计算
$r=g^i\times y^j\space mod\space p $
$s=-r\times j^{-1}\space mod\space (p-1)$
$M=-r\times i\times j^{-1}\space mod \space(p-1)$
由于:
$
\begin{aligned}
y^r\times r^s&=y^r\times(g^i\times y^j)^{-rj^{-1}} \\ &=y^r\times g^{-irj^{-1}}\times y^{-r} \\ &=g^{-irj^{-1}} \\&=g^{M}\space mod\space p
\end{aligned}
$
成立,所以(r, s) 是消息M的有效签名
该攻击方法属于存在性伪造。因此在使用ElGamal数字签名方案时不要直接对消息进行签名而应该对消息的Hash值进行签名。
#### 例6.3
设p=467g=2是$Z_{467}^*$的本原元签名者公钥y=132。攻击者选择整数i=99j=1.79,计算
$j^{-1}=179^{-1}\space mod \space 466=151$
$r=2^{99}\times 132^{179}\space mod\space 467=117$
$s=-117\times 151\space mod \space 466=41$
$M=-117\times 99\times 151\space mod\space 466=331$
由于:
$y^r\times r^s=132^{117}\times 117^{41}=303\space mod\space 467$
$g^{M}=2^{331}=303\space mod\space 467$
所以117,41是消息M=331的有效签名
假设攻击者E知道(r, s)是消息M的签名,则E可利用它来伪造其它消息的签名. 选择整数$l,i,j,0\leq l,i,j\leq p-2,gcd(lr-js,p-1)=1$,计算
$u=r^l\times g^i\times y^j\space mod\space p$
$v=s\times u\times (l\times r-j\times s)^{-1}\space mod\space (p-1)$
$W=u\times (l\times M+i\times s)\times (l\times r-j\times s)^{-1}\space mod\space (p-1)$
由于$y^r\times r^s=g^M\space mod\space p $,所以
$
\begin{aligned}
r^s&=y^{-r}\times g^M\space mod\space p \\
&=y^u\times (r^l\times g^i\times y^j)^{su(lr-js)^{-1}} \\
&=y^{u+jsu(lr-js)^{-1}}\times r^{hsu(lr-js)^{-1}\times g^{isu(lr-js)^{-1}}} \\
&=y^{u+jsu(lr-js)^{-1}-rlu(lr-js)^{-1}}\times g^{isu(lr-js)^{-1}+Mu(lr-js)^{-1}} \\
&=y^{u(l-(lr-js)(lr-js)^{-1})}\times g^{(is+lM)u(lr-js)^{-1}} \\
&=g^w\space mod \space p
\end{aligned}
$
可见$(u, v)$是消息$W$的有效签名。
- 该攻击方法属于存在性伪造
- 使用对消息的Hash值进行签名的方式,可以抵抗这类攻击。
**使用ElGamal数字签名方案的安全措施**
- 不要泄露随机数k
否则,根据:
$s=(M-x\times r)k^{-1}\space mod \space (p-1)$
可计算出私钥:
$x=(M-s\times k)\times r^{-1}\space mod \space (p-1)$
- 不要使用同一个随机数k给两个不同的消息签名设rs是消息M的签名uv是消息W的签名使用的是同一个随机数k则可求出私钥。
#### 6.3.3 ElGamal签名体制的变形
**ElGamal数字签名算法有多种变形**
- 设大素数p是模数g是一个模p的本原元x为签名者的私钥k为随机数m为待签名的消息rs是对M的签名。签名值的分量$r=g^k\space mod \space p$, 分量s由签名算法确定。ElGamal数字签名各种变形的签名算法和验证算法见下表。
![](files/6-3-3.png)
### 6.4 其它数字签名方案
- Fiat-Shamir数字签名
- 一次性数字签名
- 不可否认数字签名
- 盲签名
#### 6.4.1 Fiat-Shamir数字签名
- Fiat-Shamir数字签名由A. Fiat和 A. Shamir提出有时简记为FS数字签名。与RSA数字签名相比较FS数字签名的主要优势是速度快它仅需要RSA的1%~4%的模乘法。FS数字签名的理论基础是大整数素因子分解的困难性。
- 参数生成: 选取两个大素数p、q令$n=p\times q$。n是公开参数p和q是管理中心CA掌握的密钥。设h是一个公开的Hash函数k是一个固定的正整数。
- 管理中心CA为用户A产生k个公开密钥$y_i (i =1,2,…,k)$ 是模n的平方剩余
- 再为用户A产生k个私钥保密
$x_1=\sqrt{\smash[b]{y_1^{-1}}}\space mod\space n$$x_2=\sqrt{\smash[b]{y_2^{-1}}}\space mod\space n$$...$$x_k=\sqrt{\smash[b]{y_k^{-1}}}\space mod\space n$
**签名算法:**
为了对消息m进行签名,用户A执行以下步骤
1. 随机选取一个正整数t。
2. 在1和n之间随机选取t个正整数rj (j =1,2,…,t),并计算
$R_j=r_j^2\space mod\space n\space (j=1,2,...,t)$
3. 计算Hash函数值h (m|| R1|| R2||…|| Rt),依次取出其前$k\times t$个比特值,记为
$b_{ij}(i=1,2,...,k;j=1,2,...,t)$
4. 计算:$s_j=r_j\prod_{i=1}^{k} x_{i}^{b_{ij}}\space mod\space n\space (j=1,2,...,t) $
用户A对消息m的数字签名为
$\{b_{ij}\},\{s_j\}(i=1,2,...,k;j=1,2,...,t)$
签名者将数据$(m,\{b_{ij}\},\{s_j\})$发送给接收者B
**验证算法:**
接收方B收到签名数据$(m,\{b_{ij}\},\{s_j\})$后, 按以下步骤进行验证:
1. 利用A的公钥计算$R_j^{'}=s_j^2\prod^{k}_{i=1}y_i^{b_{ij}}\space mod\space n\space (j=1,2,...,t)$
2. 计算Hash函数值$h(m||R_1^{'}||R_2^{'}||...||R_t^{'})$,依次取出其前$k\times t$个比特值,记为:$b_{ij}^{'}(i=1,2,...,k;j=1,2,...,t)$
3. 比较等式:$b_{ij}=b_{ij}^{'}(i=1,2,...,k;j=1,2,,...,t)$
是否成立。如果$k\times t$个等式全部成立,则数字签名有效。否则,数字签名无效。
**该验证算法的正确性**
当数据传输正确时,有
![](files/6-4-1.png)
得到:$h(m||R_1^||R_2||...||R_k)=h(m||R_1^{'}||R_2^{'}||...||R_k^{'})$
并且:$b_{ij}=b_{ij}^{'}(i=1,2,...,k;j=1,2,,...,t)$
#### 例6.4
设n=35k=4用户A的4个公钥为$y_1 =4$$y_2 =11$$y_3 =16$$y_4 =29$。则A的4个私钥为
![](files/6-4-1-2.png)
取$t=1$,$r_1=16$,计算:$R_1=r_1^{2}=16^2=11\space mod\space 35$
为了简化,设$h(m||R_1)=R_1=11=1011$。即有:
$b_{11}=1,b_{21}=0,b_{31}=1,b_{41}=1$
$s_1=r_1\prod_{i=1}^{4}x_i^{b_{ij}}\space mod\space n=16\times 3^1\times 9^0\times 9^1\times 8^1=26\space mod\space 35$
数字签名为({1,0,1,1}, {26}
设n=35k=4用户A的4个公钥为$y_1 =4$$y_2 =11$$y_3 =16$$y_4 =29$。数字签名为({1,0,1,1}, {26})。
接收方验证方法如下。由于:$R_1^{'}=s_1^2\prod_{i=1}^{4}y_i^{b_{ij}}=26^2\times 4^1\times 11^0\times 16^1\times 29^1\space mod\space 35=11=R_1\space mod\space 35$
所以数字签名有效。
#### 6.4.2 一次性数字签名
- 一次性签名方案是指一对公、私钥只能用于对一个消息进行签名的方案它通常被用于芯片卡chipcards)。
- 1978年M.O. Rabin首次提出一次性签名方案。在Rabin一次性签名方案中签名算法使用了对称加密算法验证过程需要验证者与签名者共同参与。
- 1979年L. Lamport提出一个类似的方案不同之处在于验证时不需要验证者与签名者交互。该方案由于受到著名密码学家Diffie和Hellman的重视而有名。
- 1992年Bos与Chaum对Lamport的另一个更有效的一次性签名方案做了本质的改进并证明了改进的签名方案在选择消息攻击下是不可伪造的。
### 6.4.3 Lamport一次性数字签名
**密钥生成:**
已知单向函数$f:Y→Z$
- 在Y中随机选取
$y_{1,0},y_{1,1},y_{2,0},y_{2,1},...,y_{k,0},y_{k,1}$为私钥。
- 计算:$z_{i,j}=f(y_{i,j})\space (1\leq i\leq k,j=0,1)$
单向函数$f$及$z_{1,0},z_{1,1},z_{2,0},z_{2,1},...,z_{k,0},z_{k,1}$为公钥
**签名算法**
设消息$x=(x_k x_{k-1}...x_2 x_1)$是二进制串则对消息x的签名为{$u_i=y_{i,j}|1\leq i\leq k,x_i=j$}
**验证算法**
若${f(u_i)|1\leq i\leq k}$包含在公钥中,则签名是合法的。
### 6.4.4 Bos-Chaum 一次性数字签名
Bos-Chaum一次性签名方案的签名比Lamport方案的签名短。设A={122n}是2n元集合B是A的所有n元子集构成的集合则有$|B|=C_{2n}^n$。定义Bos-Chaum签名方案使用的单射函数为$\varphi:\{0,1\}^k→B$
它把长为k的字符串映射到A的n元子集这里$2^k\leq C_{2n}^n$
### 6.4.4 Bos-Chaum 一次性数字签名
1. 密钥生成
设 f:Y→Z是单向函数取$y1,y2,...,y2n\in Y$作为私钥,$z_1,z_2,...,z_2n\in Z$作为公钥,其中$f(y_i)=z_i(1\leq i\leq 2n)$。
2. 签名算法
设消息$x=(x_kx_{k-1}...x_2x_1)_2$是二进制串则对消息x的签名为
{$a_1,a_2,...,a_n$}$=$$\{y_j|j\in \varphi (x)\}$。
3. 验证算法
计算集合$C={f(a_i),1\leq i\leq n}$和$\varphi (x)$。如果$C=\{z_j|j\in \varphi (x)\}$,则{$a_1,a_2,...,a_n$}是对$x$的合法签名。
### 6.4.4 Bos-Chaum 一次性数字签名
由于f是单向函数对手不可能伪造消息的Bos-Chaum签名。
如果使用Bos-Chaum方案签了两个消息则对手容易伪造Bos-Chaum签名。
例如令n=4容易计算出$\varphi (110010)=\{2,4,6,8\},\varphi (010011)=\{2,3,4,7\}$。已知对110010的Bos-Chaum签名为$\{y_2,y_4,y_6,y_8\}$对010011的Bos-Chaum签名为$\{y_2,y_3,y_4,y_7\}$容易得到对111100的Bos-Chaum签名为$\{y_2,y_4,y_7,y_8\}$。所以该签名方案是一次性签名方案。
#### 6.4.5 不可否认数字签名
对于以前讨论的数字签名,任何人都可以对签名进行验证。但在某些特殊应用条件下,需要在签名者参加的情况下才能进行验证。具有这种性质的数字签名称为不可否认签名方案(undeniable signature scheme)。它们可以应用在如下场合:
- 实体A 希望访问实体B控制的“安全区域”。实体B在授予实体A访问权之前要求A对“访问时间、日期”进行签名。另一方面实体A不希望别人了解这个事实即没有实体A的参与实体B不能通过出示实体A的签名及验证来证明“实体A访问该区域”这一事实。
- 某公司A开发的一个软件包。A将软件包和他对软件包的不可否认签名卖给用户B。B当场验证A的签名以便确认软件包的真实性。用户B想把该软件包的拷贝私自卖给第三者。由于没有公司A参与第三者不能验证软件包的真实性。从而保护了公司A的利益
Chaum和van Antwerpen在1989年提出的不可否认数字签名方案
**密钥生成**
随机选择素数$q,p=2q+1$。在$Z_p^{*}$中取q阶元$a(\neq1)$。从Euler准则知$a$是模$p$的二次剩余组成的。
选择秘密指数$1\leq x\leq p-1$,计算$y=a ^x\space mod \space p$。
公布公钥$(p,a,y)$,秘密保存私钥$x$。
**签名算法**
对消息m的签名是: $s=m^x\space mod\space p$。
**验证协议**
![](files/6-4-5.png)
假设签名者A想否认一个“由签名生成算法构造出来的”合法签名其方式有
1. 拒绝参与验证协议;
2. 错误地执行验证协议;
3. 即使验证协议成功,也断言签名是伪造的。
对于前者很明显而后两种情况难以防范。使用“否认协议”disavowal protocol能够确定是签名者A试图否认一个由签名算法得出的签名还是签名本身是伪造的。否认协议由两遍验证协议组成。
**否认协议**
![](files/6-4-5-2.png)
否则计算:$C=(wa^{-x_2})^{x_1'}\space mod\space p,C'=(w'a^{-x'_2})^{x_1}\space mod\space p$
进行一致性检验,若$C=C'$则s是对m的伪造签名若$C\neq C'$则s是对m的合法签名签名者试图否认。
**否认协议的性质**
- 性质1如果验证者和签名者都正确执行协议则必有$C=C'$说明s是对m的伪造签名
$s\neq m^x\space mod\space p$
- 性质2如果$\widetilde{s}\neq m^x\space mod\space p$,则验证者把$\widetilde{s}$看作对m的合法签名的概率为$1/q$。
- 性质3如果s是对m的合法签名由于签名者采取不合作的态度致使$w\equiv m^{x'_1}a^{x'_2}mod p$和$w\equiv m^{x_1}a^{x_2}\space mod\space p$
否认协议中最后$C\neq C'$的概率为$1-(\frac{1}{q})$。
#### 6.4.6 盲签名
- 对于前面介绍的数字签名,签名者知道所签名的消息。但在数字现金、电子投票等应用领域,要求签名者不能知道所签名的消息。
- 签名者对所签署消息和对消息的签名都不可见的数字签名称为盲签名blind signature
- 盲签名由D. Chaum在1982年首次提出
**盲签名过程**
![](files/6-4-6.png)
- A是消息m的拥有者, 称为求签名者
- B称为签名者
- 盲签名需要两个基本构件:
- 求签名者A知道的盲化函数f 及脱盲函数g。f与g必须满足
$g(S_B(f(m)))=S_B(m)$
- 签名者B的数字签名方案SB。
- 考虑盲签名在电子货币中的应用例如顾客A得到银行B对钱款m的盲签名后自己算出银行的真正签名SB(m)。在支付时提交出m和SB(m)银行能验证SB(m)是否为m的合法签名但不知道这是谁的一笔消费。从而使A保持匿名状态即消费行为不受到监控。
#### 6.4.7 基于RSA公钥密码系统的Chaum盲签名
Chaum提出的盲签名方案是基于RSA公钥密码系统
**密钥生成**
- 选取素数p、q令$nB=p\times q,1<b_B<\varphi (n_B)$$gcd(b_B,n_B)=1$随机选取$1<a_B<\varphi (n_B)$使得$a_B\times b_B\equiv 1\space mod\space \varphi(n_B)$。
签名者B的公钥是$n_B,b_B$),私钥是$a_B$。
**盲签名协议**
设需签名的消息为m
- A对m进行盲变换随机选择盲因子$k$$1<k<m$计算$\widetilde{m}=m\times k^{b_s}\space mod\space n_B$
将$\widetilde{m}$发送给B
- B对$\widetilde{m}$进行盲签名:计算$\widetilde{s}=\widetilde{m}^{a_s}\space mod\space n_{B}$
将$\widetilde{s}$发送给A
- A对$\widetilde{s}$进行脱盲变换得到对m的签名计算$s=\widetilde{s}\times k^{-1}=m^{a_s}\space mod\space n_B$
s即是B对m的签名
**盲签名验证算法**
验证$m=s^{b_s}\space mod\space n_B$。若成立则接受s是对m的签名否则拒绝
#### 6.4.8 基于离散对数问题的盲签名
- 瑞士学者J. Lcamenisch, J. M. Pivetean提出了基于离散对数问题的盲签名
**密钥生成**
签名者选择两个大素数pqq|(p-1),在$Z_p^*$上离散对数问题是难解问题。a是$Z_p^{*}$的q阶元。选取私钥$x$,令$y=a^x\space mod\space p,(p,q,a,y)$为公钥。
**盲签名协议**
设A需签名的消息为m盲签名由签名者B开始
![](files/6-4-8.png)
**盲签名验证算法**
验证$a^s\equiv y^rr^m\space mod \space p$,若成立,则接受(r,s)是对m的签名否则拒绝。
### 6.5 数字签名标准
数字签名标准DSS: Digital Signature Standard由美国国家标准技术研究所NIST于1991年提出并于1994年正式成为美国联邦信息处理标准FIPS PUB186这标志着数字签名已得到政府的支持。DSS使用的签名算法称为数字签名算法DSA: Digital Signature Algorithm。2000年1月美国政府将RSA和椭圆曲线密码引入数字签名标准DSS进一步丰富了DSS的算法。目前DSS的应用已十分广泛并被多个国际标准化组织采纳作为标准。美国的一些州已经通过相关法律正式承认数字签名的法律意义。这是数字签名得到法律支持的重要标志。
#### 6.5.1 美国数字签名标准
**算法参数**
DSA使用的参数如下
![](files/6-5-1.png)
- pqg是公开参数可为一组用户公用
- x和y分别为一个签名者的私钥和公钥私钥x用于产生签名必须保密
- 所有这些参数可在一定时间内固定
**签名算法**
设SHA是一个安全hash函数
![](files/6-5-1-2.png)
**验证算法**
![](files/6-5-1-3.png)
### 6.6 应用
手写签名可以用来签合同,那么数字签名可以用来干什么呢?
#### 6.6.1 网站认证
最常见的用处就是用来认证一个网站的身份。
比如我打开百度,百度是怎么保证显示在我眼前的网页就一定是百度生成的,不是其他人修改的呢?就是借助数字签名来实现的。
<div id="left">
用IE浏览器打开百度点击地址栏旁边的小锁再点击查看证书就可以看到百度主页的数字签名证书了。所谓证书其实是对公钥的封装在公钥的基础上添加了诸如颁发者之类的信息。
</div>
<div id="right">
![](files/6-6-1.png)
</div>
#### 6.6.2 代码签名
如果Windows上的可执行程序程序来源于正规公司那么通常它会有代码签名用于确保其来源可靠且未被篡改。以QQ为例它的数字签名是这样的。
![](files/6-6-2.png)
如果某个程序没有数字签名,那么它的安全性往往就没有保证,如果它有数字签名,但是显示“此数字前面无效”,那么这个程序要么被篡改了要么损坏了,不管哪种可能都不应该尝试执行它。
#### 6.6.3 比特币
比特币是一种完全匿名的数字货币它的身份认证是基于ECDSA。比特币的账户地址就是对公钥计算摘要得到的向全世界公布。而确认你是账户拥有者的唯一办法就是看你有没有账户对应的私钥。对于比特币中的任意一个交易记录只有当其中付款方的签名是有效的它才是有效的。如果账户私钥丢失那么你将永远地失去里面的钱一旦被黑客盗取里面的钱就完全归黑客所有。
#### 6.6.4 电子邮件
- 对于电子邮件的安全性,主要有两个要求:其一是确保只有收信人才能阅读信件内容;其二收信人能够判断信件确由发信人发送,而未被别人伪造、或篡改。
- 目前应用最多的安全电子邮件系统是PGPpretty good privacy。PGP是一种基于Internet的保密电子邮件软件系统能提供邮件加密、数字签名、认证、数据压缩和密钥管理功能它是由美国Phi Zimmermann开发的。由于PGP系统功能强大使用方便所以在Windows、Unix和Mashintosh平台上得到广泛应用。
- PGP采用ZIP压缩算法对邮件数据进行压缩采用IDEA对压缩后的数据进行加密采用MD5对邮件数据进行散列处理采用RSA对邮件数据的散列值进行数字签名采用支持公钥证书的密钥管理采用先签名后加密的数字签名方案
- PGP巧妙地将公钥密码RSA和单钥密码IDEA结合在一起兼顾了安全性和效率。支持公钥证书的密钥管理使PGP系统更安全方便。PGP具有很好的灵活性可支持IDEA、3DES等单钥密码体制MD5、SHA等Hash函数Diffe-Hellman等密钥协议。这些显著的技术特色使得PGP成为Internet环境最著名的保密电子邮件软件系统。
- PGP采用1024位的RSA、128位的IDEA密钥、128位的MD5、Diffe-Hellman密钥协议、公钥证书因此PGP是安全的。如果采用160位的SHA将进一步提高PGP的安全性。

375
doc/CRYPT-7_密码协议.md Normal file
View File

@ -0,0 +1,375 @@
# 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协议以及改进方案一可能遭受的攻击
① $A→B:ID_A||N_A$
② $B→KDC:ID_B||N_B||E_{KB}[ID_A||N_A||T_B]$
③ $KDC→A:E_{KA}[ID_B||N_A||K_S||T_B]||E_{KB}[ID_A||K_S||T_B]||N_B$
④ $A→B: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建议的证书截止时间TB、B从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。
以上协议为A、B双方建立共享的会话密钥提供了一个安全有效的手段。再者如果A保留由协议得到的票据就可在有效时间范围内不再求助于认证服务器而由以下方式实现双方的新认证
① $A→B:E_{KB}[ID_A||K_S||T_B],N'A$
② $B→A:N'_B,E_{KS}[N'_A]$
③ $A→B:E_{KS}[N'_B]$
B在第①步收到票据后可通过$T_B$检验票据是否过时,而新产生的一次性随机数$N'_A$、$N'_B$则向双方保证了没有重放攻击。
以上协议中时间期限$T_B$是B根据自己的时钟定的因此不要求各方之间的同步。
**采用公开密钥算法的机制**
前面的课程曾介绍过使用公钥加密体制分配会话密钥的方法,下面的协议也用于这个目的。
① $A→AS:ID_A||ID_B$
② $AS→A:E_{SK^{AS}}[ID_A||PK_A||T]||E_{SK^{AS}}[ID_B||PK_B||T]$
③ $A→B: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将自己的身份及欲通信的对方的身份发送给AS。第②步AS发给A的两个链接的数据项都是由自己的秘密钥加密即由AS签字分别作为发放给通信双方的公钥证书。第③步A选取会话密钥并经自己的秘密钥和B的公开钥加密后连同两个公钥证书一起发往B。因会话密钥是由A选取并以密文形式发送给B因此包括AS在内的任何第3者都无法得到会话密钥。时戳T用以防止重放攻击所以需要各方的时钟是同步的。
下一协议使用一次性随机数,因此不需要时钟的同步:
① $A→KDC:ID_A||ID_B$
② $KDC→A:E_{SK_{AU}}[ID_B||PK_B]$
③ $A→B:E_{PK^B}[N_A||ID_A]$
④ $B→KDC:ID_B||ID_A||E_{PK^{AU}}[N_A]$
⑤ $KDC→B:E_{SK^{AU}}[ID_A||PK_A]||E_{PK^B}[E_{SK^{AU}}[N_A||K_S||ID_B]]$
⑥ $B→A:E_{PK^A}[E_{SK^{AU}}[N_A||K_S||ID_B]||N_B]$
⑦ $A→B:E_{K^S}[N_B]$
其中$SK_{AU}$和$PK_{AU}$分别是KDC的秘密钥和公开钥。第①步A通知KDC他想和B建立安全连接。第②步KDC将B的公钥证书发给A公钥证书包括经KDC签字的B的身份和公钥。第③步A告诉B想与他通信并将自己选择的一次性随机数$N_A$发给B。第④步B向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的公开钥加密后发往A。第⑦步A取出会话密钥再由会话密钥加密$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所示的情况中去掉第④步和第⑤步就可满足单向通信的两个要求。协议如下:
① $A→KDC:ID_A||ID_B||N_1$
② $KDC→A:E_{K^A}[K_S||ID_B||N_1||E_{K^B}[K_S||ID_A]]$
③ $A→B:E_{K^B}[K_S||ID_A]||E_{K^S}[M]$
本协议不要求B同时在线但保证了只有B能解读消息同时还提供了对消息的发方A的认证。然而本协议不能防止重放攻击为此需在消息中加上时戳但由于电子邮件处理中的延迟时戳的作用极为有限。
**采用公开密钥算法的机制**
公钥加密算法可对发送的消息提供保密性、认证性或既提供保密性又提供认证性,为此要求发送方知道接收方的公开钥(保密性),或要求接收方知道发送方的公开钥(认证性),或要求每一方都知道另一方的公开钥。
如果主要关心保密性,则可使用以下方式:
$A→B:E_{PK^B}[K_S]||E_{K^S}[M]$
其中A用B的公开钥加密一次性会话密钥用一次性会话密钥加密消息。只有B能够使用相应的秘密钥得到一次性会话密钥再用一次性会话密钥得到消息。这种方案比简单地用B的公开钥加密整个消息要有效得多。
如果主要关心认证性,则可使用以下方式:
$A→B:M||E_{SK^A}[H(M)]$
这种方式可实现对A的认证但不提供对M的保密性。如果既要提供保密性又要提供认证性可使用以下方式
$A→B:E_{PK^B}[M||E_{SK^A}[H(M)]]$
后两种情况要求B知道A的公开钥并确信公开钥的真实性。为此A还需同时向B发送自己的公钥证书表示为
$A→B:M||E_{SK^A}[H(M)]||E_{SK^{AS}}[T||ID_A||PK_A]$
$A→B: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的两个素因子p、q而计算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计算$b≡ry^e\space mod\space n$即e=0时b=re=1时$b=ry\space mod\space n$。将b发送给V。
④ 若$b^2≡ax^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则应答$b≡ry^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^2≡ax\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$。
由$E≠F$可设$e^j≠f^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}$。

View File

@ -0,0 +1,440 @@
# CRYPT-8 密钥分配与管理
## 目录
8.1 单钥加密体制的密钥分配
8.2 公钥加密体制的密钥管理
8.3 密钥托管
8.4 秘密分割
### 8.1 单钥加密体制的密钥分配
两个用户(主机、进程、应用程序)在用单钥密码体制进行保密通信时,首先必须有一个共享的秘密密钥,而且为防止攻击者得到密钥,还必须时常更新密钥。因此,密码系统的强度也依赖于密钥分配技术。
#### 8.1.1 密钥分配的基本方法
两个用户A和B获得共享密钥的方法有以下几种
① 密钥由A选取并通过物理手段发送给B。
② 密钥由第三方选取并通过物理手段发送给A和B。
③ 如果A、B事先已有一密钥则其中一方选取新密钥后用已有的密钥加密新密钥并发送给另一方。
④ 如果A和B与第三方C分别有一保密信道则C为A、B选取密钥后分别在两个保密信道上发送给A、B。
前两种方法称为人工发送。在通信网中若只有个别用户想进行保密通信密钥的人工发送还是可行的。然而如果所有用户都要求支持加密服务则任意一对希望通信的用户都必须有一共享密钥。如果有n个用户则密钥数目为n(n-1)/2。因此当n很大时密钥分配的代价非常大密钥的人工发送是不可行的。
第3种方法攻击者一旦获得一个密钥就可获取以后所有的密钥而且用这种方法对所有用户分配初始密钥时代价仍然很大。
第4种方法比较常用其中的第三方通常是一个负责为用户分配密钥的密钥分配中心。这时每一用户必须和密钥分配中心有一个共享密钥称为主密钥。通过主密钥分配给一对用户的密钥称为会话密钥用于这一对用户之间的保密通信。通信完成后会话密钥即被销毁。如上所述如果用户数为n则会话密钥数为n(n-1)/2。但主密钥数却只需n个所以主密钥可通过物理手段发送。
#### 8.1.2 秘钥分配案例
下图是密钥分配的一个实例。假定两个用户A、B分别与密钥分配中心KDC (key distribution center)有一个共享的主密钥KA和KBA希望与B建立一个共享的一次性会话密钥可通过以下几步来完成
![](files/2018-04-10-14-56-24.png)
① A向KDC发出会话密钥请求。表示请求的消息由两个数据项组成第1项是A和B的身份第2项是这次业务的惟一识别符$N_1$,称$N_1$为一次性随机数可以是时戳、计数器或随机数。每次请求所用的N1都应不同且为防止假冒应使敌手对N1难以猜测。因此用随机数作为这个识别符最为合适。
② KDC为A的请求发出应答。应答是由KA加密的消息因此只有A才能成功地对这一消息解密并且A可相信这一消息的确是由KDC 发出的。消息中包括A希望得到的两项内容
- 一次性会话密钥$K_S$
- A在①中发出的请求包括一次性随机数$N_1$目的是使A将收到的应答与发出的请求相比较看是否匹配。
因此A能验证自己发出的请求在被KDC收到之前是否被他人篡改。而且A还能根据一次性随机数相信自己收到的应答不是重放的过去的应答。
此外消息中还有B希望得到的两项内容
- 一次性会话密钥$K_S$
- A的身份例如A的网络地址$ID_A$。
这两项由KB加密将由A转发给B以建立A、B之间的连接并用于向B证明A的身份。
③ A存储会话密钥并向B转发$E_{K_B}[K_S||ID_A]$。因为转发的是由$K_B$加密后的密文所以转发过程不会被窃听。B收到后可得会话密钥$K_S$,并从$ID_A$可知另一方是A而且还从$E_{K_B}$知道$K_S$的确来自KDC。
这一步完成后会话密钥就安全地分配给了A、B。然而还能继续以下两步工作
④ B用会话密钥$K_S$加密另一个一次性随机数$N_2$并将加密结果发送给A。
⑤ A以$f(N_2)$作为对B的应答其中f是对$N_2$进行某种变换例如加1的函数并将应答用会话密钥加密后发送给B。
这两步可使B相信第③步收到的消息不是一个重放。
注意: 第③步就已完成密钥分配,第④、⑤两步结合第③步执行的是认证功能。
#### 8.1.3 密钥的分层控制
网络中如果用户数目非常多而且分布的地域非常广一个KDC就无法承担为用户分配密钥的重任。问题的解决方法是使用多个KDC的分层结构。例如在每个小范围如一个LAN或一个建筑物都建立一个本地KDC。同一范围的用户在进行保密通信时由本地KDC为他们分配密钥。如果两个不同范围的用户想获得共享密钥则可通过各自的本地KDC而两个本地KDC的沟通又需经过一个全局KDC。这样就建立了两层KDC。类似地根据网络中用户的数目及分布的地域可建立3层或多层KDC。
分层结构可减少主密钥的分布因为大多数主密钥是在本地KDC和本地用户之间共享。再者分层结构还可将虚假KDC的危害限制到一个局部区域。
#### 8.1.4 会话密钥的有效期
会话密钥更换得越频繁,系统的安全性就越高。因为敌手即使获得一个会话密钥,也只能获得很少的密文。但另一方面,会话密钥更换得太频繁,又将延迟用户之间的交换,同时还造成网络负担。所以在决定会话密钥的有效期时,应权衡矛盾的两个方面。
- 面向连接的协议,在连接未建立前或断开时,会话密钥的有效期可以很长。而每次建立连接时,都应使用新的会话密钥。如果逻辑连接的时间很长,则应定期更换会话密钥。
- 无连接协议(如面向业务的协议),无法明确地决定更换密钥的频率。为安全起见,用户每进行一次交换,都用新的会话密钥。然而这又失去了无连接协议主要的优势,即对每个业务都有最少的费用和最短的延迟。比较好的方案是在某一固定周期内或对一定数目的业务使用同一会话密钥。
#### 8.1.5 无中心的密钥控制
用密钥分配中心为用户分配密钥时要求所有用户都信任KDC同时还要求对KDC加以保护。如果密钥的分配是无中心的则不必有以上两个要求。然而如果每个用户都能和自己想与之建立联系的另一用户安全地通信则对有n个用户的网络来说主密钥应多达n(n-1)/2个。当n很大时这种方案无实用价值但在整个网络的局部范围却非常有用。
无中心的密钥分配时两个用户A和B建立会话密钥需经过以下3步见图5.2
① A向B发出建立会话密钥的请求和一个一次性随机数N1。
② B用与A共享的主密钥MKm对应答的消息加密并发送给A。应答的消息中有B选取的会话密钥、B的身份、f(N1)和另一个一次性随机数N2。
③ A使用新建立的会话密钥KS对f(N2)加密后返回给B。
![](files/2018-04-11-09-06-24.png)
无中心的密钥分配
#### 8.1.6 密钥的控制使用
- 密钥可根据其不同用途分为会话密钥和主密钥两种类型,会话密钥又称为数据加密密钥,主密钥又称为密钥加密密钥。由于密钥的用途不同,因此对密钥的使用方式也希望加以某种控制。
- 如果主密钥泄露了,则相应的会话密钥也将泄露,因此主密钥的安全性应高于会话密钥的安全性。一般在密钥分配中心以及终端系统中主密钥都是物理上安全的,如果把主密钥当作会话密钥注入加密设备,那么其安全性则降低。
单钥体制中的密钥控制技术有以下两种。
**(1) 密钥标签**
用于DES的密钥控制将DES的64比特密钥中的8个校验位作为控制使用这一密钥的标签。标签中各比特的含义为
- 一个比特表示这个密钥是会话密钥还是主密钥;
- 一个比特表示这个密钥是否能用于加密;
- 一个比特表示这个密钥是否能用于解密;
- 其他比特无特定含义,留待以后使用。
由于标签是在密钥之中,在分配密钥时,标签与密钥一起被加密,因此可对标签起到保护作用。
本方案的缺点:
- 第一标签的长度被限制为8比特限制了它的灵活性和功能
- 第二,由于标签是以密文形式传送,只有解密后才能使用,因而限制了对密钥使用的控制方式。
**(2) 控制矢量**
这一方案比上一方案灵活。方案中对每一会话密钥都指定了一个相应的控制矢量控制矢量分为若干字段分别用于说明在不同情况下密钥是被允许使用还是不被允许使用且控制矢量的长度可变。控制矢量是在KDC产生密钥时加在密钥之中的过程由图5.3(a)所示。
首先由一杂凑函数将控制矢量压缩到与加密密钥等长,然后与主密钥异或后作为加密会话密钥的密钥,即
$H=h(CV)$
$K_{in}=K_m\oplus H$
$K_{out}=E_{K_m\oplus H}[K_s]$
其中CV是控制矢量h是杂凑函数$K_m$是主密钥,$K_S$是会话密钥。会话密钥的恢复过程如图所示,表示为:
$K_s=D_{K_m\oplus H}[E_{K_m\oplus H}[K_s]]$
![](files/2018-04-11-09-16-11.png)
KDC在向用户发送会话密钥时同时以明文形式发送控制矢量。用户只有使用与KDC共享的主密钥以及KDC发送来的控制矢量才能恢复会话密钥因此还必须保留会话密钥和它的控制矢量之间的对应关系。
与使用8比特的密钥标签相比使用控制矢量有两个优点:
- 第一,控制矢量的长度没有限制,因此可对密钥的使用施加任意复杂的控制;
- 第二,控制矢量始终是以明文形式存在,因此可在任一阶段对密钥的使用施加控制。
### 8.2 公钥加密体制的密钥管理
前一节介绍了单钥密码体制中的密钥分配问题,而公钥加密的一个主要用途是分配单钥密码体制使用的密钥。本节介绍两方面内容:
- 一是公钥密码体制所用的公开密钥的分配,
- 二是如何用公钥体制来分配单钥密码体制所需的密钥。
#### 8.2.1 公钥的分配
**1. 公开发布**
公开发布指用户将自己的公钥发给每一其他用户或向某一团体广播。例如PGPpretty good privacy中采用了RSA算法它的很多用户都是将自己的公钥附加到消息上然后发送到公开公共区域如因特网邮件列表。
这种方法虽然简单但有一个非常大的缺点即任何人都可伪造这种公开发布。如果某个用户假装是用户A并以A的名义向另一用户发送或广播自己的公开钥则在A发现假冒者以前这一假冒者可解读所有意欲发向A的加密消息而且假冒者还能用伪造的密钥获得认证。
**2. 公用目录表**
公用目录表指一个公用的公钥动态目录表公用目录表的建立、维护以及公钥的分布由某个可信的实体或组织承担称这个实体或组织为公用目录的管理员。与第1种分配方法相比这种方法的安全性更高。该方案有以下一些组成部分
① 管理员为每个用户都在目录表中建立一个目录,目录中有两个数据项: 一是用户名,二是用户的公开钥。
② 每一用户都亲自或以某种安全的认证通信在管理者那里为自己的公开钥注册。
③ 用户如果由于自己的公开钥用过的次数太多或由于与公开钥相关的秘密钥已被泄露,则可随时用新密钥替换现有的密钥。
④ 管理员定期公布或定期更新目录表。例如,像电话号码本一样公布目录表或在发行量很大的报纸上公布目录表的更新。
⑤ 用户可通过电子手段访问目录表,这时从管理员到用户必须有安全的认证通信。
本方案的安全性虽然高于公开发布的安全性,但仍易受攻击。如果敌手成功地获取管理员的秘密钥,就可伪造一个公钥目录表,以后既可假冒任一用户又能监听发往任一用户的消息。而且公用目录表还易受到敌手的窜扰。
**3. 公钥管理机构**
如果在公钥目录表中对公钥的分配施加更严密的控制,安全性将会更强。与公用目录表类似,这里假定有一个公钥管理机构来为各用户建立、维护动态的公钥目录,但同时对系统提出以下要求,即:每个用户都可靠地知道管理机构的公开钥,而只有管理机构自己知道相应的秘密钥。
公钥的分配步骤如下图所示:
![](files/2018-04-11-09-53-16.png)
① 用户A向公钥管理机构发送一个带时戳的消息消息中有获取用户B的当前公钥的请求。
② 管理机构对A的请求作出应答应答由一个消息表示该消息由管理机构用自己的秘密钥$SK_{AU}$加密因此A能用管理机构的公开钥解密并使A相信这个消息的确是来源于管理机构。
应答的消息中有以下几项:
- B的公钥$PK_B$A可用之对将发往B的消息加密
- A的请求用于A验证收到的应答的确是对相应请求的应答且还能验证自己最初发出的请求在被管理机构收到以前是否被篡改
- 最初的时戳以使A相信管理机构发来的消息不是一个旧消息因此消息中的公开钥的确是B当前的公钥。
③ A用B的公开钥对一个消息加密后发往B这个消息有两个数据项: 一是A的身份IDA二是一个一次性随机数$N_1$,用于惟一地标识这次业务。
④ B以相同方式从管理机构获取A的公开钥与步骤①、②类似。这时A和B都已安全地得到了对方的公钥所以可进行保密通信。然而他们也许还希望有以下两步以认证对方。
⑤ B用$PK_A$对一个消息加密后发往A该消息的数据项有A的一次性随机数$N_1$和B产生的一个一次性随机数$N_2$。因为只有B能解密③的消息所以A收到的消息中的N1可使其相信通信的另一方的确是B。
⑥ A用B的公开钥对$N_2$加密后返回给B可使B相信通信的另一方的确是A。
以上过程共发送了7个消息其中前4个消息用于获取对方的公开钥。用户得到对方的公开钥后保存起来可供以后使用这样就不必再发送前4个消息了然而还必须定期地通过密钥管理中心获取通信对方的公开钥以免对方的公开钥更新后无法保证当前的通信。
**公钥证书**
上述公钥管理机构分配公开钥时也有缺点,由于每一用户要想和他人联系都需求助于管理机构,所以管理机构有可能成为系统的瓶颈,而且由管理机构维护的公钥目录表也易被敌手窜扰。
分配公钥的另一方法是公钥证书用户通过公钥证书来互相交换自己的公钥而无须与公钥管理机构联系。公钥证书由证书管理机构CA(certificate authority)为用户建立其中的数据项有与该用户的秘密钥相匹配的公开钥及用户的身份和时戳等所有的数据项经CA用自己的秘密钥签字后就形成证书即证书的形式为$C_A=E_{SK_{CA}}[T,ID_A,PK_A]$其中IDA是用户A的身份$PK_A$是A的公钥T是当前时戳$SK_{CA}$是CA的秘密钥$C_A$即是为用户A产生的证书。产生过程如图所示。用户可将自己的公开钥通过公钥证书发给另一用户接收方可用CA的公钥$PK_{CA}$对证书加以验证,即
$D_{PK_{CA}}[C_A]=D_{PK_{CA}}[E_{SK_{CA}}[T,ID_A,PK_A]]=(T,ID_A,PK_A)$
![](files/2018-04-11-16-38-23.png)
证书的产生过程
因为只有用CA的公钥才能解读证书接收方从而验证了证书的确是由CA发放的且也获得了发送方的身份IDA和公开钥PKA。时戳T为接收方保证了收到的证书的新鲜性用以防止发送方或敌方重放一旧证书。因此时戳可被当作截止日期证书如果过旧则被吊销。
#### 8.2.2 用公钥加密分配单钥密码体制的密钥
公开钥分配完成后,用户就可用公钥加密体制进行保密通信。然而由于公钥加密的速度过慢,以此进行保密通信不太合适,但用于分配单钥密码体制的密钥却非常合适。
1. 简单分配
图5.6表示简单使用公钥加密算法建立会话密钥的过程如果A希望与B通信可通过以下几步建立会话密钥
① A产生自己的一对密钥{PKA,SKA}并向B发送PKA||IDA其中IDA表示A的身份。
② B产生会话密钥KS并用A的公开钥PKA对KS加密后发往A。
③ A由DSKA[EPKA[KS]]恢复会话密钥。因为只有A能解读KS所以仅A、B知道这一共享密钥。
④ A销毁{PKA,SKA}B销毁PKA。
![](files/2018-04-11-16-40-40.png)
简单使用公钥加密算法建立会话密钥
A、B现在可以用单钥加密算法以$K_S$作为会话密钥进行保密通信,通信完成后,又都将$K_S$销毁。这种分配法尽管简单但却由于A、B双方在通信前和完成通信后都未存储密钥因此密钥泄露的危险性为最小且可防止双方的通信被敌手监听。
这一协议易受到主动攻击如果敌手E已接入A、B双方的通信信道就可通过以下不被察觉的方式截获双方的通信
① 与上面的步骤①相同。
② E截获A的发送后建立自己的一对密钥$\{PK_E,SK_E\}$,并将$PK_E||ID_A$发送给B。
③ B产生会话密钥$K_S$后,将$E_{PK_E}[K_S]$发送出去。
④ E截获B发送的消息后由$D_{SK_E}[E_{PK_E}[K_S]]$解读KS。
⑤ E再将$E_{PK_A}[K_S]$发往A。
现在A和B知道$K_S$ ,但并未意识到$K_S$已被E截获。A、B在用$K_S$通信时E就可以实施监听。
2. 具有保密性和认证性的密钥分配
图中所示的密钥分配过程具有保密性和认证性,因此既可防止被动攻击,又可防止主动攻击。
![](files/2018-04-11-17-04-37.png)
假定A、B双方已完成公钥交换可按以下步骤建立共享会话密钥
① A用B的公开钥加密A的身份$ID_A$和一个一次性随机数$N_1$后发往B其中$N_1$用于惟一地标识这一业务。
② B用A的公开钥$PK_A$加密A的一次性随机数$N_1$和B新产生的一次性随机数$N_2$后发往A。因为只有B能解读①中的加密所以B发来的消息中$N_1$的存在可使A相信对方的确是B。
③ A用B的公钥$PK_B$对$N_2$加密后返回给B以使B相信对方的确是A。
④ A选一会话密钥$K_S$,然后将$M=E_{PK_B}[E_{SK_A}[K_S]]$发给B其中用B的公开钥加密是为保证只有B能解读加密结果用A的秘密钥加密是保证该加密结果只有A能发送。
⑤ B以$D_{PK_A}[D_{SK_B}[M]]$恢复会话密钥。
#### 8.2.3 Diffie-Hellman密钥交换
Diffie-Hellman密钥交换是W. Diffie和M. Hellman于1976年提出的第一个公钥密码算法已在很多商业产品中得以应用。算法的惟一目的是使得两个用户能够安全地交换密钥得到一个共享的会话密钥算法本身不能用于加、解密。
算法的安全性基于求离散对数的困难性。
![](files/2018-04-11-17-12-47.png)
Diffie-Hellman的密钥交换过程
其中p是大素数a是p的本原根p和a作为公开的全程元素。用户A选择一保密的随机整数$X_A$,并将$Y_A=a^{X_A}\space mod\space p$发送给用户B。类似地用户B选择一保密的随机整数$X_B$,并将$Y_B=a^{X_B}\space mod\space p$发送给用户A。然后A和B分别由$K=(Y_B)^{X_A}\space mod\space p$和
$K=(Y_A)^{X_B}\space mod\space p$计算出的就是共享密钥,这是因为
$$
\begin{align}
(Y_B)^{X_A}\space mod\space p &=(a^{X_B}\space mod\space p)^{X_A}\space mod\space p=(a^{X_B} )^{X_A}\space mod\space p \\
& = a^{X_BX_A}\space mod\space p = (a^{X_A})^{X_B}\space mod\space p \\
& =(a^{X_A}\space mod\space p)^{X_B}\space mod = (Y_A)^{X_B}\space mod\space p \\
\end{align}
$$
![](files/2018-04-12-09-15-13.png)
因$X_A$$X_B$是保密的,敌手只能得到$p$$a$$Y_A$ $Y_B$,要想得到$K$,则必须得到$X_A$$X_B$中的一个,这意味着需要求离散对数。因此敌手求$K$是不可行的。
例如p=97a=5A和B分别秘密选$X_A$=36$X_B$=58并分别计算$Y_A=536\space mod\space 97=50$$Y_B=558\space mod\space 97=44$。在交换$Y_A$$Y_B$后,分别计算
$K= (Y_B)^{X_A\space} mod\space 97=4436\space mod\space 97=75$
$K= (Y_A)^{X_B}\space mod\space 97=5058\space mod\space 97=75$
### 8.3 密钥托管
密钥托管也称为托管加密,其目的是保证对个人没有绝对的隐私和绝对不可跟踪的匿名性,即在强加密中结合对突发事件的解密能力。其实现手段是把已加密的数据和数据恢复密钥联系起来,数据恢复密钥不必是直接解密的密钥,但由它可得解密密钥。数据恢复密钥由所信任的委托人持有,委托人可以是政府机构、法院或有契约的私人组织。一个密钥可能是在数个这样的委托人中分拆。调查机构或情报机构通过适当的程序,如获得法院证书,从委托人处获得数据恢复密钥。
密钥托管加密技术提供了一个备用的解密途径,政府机构在需要时,可通过密钥托管技术解密用户的信息,而用户的密钥若丢失或损坏,也可通过密钥托管技术恢复自己的密钥。所以这个备用的手段不仅对政府有用,而且对用户自己也有用。
#### 8.3.1 美国托管加密标准简介
1993年4月美国政府为了满足其电信安全、公众安全和国家安全提出了托管加密标准EES(escrowed encryption standard),该标准所使用的托管加密技术不仅提供了强加密功能,同时也为政府机构提供了实施法律授权下的监听功能。这一技术是通过一个防窜扰的芯片(称为Clipper芯片)来实现的。
它有两个特性:
① 一个加密算法——Skipjack算法该算法是由NSA设计的用于加密用户间通信的消息。该算法已于1998年3月公布。
② 为法律实施提供“后门”的部分——法律实施存取域LEAF(law enforcement access field)。通过这个域,法律实施部门可在法律授权下,实现对用户通信的解密。
**1. Skipjack算法**
Skipjack算法是一个单钥分组加密算法密钥长80比特输入和输出的分组长均为64比特。可使用4种工作模式电码本模式密码分组链接模式64比特输出反馈模式1、8、16、32或64比特密码反馈模式。
算法的内部细节在向公众公开以前政府邀请了一些局外人士对算法作出评价并公布了评价结果。评价结果认为算法的强度高于DES并且未发现陷门。Skipjack的密钥长是80比特比DES的密钥长24比特因此通过穷搜索的蛮力攻击比DES多224倍的搜索。所以若假定处理能力的费用每18个月减少一半那么破译它所需的代价要1.5×24=36年才能减少到今天破译DES的代价。
**2. 托管加密芯片**
Skipjack算法以及在法律授权下对加密结果的存取是通过防窜扰的托管加密芯片来实现的。芯片装有以下部分
- Skipjack算法
- 80比特的族密钥KF(family key),同一批芯片的族密钥都相同;
- 芯片单元识别符UID(unique identifier);
- 80比特的芯片单元密钥KU(unique key),它是两个80比特的芯片单元密钥分量(KU1,KU2)的异或;
- 控制软件。
这些部分被固化在芯片上。编程过程是在由两个托管机构的代表监控下的安全工厂中进行的,一段时间一批。
![](files/2018-04-12-09-23-54.png)
首先托管机构的代表通过向编程设备输入两个参数随机数对芯片编程处理器初始化。芯片编程处理器对每个芯片分别计算以上两个初始参数和UID的函数作为单元密钥的两个分量$KU_1$和$KU_2$。求$KU_1$ $XOR$ $KU_2$作为芯片单元密钥KU。UID和KU放在芯片中。然后用分配给托管机构1的密钥$K_1$加密$KU_1$得$EK_1(KU_1)$。类似地用分配给托管机构2的加密密钥$K_2$加密$KU_2$得$EK_2(KU_2)$。$(UID,EK_1(KU_1))$和$(UID,EK_2(KU_2))$分别给托管机构1和托管机构2并以托管形式保存。以加密方式保存单元密钥分量是为了防止密钥分量被窃或泄露。
编程过程结束后,编程处理器被清除,以使芯片的单元密钥不能被他人获得或被他人计算,只能从两个托管机构获得加了密的单元密钥分量,并且使用特定的政府解密设备来解密。
**3.用托管加密芯片加密**
通信双方为了使用Skipjack算法加密他们的通信,都必须有一个装有托管加密芯片的安全的防窜扰设备,该设备负责实现建立安全信道所需的协议,包括协商或分布用于加密通信的80比特秘密会话密钥KS。例如,会话密钥可使用Diffie-Hellman密钥协商协议,该协议执行过程中,两个设备仅交换公共值即可获得公共的秘密会话密钥。
80比特的会话密钥KS建立后被传送给加密芯片用于与初始化向量IV由芯片产生一起产生LEAF。控制软件使用芯片单元密钥KU加密KS然后将加密后的结果和芯片识别符UID、认证符A链接再使用公共的族密钥KF加密以上链接的结果而产生LEAF。
![](files/2018-04-12-09-29-07.png)
最后将IV和LEAF传递给接收芯片用于建立同步。同步建立后会话密钥就可用于通信双方的加解密。对语音通信,消息串语音首先应被数字化。下图显示的是在发送者的安全设备和接收者的安全设备之间传送LEAF以及用会话密钥KS加密明文消息hello的过程。图中未显示初始向量。
![](2018-04-12-09-40-24.png)
在双向通信如电话通信每一方的安全设备都需传送一个IV和由其设备芯片计算出的LEAF。然后两个设备使用同一会话密钥KS来加密传送给通信对方的消息并解密由对方传回的消息。
**4. 法律实施存取**
政府机构在进行犯罪调查时为了监听被调查者的通信首先必须取得法院的许可证书并将许可证书出示给通信服务的提供者电信部门并从电信部门租用线路用来截取被监听者的通信。如果被监听者的通信是经过加密的则被截获的通信首先通过一个政府控制的解密设备如上一张图所示其中D表示解密。解密设备可识别由托管芯片加密的通信取出LEAF和IV并使用族密钥KF解密LEAF以取出芯片识别符UID和加密的会话密钥$E_{KU}(KS)$。
政府机构将芯片识别符UID、法院许可监听的许可证书、解密设备的顺序号以及政府机构对该芯片的单元密钥分量的要求一起给托管机构。托管机构在收到并验证政府机构传送的内容后将被加密的单元密钥分量$E_{K_1}(KU_1)$和$E_{K_2}(KU_2)$传送给政府机构的解密设备,解密设备分别使用加密密钥$K_1$和$K_2$解密$E_{K_1}(KU_1)$和$E_{K_2}(KU_2)$以得到$KU_1$、$KU_2$,求它们的异或$KU_1\space XOR\space KU_2$,即为单元密钥$KU$。由单元密钥$KU$解密$E_{KU}(KS)$得被调查者的会话密钥KS。最后解密设备使用KS解密被调查者的通信。为了实现解密解密设备在初始化阶段应安装族密钥KF和密钥加密密钥$K_1$、$K_2$。
托管机构在传送加密的密钥分量时也传送监听的截止时间。因此解密设备的设计应使得它到截止时间后可自动销毁芯片单元密钥及用于得到单元密钥的所有信息。同时因为每一次新的会话用一新的会话密钥加密所以解密设备在监听的截止时间之前在截获调查者新的会话时可不经过托管机构而直接从LEAF中提取并解密会话密钥。因此除在得到密钥时可有一个时间延迟外对被截获通信的解密也可在监听的有效期内有一个时间延迟。这种时间延迟对有些案情极为重要如监听进行绑架的犯罪分子或监听有计划的恐怖活动。
因为被调查的通信双方使用相同的会话密钥所以解密设备不需要对通信双方都取出LEAF及芯片单元密钥解密设备只需取出被调查者一方的LEAF及芯片单元密钥。如果某人想监听他人的通信他必须首先能够截获他人的通信然后必须有一个解密设备和两个经过加密的芯片单元密钥分量。因为制造解密设备必须知道保密算法、族密钥KF和密钥加密密钥K1、K2任何未经授权的人都不可能私自制造出解密设备因此无法获得对他人的监听。
#### 8.3.2 密钥托管密码体制的组成成分
EES提出以后密钥托管密码体制受到了普遍关注已提出了各种类型的密钥托管密码体制包括软件实现的、硬件实现的、有多个委托人的、防用户欺诈的、防委托人欺诈的等。密钥托管密码体制从逻辑上可分为3个主要部分用户安全成分USC(user security component)、密钥托管成分KEC(key escrow component)和数据恢复成分DRC(data recovery component)。三者的关系如图5.12所示USC用密钥KS加密明文数据并且在传送密文时一起传送一个数据恢复域DRFdata recovery field。DRC使用包含在DRF中的信息及由KEC提供的信息恢复明文。
![](files/2018-04-12-09-48-05.png)
用户安全成分USC是提供数据加解密能力以及支持密钥托管功能的硬件设备或软件程序。USC可用于通信和数据存储的密钥托管通信情况包括电话通信、电子邮件及其他一些类型的通信由法律实施部门在获得法院对通信的监听许可后执行对突发事件的解密。数据的存储包括简单的数据文件和一般的存储内容突发解密由数据的所有者在密钥丢失或损坏时进行或者由法律实施部门在获得法院许可证书后对计算机文件进行。USC使用的加密算法可以是保密的、专用的,也可以是公钥算法。
密钥托管成分KEC用于存储所有的数据恢复密钥通过向DRC提供所需的数据和服务以支持DRC。KEC可以作为密钥管理系统的一部分密钥管理系统可以是单一的密钥管理系统如密钥分配中心,也可以是公钥基础设施。如果是公钥基础设施托管代理机构可作为公钥证书机构。托管代理机构也称为可信赖的第三方负责操作KEC可能需要在密钥托管中心注册。密钥托管中心的作用是协调托管代理机构的操作或担当USC或DRC的联系点。
数据恢复成分DRC是由KEC提供的用于通过密文及DRF中的信息获得明文的算法、协议和仪器。它仅在执行指定的已授权的恢复数据时使用。要想恢复数据DRC必须获得数据加密密钥而要获得数据加密密钥则必须使用与收发双方或其中一方相联系的数据恢复密钥。如果只能得到发送方托管机构所持有的密钥DRC还必须获得向某一特定用户传送消息的每一方的被托管数据此时可能无法执行实时解密尤其是在各方位于不同的国家并使用不同的托管代理机构时。
如果DRC只能得到收方托管机构所持有的密钥则对从某一特定用户发出的所有消息也可能无法实时解密。如果能够使用托管代理机构所持有的密钥恢复数据那么DRC一旦获得某一特定USC所使用的密钥就可对这一USC发出的消息或发往这一USC的消息实时解密。对两方同时通信如电话通信的情况如果会话双方使用相同的数据加密密钥系统就可实时地恢复加密数据。
### 8.4 秘密分割
在导弹控制发射、重要场所通行检验等情况下,通常必须由两人或多人同时参与才能生效,这时都需要将秘密分给多人掌管,并且必须有一定人数的掌管秘密的人同时到场才能恢复这一秘密。
由此引入门限方案threshold schemes的一般概念。
#### 8.4.1 秘密分割门限方案
定义设秘密s被分成n个部分信息每一部分信息称为一个子密钥或影子由一个参与者持有使得
① 由k个或多于k个参与者所持有的部分信息可重构s。
② 由少于k个参与者所持有的部分信息则无法重构s。
则称这种方案为(k,n)-秘密分割门限方案k称为方案的门限值。
如果一个参与者或一组未经授权的参与者在猜测秘密s时并不比局外人猜秘密时有优势
③由少于k个参与者所持有的部分信息得不到秘密s的任何信息。
则称这个方案是完善的,即(k,n)-秘密分割门限方案是完善的。
下面介绍最具代表性的两个秘密分割门限方案。
#### 8.4.2 Shamir门限方案
Shamir门限方案是基于多项式的Lagrange插值公式的。插值是古典数值分析中的一个基本问题问题如下已知一个函数$\varphi(x)$在k个互不相同的点的函数值$\varphi(x_i)(i=1,2,...,k)$,寻求一个满足$f(x_i)=\varphi (x_i)(i=1,2,...,k)$的函数$f(x)$,用来逼近$\varphi(x)$。$f(x)$称为$\varphi (x)$的插值函数,$f(x)$可取自不同的函数类,既可为代数多项式,也可为三角多项式或有理分式。若取$f(x)$为代数多项式,则称差值问题为代数插值,$f(x)$称为$\varphi (x)$的插值多项式。常用的代数插值有Lagrange插值、Newton插值、Hermite插值。
**Lagrange插值**
已知$\varphi(x)$在k个互不相同的点的函数值$\varphi(x_i)(i=1,2,...,k)$可构造k-1次插值多项式为
$$f(x)=\sum_{j=1}^{k}\varphi(x_j)\prod_{i=1,i\neq j}^{k}\frac{x-x_i}{x_j-x_i}$$
这个公式成为Lagrange插值公式。
上述问题也可认为是已知k-1次多项式$f(x)$的k个互不相同的点的函数值$f(x_i)(i=1,2,...,k)$,构造多项式$f(x)$。若把密钥s取作$f(0)$n个子密钥取作$f(x_i)(i=1,2,...,n)$那么利用其中的任意k个子密钥可重构$f(x)$从而可得到密钥s这种(k,n)-秘密分割门限方案就是Shamir门限方案。
这种门限方案也可按如下更一般的方式来构造。设$GF(q)$是一有限域,其中$q$是一大素数,满足$q≥n+1$,秘密$s$是在$GF(q)\space\{0\}$上均匀选取的一个随机数,表示为$s∈_RGF(q)\space \{0\}$。$k-1$个系数$a_1,a_2,…,a_{k-1}$的选取也满足$a_i∈_RGF(q)\space \{0\}(i=1,2,…,k-1)$。在$GF(q)$上构造一个$k-1$次多项式
$f(x)=a_0+a_1x+...+a_{k-1}x^{k-1}$
n个参与者记为$P_1,P_2,...,P_n,P_i$分配到的子密钥为$f(i)$。如果任意$k$个参与者
$$P_{i_1},...,P_{i_k},(1\leq i_1\leq i_2\leq ...\leq i_k\leq n)$$
要想得到秘密s可使用$\{(i_l,f(i_l))|l=1,…,k\}$构造如下的线性方程组:
$$
\left\{
\begin{array}{c}
a_0+a_1(i_1)+...+a_{k-1}(i_1)^{k-1}=f(i_1) \\
a_0+a_1(i_2)+...+a_{k-1}(i_2)^{k-1}=f(i_2) \\
...... \\
a_0+a_1(i_k)+...+a_{k-1}(i_k)^{k-1}=f(i_k) \\
\end{array}
\right.
$$
因为$i_l(1≤l≤k)$均不相同所以可由Lagrange插值公式构造如下的多项式
$$f(x)=\sum^{k}_{j=i}f(i_j)\prod^{k}_{l=1,l\neq j}\frac{x-i_l}{i_j-i_l}\space mod\space q$$
从而可得秘密$s=f(0)$。
然而参与者仅需知道$f(x)$的常数项$f(0)$而无需知道整个多项式$f(x$),所以仅需以下表达式就可求出$s$
$$s=(-1)^{k-1}\sum^{k}_{j=1}f(i_j)\prod^{k}_{l=1,l\neq j}\frac{i_l}{i_j-i_l}\space mod\space q$$
如果$k-1$个参与者想获得秘密$s$,他们可构造出由$k-1$个方程构成的线性方程组,其中有$k$个未知量。对$GF(q)$中的任一值$s_0$,可设$f(0)=s_0$,这样可得第$k$个方程并由Lagrange插值公式得出$f(x)$。因此对每一$s_0∈GF(q)$都有一个惟一的多项式满足式,所以已知$k-1$个子密钥得不到关于秘密$s$的任何信息,因此这个方案是完善的。
例: 设k=3,n=5,q=19,s=11随机选取$a_1=2$$a_2=7$,得多项式为
$f(x)=(7x^2+2x+11)\space mod\space 19$
分别计算
$f(1)=(7+2+11)\space mod\space 19=20\space mod\space 19=1$
$f(2)=(28+4+11)\space mod\space 19=43\space mod\space 19=5$
$f(3)=(63+6+11)\space mod\space 19=80\space mod\space 19=4$
$f(4)=(112+8+11)\space mod\space 19=131\space mod\space 19=17$
$f(5)=(175+10+11)\space mod\space 19=196\space mod\space 19=6$
得5个子密钥。
如果知道其中的3个子密钥$f(2)=5,f(3)=4,f(5)=6$,就可按以下方式重构$f(x)$
$$
\begin{align}
5\times \frac{(x-3)(x-5)}{(2-3)(2-5)}&=5\times\frac{(x-3)(x-5)}{3}=5\times(3^{-1}\space mod\space 19)\times(x-3)(x-5) \\
& = 5\times 13\times (x-3)(x-5)=65(x-3)(x-5)
\end{align}
$$
$$
\begin{align}
4\times \frac{(x-2)(x-5)}{(3-2)(3-5)}&=4\times\frac{(x-2)(x-5)}{-2}=4\times((-2)^{-1}\space mod\space 19)\times(x-2)(x-5) \\
& = 4\times 9\times (x-2)(x-5)=36(x-2)(x-5)
\end{align}
$$
$$
\begin{align}
6\times \frac{(x-2)(x-3)}{(5-2)(5-3)}&=6\times\frac{(x-2)(x-3)}{6}=6\times(6^{-1}\space mod\space 19)\times(x-2)(x-3) \\
& = 6\times 16\times (x-2)(x-3)=96(x-2)(x-3)
\end{align}
$$
所以:
$$
\begin{align}
f(x)&=[65(x-3)(x-5)+36(x-2)(x-2)(x-5)+96(x-2)(x-3)]\space mod\space 19 \\
& =[8(x-3)(x-5)+17(x-2)(x-5)+(x-2)(x-3)]\space mod\space 19 \\
& =(26x^2-188x+296)\space mod\space 19 \\
& =7x^2+2x+11
\end{align}
$$
从而得秘密为$s=11$
#### 8.4.3 基于中国剩余定理的门限方案
设$m_1,m_2,...,m_n$是n个大于1的整数满足
$(m_i,m_j)=1(\forall i,j,i\neq j)$和$m_1m_2...m_k>m_nm_{n-1}...m_{n-k+2}$
又设s是秘密数据满足$m_nm_{n-1}...m_{n-k+2}<s<m_1m_2...m_k$
计算$M=m_1m_2...m_n$$s_i=s\space mod\space m_i\space (i=1,2,...,n)$。以(s_i,m_i,M)作为一个子密钥,集合$\{(s_i,m_i,M)\}^{n}_{i=1}$即构成了一个(k,n)门限方案。
这是因为在k个参与者记为$i_1,i_2,...i_k$)中,每个$i_j$计算
$
\left\{
\begin{array}{l}
M_{i_j}=\frac{M}{m_{i_j}} \\
N_{i_j}\equiv M_{i_j}^{-1}\space mod\space m_{i_j} \\
y_{i_j}=s_{i_j}M_{i_j}N_{i_j} \\
\end{array}
\right.
$
结合起来,根据中国剩余定理可求得
$s=\sum^{k}_{j=1}y_{i_j}\space mod\space \prod^{k}_{j=1}m_{i_j}$
显然若参与者少于k个则无法求出s。

347
doc/CRYPT-9_数字货币.md Normal file
View File

@ -0,0 +1,347 @@
# CRYPT-9 数字货币
## 目录
9.1 数字货币
9.2 比特币的交易原理
9.3 区块链技术在比特币中的运用
### 9.1 数字货币
#### 9.1.1 数字货币与虚拟货币
- 与实物货币相似属性
- 但允许即时交易和无边界转让
- 虚拟货币和加密货币都是数字货币的类型,但相反是不正确的。与传统货币一样,这些货币可用于购买实物商品和服务,但也可能限于某些社区,例如用于在线游戏或社交网络内部使用。
- 虚拟货币
- 一种不受监管的数字货币,通常由其开发人员发布并控制,并在特定虚拟社区的成员中使用和接受
- 一种在某些环境中像货币一样运作的交易媒介,但不具有真实货币的所有属性
#### 9.1.2 虚拟货币与加密货币
- 虚拟货币
- 欧洲中央银行European Central Bank一种不受监管的数字货币通常由其开发商发行并通常由其控制并在特定虚拟社区的成员中使用和接受
- 美国财政部:一种在某些环境中像货币一样运作的交易媒介,但并不具有真实货币的所有属性
- 加密货币
- 一种依赖密码技术的数字代币
- 将令牌传输的数字签名链接在一起
- 点对点网络和
- 权力下放
- 用于创建和管理货币的工作证明
## 9.1.3 加密货币定义
- 一种数字资产,旨在作为使用加密技术的交换媒介来保证交易的安全并控制货币额外单位的创建。
- 假设在相互不信任的环境中工作
- 比特币在2009年成为第一个分散加密货币
- 比特币及其衍生品采用分散控制而不是集中式电子货币/集中银行系统。
- 分散控制与分布式账本角色中比特币区块链交易数据库的使用有关。
![](files/2018-04-10-15-11-18.png)
**典型情况**
- 爱丽丝想买鲍勃的车
- 他们同意与价格100 BTC的鲍勃
- Alice注册交易Alice的余额为-100 BTCBob的余额为+100 BTC
- 如何:
- 确保Alice有足够的资金
- 确保鲍勃不能否认收到付款
- 防止Alice花费同样的钱进行多次交易双重支出
- 防止第三方花费Alice的资金
- 解决方案基于诸如区块链、数字签名交易和工作证明方案等概念
### 9.2 比特币的交易原理
#### 9.2.1 区块链数据库
- 一个开放的分布式数据库,保持有序块不断增长的列表。网络中的所有节点都维护数据库的副本
- 每个块都包含一个时间戳,一个指向前一个块的链接和一个事务列表
- 区块链本身对数据修改具有抵抗力 - 一旦记录,块中的数据不能追溯性地改变
![](files/2018-04-10-15-18-28.png)
#### 9.2.2 凭据校验工作
- 一般来说:
- 难以解决的挑战,但容易检查解决方案
- 产生困难的计算挑战例如NP难题
- 网络中的所有节点试图通过选择要检查的随机解决方案来并行解决问题
- 获胜者创建新块并在网络中传播
- 网络中的每个节点都独立验证块
- 赢家获得bitcons的数量
- 尽管可能,两个节点同时创建新块的概率很低:
- 避免创建替代新块
- 如果创建了两个备选块,则每个参与者都会接受其中一个块
- 挑战的难度始终自动调整以便网络在10分钟内找到新的区块
#### 9.2.3 交易
- 包含比特币数量变化的信息的记录
- 输入:
- 取消付款人提前收到的值
- 输出:
- 支付事件的非交易(交换)
- 支付给收款人的金额,他/她可以用作他/她进一步交易的输入
- 记录由付款人签字
![](files/2018-04-10-15-52-46.png)
#### 9.2.4 如何在比特币系统中发送货币
- 在基本层面上,爱丽丝向鲍勃汇款时,她只是简单地播放一条包含账户和金额的消息 - 从爱丽丝发送5.0 BTC到鲍勃
- 每个接收它的节点都会更新其分类账的副本,然后传递交易消息
- 但是,节点如何确保请求是真实的,只有合法的所有者才能发送消息?
- 电子签名!
- 用户的“账号”是他/她的公钥
![](files/2018-04-10-15-56-02.png)
#### 9.2.5 如何验证您的余额?
- 事实上,根本没有账户余额记录
- 只存在多少用户收到的信息以及他/她早些时候花了多少钱
- 而不是余额,资金的所有权通过与以前交易的链接进行验证
![](files/2018-04-10-15-58-02.png)
#### 9.2.6 交易详情
- 要发送5.0 BTC给BobAlice必须参考其他交易并在其中收到5个或更多比特币
- 这些被引用的事务被称为“输入”。
- 验证此交易的其他节点将检查这些输入以确保Alice实际上是收件人并且输入可累加5个或更多比特币
![](files/2018-04-10-16-00-18.png)
![](files/2018-04-10-16-01-22.png)
#### 9.2.7 所有权传递链
- 此交易参考总共139.6比特币的6个输入
- 在输出部分,注意有两行
- 其中的第一个实际上是作为交易的更改返回给发件人
- 简化规则规定每个输入必须在事务中完全用完
- 如果您要发送的金额与您的某个输入不完全匹配,则需要将剩余金额发回给自己
![](files/2018-04-10-16-04-43.png)
**所有权传递链验证**
- 通过这些参考输入链接,比特币的所有权以一种链式传递,每种交易的有效性取决于以前的交易
- 你如何相信那些以前的交易?
- 你不能,也应该检查他们的输入
- 事实上,当您第一次安装比特币钱包软件时,它会下载所有有史以来的交易,并检查每一笔交易的有效性,直至回到有史以来的第一笔交易
![](files/2018-04-10-16-08-50.png)
**所有权传递链,双重验证**
- 一旦交易使用过一次,它将被视为已用完,并且不能再次使用
- 在验证交易时,除了其他检查外,节点还确保输入尚未用完
- 对于每个输入,节点检查每一个其他事务,以确保输入之前没有被使用过
- 尽管这看起来很耗时因为现在有超过2000万笔交易但它的速度非常快并且有未使用的交易索引
![](files/2018-04-10-16-10-15.png)
找出自己的平衡需要重复所有有史以来的事务,并将所有未使用的输入加起来
#### 9.2.8 没有怜悯的错误
- 因为您没有银行或信用卡公司可以上诉
- 任何“用户错误”错误都可能导致比特币的永久损失,而不仅仅是您自己的帐户,而是比特币经济总体
- 如果您丢失了私钥,与相应公钥相关的任何资金将永远消失
- 由于硬盘崩溃和备份不足,人们可能会丢失私钥,这意味着比特币最终将成为通货紧缩的货币
#### 9.2.9 匿名和身份
- 如果您通过隐藏IP地址的TOR网络访问比特币则可以使用比特币而不会泄露比您的公钥更多的东西
- 为了避免有人将您的交易连接在一起(请记住,它们都公开存储在每台计算机上!),您可以为每个传入交易生成一个新的公钥
- 生成公钥是匿名的,通常与您的真实身份无关,可以离线完成
- 公私密钥对是随机生成的
- 因为有很多不同的可能地址,所以没有理由甚至检查是否有其他人已经拥有该密钥
- 事实上,如果你猜猜别人的钥匙,你就可以获得他们的钱!
### 9.3 区块链技术在比特币中的运用
#### 9.3.1 比特币的双倍支出
- 通过验证数字签名,我们知道只有真正的所有者才能创建交易消息
- 为了确保发件人真的有钱可花,我们还检查每个参考输入,确保它没有花销
- 但系统中仍然存在一个大的安全漏洞,可能会导致“未使用的检查”不可靠,这与交易顺序有关。
![](files/2018-04-10-16-12-53.png)
#### 9.3.2 检查交易的顺序
- 考虑到事务是通过网络逐个节点传递的,所以不能保证你接收它们的顺序代表它们被创建的顺序
- 你不应该相信时间戳,因为人们可以很容易地说出创建交易的时间
- 与贝宝等中央系统对比,中央计算机很容易跟踪交易顺序
![](files/2018-04-10-16-12-53.png)
#### 9.3.3 交易订单
- 您无法确定一笔交易是否先于另一笔交易,并且这可能导致欺诈行为
- 例如恶意用户Alice可以发送给Bob的交易等待Bob发送产品然后将引用相同“输入”的另一个交易发回给自己。
- 由于传播时间的差异网络上的一些节点会在Bob之前收到第二个“双重支出”交易。
- 当鲍勃的交易到达时,他们会认为它无效,因为它试图重复使用输入。
- 总的来说整个网络中Bob或Alice是否有这笔钱会有分歧因为没有办法证明哪个交易是先发生的
![](files/2018-04-10-16-16-30.png)
#### 9.3.4 用区块链技术解决问题
**区块链:交易顺序**
- 整个网络需要有一种方式来就交易顺序达成一致
- 比特币的解决方案是通过一种数学竞赛来确定和保护订单的聪明方式
- 比特币系统通过将交易放置在称为块的组中并将这些块链接在一起称为块链的交易中来对交易进行订购
- 请注意,这与交易链不同
- 区块链用于订购交易,而交易链则记录所有权如何变化
![](files/2018-04-10-16-20-27.png)
**区块链**
每个块都有一个对前一个块的引用,这就是将一个块一个接一个地放在一个块中的情况。
- 可以将引用向后遍历到有史以来的第一组事务。
- 在同一个块中的事务被认为具有发生在同一时间,并且尚未在一个区块中的交易被称为“未确认”,或无序
![](files/2018-04-10-16-32-00.png)
- 任何节点都可以将一组未确认的交易收集到一个块中,并将其广播到网络的其余部分,作为链中下一个块的内容的建议
- 由于多人可以同时创建区块,因此可能有多种选择可供选择,因此网络如何决定下一个应该选择哪个区块?
- 我们不能依赖块到达的顺序,因为正如上面的交易所解释的那样,它们可能会在网络中的不同点上以不同的顺序到达
![](files/2018-04-10-16-31-30.png)
**创建新的块**
- 每个有效的块必须包含一个非常特殊的数学问题的答案
- 通过散列函数32字节SHA256运行块的整个文本以及额外的随机猜测直到输出低于某个阈值
- 整个比特币网络中的每台计算机都有猜测数字平均需要10分钟才能找到解决方案
- 第一个解决数学问题的人广播他们的区块,并将他们的交易组接受为链中的下一个。数学问题中的随机性在人们找到解决方案时有效地展开,使得两个人不可能同时解决它
**多个分支**
- 然而,偶尔会同时解决多个区块,导致多个可能的分支
- 在这种情况下,您只需构建您收到的第一个。其他人可能以不同的顺序接收了这些块,并且将在他们收到的第一个块上构建
![](files/2018-04-10-16-38-12.png)
- 当有人解决另一个块时,领带被破坏
- 您总是立即切换到可用的最长分支
- 在同一时间解决问题的情况很少
- 区块链在整个网络中迅速稳定
![](files/2018-04-10-16-40-23.png)
**区块链中的双重支出**
- 链条末端存在一些不明确的事实对交易安全性有重要影响
- 例如,如果您的交易发现自己位于其中一个较短的分支中,则它将在区块链中失去其位置
- 这意味着它只会回到未确认的交易池中,并被包含在后面的块中
- 这打开了双重打击的攻击之门
例如:
- 一个骗子,爱丽丝,把钱汇给鲍勃
- 鲍勃然后等待交易“确认”到区块链中,然后发货
- 现在因为节点总是切换到更长的分支所以如果Alice可以生成一个更长的分支将Bob的交易替换为其他人那么他的钱将被有效地清除
- 鲍勃的交易最初将被扔回未经确认的游泳池
- 但是由于Alice用另一个使用相同输入的事务取代了它节点现在会认为Bob的事务是无效的因为它引用了已经用完的输入
![](files/2018-04-10-16-48-05.png)
**双重支出的预防**
- 你可能认为Alice可以在恰当的时间预先计算一系列块以在网络上弹出但每个块中的数学拼图实际上可以防止这种情况发生
- 一旦她想要构建的块被解决,她就只能开始解决块,并且其散列值是已知的
- 因此,她与网络的其他部门进行竞赛,直到鲍勃运送产品,这是她想要展示更长时间的分支时
- 她必须私下工作,因为如果鲍勃听说她的双重消费块,他显然不会运送产品
- 最后一个问题是如果Alice拥有一台速度非常快的电脑或者可能是一间装满电脑的房间Alice是否能够超越所有人
- 即使有数千台电脑,她也不可能赢得解决障碍的比赛,因为她不是在竞争任何一台电脑,而是整个网络
- 她需要控制整个网络总计算能力的一半才有50的机会在别人面前解决问题
![](files/2018-04-10-16-50-52.png)
- 区块链中的交易受数学难题保护
- 一个攻击者攻击整个网络的其余部分
- 各个块之间相互建立的结果是,进一步返回链中的交易更加安全
- 该系统在链条末端容易受到双重支出攻击,这就是为什么建议在考虑收到最终资金之前等待几个块的原因
![](files/2018-04-10-16-54-18.png)
**不需要信任**
- 令人惊讶的是,迄今为止没有任何描述需要任何信任
- 当您从比特币网络中的陌生人处收到信息时,您可以检查自己的区块解决方案是否正确
- 因为数学问题太难了,你知道攻击者无法自己产生它们
- 这些解决方案证明了整个网络的计算能力得以实现
#### 9.3.5 新的比特币从哪里来?
- 为了汇款,您必须参考以前的交易,您之前是否是收款人,但硬币首先如何进入这个所有权链?
- 作为慢慢随机生成和分配硬币的一种方式,给予任何人解决方块的“奖励”
- 这就是为什么解决块被称为挖掘尽管它的真正目的是验证交易并保护块链每4年块奖励减半所以最终不会有更多的硬币被释放
- 总共将创造约2100万个
- 除了块奖励之外,矿工还可以获得交易中可选择的任何交易费用。
- 现在,矿工将包括没有费用的交易,因为他们的主要动机是块奖励,
- 但在未来,交易可能会按照附加费的顺序处理,没有费用的交易可能会被忽略。
- 以比特币发送资金可能不会免费,但希望仍然比目前的信用卡收费便宜
#### 9.3.6 挖掘池
- 平均而言,典型的计算机需要几年时间才能解决问题
- 一个人在网络其他部分通常需要10分钟之前解决问题的几率非常低
- 为了获得稳定的收入来源,许多人加入了被称为采矿池的团体,这些团体共同努力解决块问题,并根据贡献的工作分配奖励
- 这些行为有点像同事中的彩票池除了其中一些矿池非常大并且占网络中所有计算机的20以上
- 这些池中有一些如此之大的事实对安全性有一些重要的影响
- 攻击者不太可能以比网络其余部分快得多的速度连续地解决数个方块,但这是可能的,并且随着攻击者的处理能力与网络其他部分成比例地增加
- 事实上其中一个挖矿公司BTC Guild已经自行完成了6个区块并且自愿限制其成员避免对整个比特币网络的不信任
**矿池最终会趋向全部挖空**
![](files/2018-04-10-16-59-10.png)
#### 9.3.7 建议的等待时间
- 目前的建议是等待交易至少进入一个区块,或者获得一个确认,然后再考虑最终的交易
- 对于较大的交易等待至少6个或更多的块
#### 9.3.8 确认时间
- 按设计每个块需要大约10分钟才能解决因此等待6个街区需要大约一个小时
- 与信用卡交易需要几秒钟的时间相比,等待这一长时间以确认可能看起来很繁琐
- 但是,请记住,信用卡客户可以在几个月后申请盗用的卡从商家撤销费用(称为退款)
- 这样一来,从商家的角度来看,比特币实际上要快得多
- 选择10分钟的特定选择以避免不稳定性和延迟的确认时间
- 随着更多的计算机加入网络,专用硬件专为采矿而设计,模块解决时间将变得非常短
- 为了补偿计算时间上的变化每两周比特币软件将数学问题的难度重新标定为10分钟
### 结论
- 比特币是由同行网络维护的受数学保护的数字货币
- 数字签名授权单个交易,通过交易链传递所有权,以及在区块链中保护的交易的顺序
- 通过要求每个块能够解决困难的数学问题,潜在的攻击者在计算竞赛中与网络的其余部分进行对抗,他们不太可能获胜
![](files/2018-04-10-17-01-38.png)

BIN
doc/files/1-1-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
doc/files/1-2-1-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
doc/files/1-2-1-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
doc/files/1-2-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
doc/files/1-2-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
doc/files/1-3-10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
doc/files/1-3-11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
doc/files/1-3-12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

BIN
doc/files/1-3-13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
doc/files/1-3-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
doc/files/1-3-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
doc/files/1-3-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

BIN
doc/files/1-3-6-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
doc/files/1-3-6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
doc/files/1-3-7-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
doc/files/1-3-7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
doc/files/1-3-9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

BIN
doc/files/1-4-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

BIN
doc/files/1-4-2-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
doc/files/1-4-2-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
doc/files/1-4-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
doc/files/1-4-3-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
doc/files/1-4-3-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
doc/files/1-4-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

BIN
doc/files/1-4-4-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

BIN
doc/files/1-4-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
doc/files/1-4-5-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

BIN
doc/files/1-4-5-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

BIN
doc/files/1-4-5-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

BIN
doc/files/1-4-5-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

BIN
doc/files/1-4-5-6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
doc/files/1-4-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

BIN
doc/files/1-4-7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
doc/files/1532172224.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
doc/files/1532172225.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
doc/files/2-1-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
doc/files/2-1-2-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
doc/files/2-1-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
doc/files/2-1-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
doc/files/2-1-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

BIN
doc/files/2-2-1-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
doc/files/2-2-1-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
doc/files/2-2-1-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
doc/files/2-2-1-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
doc/files/2-2-1-6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
doc/files/2-2-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
doc/files/2-3-1-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

BIN
doc/files/2-3-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
doc/files/2-4-1-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
doc/files/2-4-1-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
doc/files/2-4-1-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
doc/files/2-4-1-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
doc/files/2-4-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
doc/files/2-4-2-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
doc/files/2-4-2-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
doc/files/2-4-2-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

BIN
doc/files/2-4-2-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
doc/files/2-4-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
doc/files/2-4-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
doc/files/2-4-4-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
doc/files/2-4-4-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
doc/files/2-4-4-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
doc/files/2-4-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
doc/files/2-4-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
doc/files/2-5-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
doc/files/2-5-4-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Some files were not shown because too many files have changed in this diff Show More