This commit is contained in:
firmianay 2019-02-25 22:15:43 +08:00
parent 2dc03dbe1f
commit bdaa04887a
12 changed files with 168 additions and 161 deletions

View File

@ -58,6 +58,7 @@ CC BY-SA 4.0
支付宝:![](https://github.com/firmianay/CTF-All-In-One/blob/master/myAlipay.jpg)
微信(加好友请标注“github”)![](https://github.com/firmianay/CTF-All-In-One/blob/master/myWechat.jpg)
- 2018-12-04 微信 长点心吧 ¥10
- 2018-12-17 微信 tjw ¥10
- 2019-01-27 微信 Yimin Zhang ¥99
- 2018-12-04 长点心吧 ¥10
- 2018-12-17 tjw ¥10
- 2019-01-27 Yimin Zhang ¥99
- 2019-02-25 *孟达 ¥100

View File

@ -29,6 +29,15 @@ GitHub 地址:<https://github.com/firmianay/CTF-All-In-One>
* [1.5.11 jemalloc](doc/1.5.11_jemalloc.md)
* [1.5.12 MIPS 汇编基础](doc/1.5.12_mips.md)
* [1.6 密码学基础](doc/1.6_crypto_basic.md)
* [1.6.1 密码学导论](doc/1.6.1_crypto_intro.md)
* [1.6.2 流密码](doc/1.6.2_stream_cipher.md)
* [1.6.3 分组密码](doc/1.6.3_block_cipher.md)
* [1.6.4 公钥密码](doc/1.6.4_asymmetric.md)
* [1.6.5 消息认证和哈希函数](doc/1.6.5_hash.md)
* [1.6.6 数字签名](doc/1.6.6_signature.md)
* [1.6.7 密码协议](doc/1.6.7_protocol.md)
* [1.6.8 密钥分配与管理](doc/1.6.8_key_distribution.md)
* [1.6.9 数字货币](doc/1.6.9_digital_currency.md)
* [1.7 Android 安全基础](doc/1.7_android_basic.md)
* [1.7.1 Android 环境搭建](doc/1.7.1_android_env.md)
* [1.7.2 Dalvik 指令集](doc/1.7.2_dalvik.md)

View File

@ -1,13 +1,21 @@
# CRYPT-1 密码学导论
# 1.6.1 密码学导论
**author:Odyssey@cyberpeace**
## 知识点
- [密码学基本思想](#密码学基本思想)
- [密码学分类](#密码学分类)
- [古典密码学](#古典密码学)
- [单表置换密码](#单表置换密码)
- [多表置换密码](#多表置换密码)
### 知识点
- 密码体制
- 古典密码
- 密码安全性
## 学习目标
### 学习目标
- 掌握密码技术的基本思想
- 掌握密码体制的组成结构
- 熟悉置换、代替和代数等古典密码的编码方法
@ -15,16 +23,7 @@
- 掌握密码安全性的概念
- 了解密码在信息安全领域的实际应用
## 目录
1.1 密码学基本思想
1.2 密码体制组成
1.3 古典密码学
1.4 单表置换密码
1.5 多表置换密码
### 1.1 密码学基本思想
### 密码学基本思想
**为什么会有密码学**
![](files/1-1-1.png)
@ -49,7 +48,7 @@
- 可证明安全性
- 无条件安全性
### 1.2 密码学分类
### 密码学分类
- 密码使用学
- 密码分析学
@ -99,7 +98,7 @@ $$D_{PK_B}(E_{PK_B}(X))\neq X$$
![](files/1-2-4.png)
### 1.3 古典密码学
### 古典密码学
#### 1.3.1 古今密码学
@ -118,7 +117,7 @@ $$D_{PK_B}(E_{PK_B}(X))\neq X$$
- ADFGVX密码
- Enigma密码机
### 1.4 单表置换密码
### 单表置换密码
#### 1.4.1 凯撒密码
@ -143,6 +142,7 @@ $$D_{PK_B}(E_{PK_B}(X))\neq X$$
![](files/1-3-4.png)
### 小实验
破解一个凯撒密码
密文GR BRXO LNHF UBSWRJUDSKB
@ -152,6 +152,7 @@ https://planetcalc.com/1434/
```
### 1.4.2 简单替换密码
将明文中所使用的字母替换为另一套字母表,形成新的对应关系。这种替换可以是任意的一对一关系。
例如:现有一个简单替换密码表
@ -209,6 +210,7 @@ https://quipqiup.com/
```
### 1.4.3 仿射密码
它的加密函数是$C=(aM+b) mod\space 26$,其中
- 数字对ab为密钥
- a和26互素$gcd(a,26)=1$
@ -246,11 +248,13 @@ $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)
@ -303,7 +307,7 @@ Hill密码证明和求逆主要参考线性代数知识。
对于单表加密法,破译人员可以通过密文频率分析对密文进行破译,有些需要花费很大的耐心,有些则通过工具可以直接破解。总的来说,这种加密方法还是太过于脆弱,下一节 ,我们将使用更复杂的方法让频率分析法失效。
### 1.5 多表置换密码
### 多表置换密码
#### 1.5.1 维吉尼亚密码
@ -369,6 +373,7 @@ 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 更因此健康蒙受了严重损伤。他破解的方法是依靠于找到多份开头相同的讯息,这表示说它们是被相同的分解钥匙和移位钥匙加密的。
**加密方式:**
@ -398,8 +403,8 @@ ADFGVX密码是德军在第一次世界大战中使用的栏块密码。事实
最终得到FAXDF ADDDG DGFFF AFAXX AFAFX
#### 1.5.3 ENIGMA密码机
恩尼格玛密码机在1920年代早期开始被用于商业一些国家的军队与政府也曾使用过它其中的主要使用者是第二次世界大战时的纳粹德国。
![谢尔比乌斯Arthur Scherbius](files/1-4-4.png)
@ -454,10 +459,8 @@ ENIGMA密码机反射器的加密与解密过程相同
- 每条密文使用不同的密钥
- 每条电文的开头是加密的临时密钥,由三个字母重复两次加密而成, 称为indicator
![](files/1-4-5-6.png)
**Enigma的破译波兰人**
- 可证明对于任何的连线变化都不影响循环圈的个数和每个循环圈上字母的个数;
@ -474,7 +477,6 @@ ENIGMA密码机反射器的加密与解密过程相同
- 1939年7月, 波兰人将破译成果展示给英法同行
- 1939年9月, 希特勒下令闪电战入侵波兰,波兰亡国
**Enigma的破译布莱切利公园**
破译小组于1939年在布莱切利公园组建其中的成员包括
@ -485,7 +487,6 @@ ENIGMA密码机反射器的加密与解密过程相同
- 数学家
- 电脑科学家
**Enigma的弱点**
* 过于简单的密钥比如DFG
@ -517,4 +518,5 @@ ENIGMA密码机反射器的加密与解密过程相同
- 由于人力操作需要耗费大量的时间,英国数学家艾伦·图灵专门设计制造了一台 “炸弹机”Bombe通过电子技术运用上述的排除法来破译 “恩尼格玛”最快的一次仅用了大约20分钟。
### 小结
多表替换加密都具有这样的特征:一个明文字母可映射到多个密文字母,这种加密可以干扰字母频率分析法,通常来说,多表替换密码肯定比单表密码更加安全。尽管加密的方法看上去十分复杂,这并不意味着它就是安全的,解密者会通过多种方式来寻找加密方法的线索,社会工程学就是他们必要技能,他们会想尽一切办法去破译密码。

View File

@ -1,32 +1,31 @@
# CRYPT-2 流密码
# 1.6.2 流密码
**author : Odyssey@cyberpeace**
## 知识点
- [流密码的基本概念](#流密码的基本概念)
- [通用伪随机数生成器PRNG](#通用伪随机数生成器prng)
- [基于位移寄存器的流密码](#基于位移寄存器的流密码)
- [非线性流密码](#非线性流密码)
- [常见的流密码](#常见的流密码)
### 知识点
- 流密码的基本概念
- 线性反馈移位寄存器
- m序列的伪随机性
- m序列密码的破译
- 非线性序列
### 学习目标
## 学习目标
- 掌握流密码的基本概念;
- 了解常用伪随机性的评价方法;
- 掌握线性移位寄存器的结构与输出序列的伪随机性;
- 熟悉非线性序列的概念与基本产生方法;
- 掌握一种典型流密码,祖冲之密码或 RC4 密码。
### 流密码的基本概念
## 目录
2.1 流密码的基本概念
2.2 通用伪随机数生成器PRNG
2.3 基于位移寄存器的流密码
2.4 非线性流密码
2.5 常见的流密码
### 2.1 流密码的基本概念
流密码的基本思想:
密钥:$k$
产生一个密钥序列:$z=z_0 z_1...z_i$
@ -35,8 +34,8 @@
密钥序列发生器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}$
@ -45,8 +44,8 @@ $σ_i$是加密器中的记忆元件存储器在时刻i的状态f是由
![](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$
@ -60,13 +59,12 @@ XOR有一个特点如果对一个值连续做两次 XOR会返回这个**
![](files/2-1-2-2.png)
#### 2.1.3 密钥序列
密钥序列的生成是流密码安全性的核心问题,它决定了流密码的安全性。为了让攻击者无法对序列进行猜测,那密钥序列看上去应该是随机的,也就是随机生成数字。
![](files/2-1-3.png)
#### 2.1.4 随机数
**随机数与伪随机数**
@ -80,8 +78,6 @@ XOR有一个特点如果对一个值连续做两次 XOR会返回这个**
- 密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
- 真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。
#### 2.1.5 OTP一次性密码本
一次性密码本one-time pad缩写为OTP是古典密码学中的一种加密算法。是以随机的密钥key组成明文且只使用一次。
@ -101,7 +97,7 @@ XOR有一个特点如果对一个值连续做两次 XOR会返回这个**
- 密钥的同步
- 密钥的生成
### 2.2 通用伪随机数生成器PRNG
### 通用伪随机数生成器PRNG
伪随机数生成器从一个初始种子值开始通过各种计算得到序列。通常伪随机数序列是递归地执行以下计算得到的:
@ -117,8 +113,8 @@ $$S_{i+1}\equiv (aS_i+b)\space mod\space m,i=0,1,2,...$$
许多数学测试都验证PRNG序列的统计行为满足随机性检验标准1也就是说它的输出近乎和真随机相同。
#### 2.2.1 破译通用伪随机数生成器PRNG
PRNG的输出序列非常具有随机性那我们是否可以用它来生成我们的密钥序列呢答案是不能已知明文攻击可以轻松算出PRNG的参数从而对加密后的明文进行破解。
定义一个线性同余发生器:
@ -166,8 +162,6 @@ a_5& a_6& a_7& a_8& a_9
\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\{
@ -202,8 +196,6 @@ $$
\right\}
$$
$$
(C_5\space C_4\space C_3\space C_2\space C_1)=(0\space1\space0\space0\space0)
\left\{
@ -223,9 +215,10 @@ $$
$$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以及如图的反馈路径。工作方式如下
@ -247,7 +240,6 @@ $$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运算
@ -285,6 +277,7 @@ $$p(x)=p_nx^n+p_{n-1}x^{n-1}+...+p_ix+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个密钥序列
@ -305,8 +298,8 @@ $$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来实现
@ -315,6 +308,7 @@ $$i=m-1,\space s_{2m-2}p_{m-1}+...+s_mp_1+s_{m-1}p_0 \space mod2$$
二元序列的线性复杂度指生成该序列的最短LFSR的级数最短LFSR的特征多项式称为二元序列的极小特征多项式。
#### 2.4.1 Geffe 序列生成器
Geffe序列生成器由3个LFSR组成其中LFSR2作为控制生成器使用
![](files/2-4-1.png)
@ -336,7 +330,6 @@ $$(n_1+n_3)n_2+n_3$$
Geffe序列的周期实现了极大化且0与1之间的分布大体上是平衡的。
#### 2.4.2 J-K触发器
J-K触发器如图所示它的两个输入端分别用$J(x_1)$和$K(x_2)$表示,其输出$c_k$不仅依赖于输入,还依赖于前一个输出位$c_{k-1}$,即
@ -373,7 +366,6 @@ a0b1c2d3a4b5d6
![](files/2-4-3.png)
#### 2.4.4 钟控序列生成器
钟控序列最基本的模型是用一个LFSR控制另外一个LFSR的移位时钟脉冲如图所示。
@ -391,6 +383,7 @@ gcd(w1, p2)=1所以p=p1p2=(2m-1)(2n-1)。
![](files/2-4-4-4.png)
#### 2.4.5 Trivium算法
Trivium算法是一种对称密钥同步序列密码算法。它的设计目的是在计算能力有限的硬件上高效实现安全加密同时兼顾软件实现效率。
Trivium的标准输入为一个80位的密码和一个80位的起始向量IV。和大部分同步序列密码算法一样Trivium的核心组件是一个密码学安全的伪随机数生成器CSPRNG。通过将密码和起始向量加载到该伪随机数生成器中Trivium算法将计算出所需的密钥流。然后通过将明文位依次与密文位进行异或操作计算并输出密文。
Trivium伪随机数生成器可以看作由三个线性反馈移位寄存器组成。它们的长度分别是93、84和111位。寄存器和寄存器之间通过非线性逻辑连接。
@ -414,8 +407,10 @@ Trivium伪随机数生成器可以看作由三个线性反馈移位寄存器组
"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位。该密钥用于三个线性反馈移位寄存器的初始填充也就是说该密钥用于充当三个寄存器的初始值。这三个寄存器用密钥填充之后就可以开始生成密钥流了。
@ -441,8 +436,8 @@ XOR后得到的值是充填到第0位的值。
在欧洲和美国使用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盒会变化。
@ -480,7 +475,6 @@ while GeneratingOutput:
k := inputByte ^ S[(S[i] + S[j]) % 256]
output K
endwhile
```
#### 2.5.4 破译RC4算法
@ -490,14 +484,14 @@ CR4被广泛用于常用协议中包括有线等效保密WEP用于
但是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等

View File

@ -1,27 +1,23 @@
# CRYPT-3 分组密码
# 1.6.3 分组密码
**author : Odyssey@cyberpeace**
## 目录
3.1 分组密码概述
3.2 分组加密法的模式
3.3 乘积加密法
3.4 DES加密技术
3.5 差分密码分析与线性密码分析
3.6 3DES加密技术
3.7 AES算法
- [分组密码概述](#分组密码概述)
- [分组加密法的模式](#分组加密法的模式)
- [乘积加密法](#乘积加密法)
- [DES加密技术](#DES加密技术)
- [差分密码分析与线性密码分析](#差分密码分析与线性密码分析)
- [3DES加密技术](#3des加密技术)
- [AES算法](#aes算法)
### 分组密码概述
## 3.1 分组密码概述
在今天我们所使用的加密法中,分组加密是最常见的类型。分组加密法每次作用于固定大小的分组(与流密码相反,流密码每次只加密一位)。此外,一个分组的比特数就称为分组长度。
![](files/3-1.png)
## 3.1 分组密码概述
在许多密码系统中单钥分组密码是系统安全的一个重要组成部分用分组密码易于构造伪随机数生成器、流密码、消息认证码MAC和杂凑函数等还可进而成为消息认证技术、数据完整性机制、实体认证协议以及单钥数字签字体制的核心组成部分。实际应用中对于分组密码可能提出多方面的要求除了安全性外还有运行速度、存储量程序的长度、数据分组长度、高速缓存大小、实现平台硬件、软件、芯片、运行模式等限制条件。这些都需要与安全性要求之间进行适当的折中选择。
#### 3.1.1 分组密码的设计原则
**设计的算法应满足下述要求**
@ -36,8 +32,8 @@ DES采用56比特密钥太短了IDEA采用128比特密钥据估计
⑤ 数据扩展尽可能地小。一般无数据扩展,在采用同态置换和随机化加密技术时可引入数据扩展。
⑥ 差错传播尽可能地小。
#### 3.1.2 混淆与扩散
扩散和混淆是由Shannon提出的设计密码系统的两个基本方法目的是抗击攻击者对密码系统的统计分析。
如果攻击者知道明文的某些统计特性,如消息中不同字母出现的频率、可能出现的特定单词或短语,而且这些统计特性以某种方式在密文中反映出来,那么攻击者就有可能得出加密密钥或其一部分,或者得出包含加密密钥的一个可能的密钥集合。
@ -45,7 +41,7 @@ DES采用56比特密钥太短了IDEA采用128比特密钥据估计
- 扩散Diffusion是一种为了隐藏明文的统计属性而将一个明文符号的影响扩散到多个密文符号的加密操作以便在大量的密文中消除明文的统计结构。最简单的扩散元素就是置换它常用于DES中而AES则使用更高级的Mixcolunm操作。
扩散和混淆成功地实现了分组密码的本质属性,因而成为设计现代分组密码的基础。
### 3.2 分组加密法的模式
### 分组加密法的模式
**什么是模式**
分组密码只能加密固定长度的分组但是我们需要加密的明文长度可能会超过分组密码的分组长度这时就需要对分组密码算法进行迭代以便将一段很长的明文全部加密。这个迭代的方法就称为分组密码的模式mode
@ -53,8 +49,8 @@ DES采用56比特密钥太短了IDEA采用128比特密钥据估计
明文分组($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)
@ -62,7 +58,6 @@ DES采用56比特密钥太短了IDEA采用128比特密钥据估计
解密过程也是一次对一个分组解密,而且每次解密都使用同一密钥。
![](files/3-2-1-2.png)
- ECB模式的特点
ECB模式是所有模式中最简单的一种。ECB模式中明文分组与密文分组是一一对应关系因此如果明文中存在多个相同的明文分组则这些明文分组最终都将被转换为相同的 密文分组。这样一来只要观察一下密文就可以知道明文中存在怎么样的重复组合并可以以此为线索来破译密码因此ECB模式是存在一定风险的。
@ -86,8 +81,8 @@ ECB模式中每个明文分组都是各自独立地进行加密和解密
当银行对信息进行解密时,信息的内容实际上已经发生了改变,付款人的身份和收款人的身份已经被调换了。
这就是ECB模式的最大弱点可以在不破译密文的情况下操纵密文。
#### 3.2.2 密码分组链接模式CBC
这个模式的实现更复杂、更安全因此它是使用最普遍的块加密模式。在这种模式下来自上一块的密文与当前明文块做XOR逻辑运算得到的结果才是加密的位块。
![](files/3-2-2.png)
@ -113,8 +108,8 @@ ECB模式中每个明文分组都是各自独立地进行加密和解密
2. 填充提示攻击
填充提示是一种利用分组密码中太难冲部分来进行攻击的方法。在分组密码中当明文长度不为分组长度的整数倍时需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中攻击者会反复发送一段密文每次发送时都对填充内容进行少许修改。由于接收者服务器在无法正确解密时会返回一个错误消息攻击者通过这个错误消息就可以获取一部分与明文相关的信息当然这个方法不仅仅适用于CBC模式而是适用于所有需要进行分组填充的模式。要防御这种攻击就必须验证密文是否是由合法的发送者在知道明文内容的前提下生成的。
#### 3.2.3 密文反馈模式CFB
在CFB模式中前一个密文分组会被送回到密码算法的输入端这里的反馈指的是返回输入端的意思。
在ECB模式和CBC模式中明文分组都是通过密码算法进行加密的然而在CFB模式中明文分组并没有通过密码算法来直接进行加密。
![](files/3-2-3.png)
@ -127,12 +122,12 @@ 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)
@ -141,8 +136,8 @@ OFB模式和CFB模式的区别仅仅在于密码算法的输入。
CFB模式中密码算法的输入是前一个密文分组也就是将密文分组反馈到密码算法中因此就有了“密文反馈模式”这个名字。
OFB模式中密码算法的输入则是密码算法的前一个输出也就是将输出反馈给密码算法因此就有了“输出反馈模式”这个名字。
#### 3.2.5 计数器模式CTR
CTR模式中每个分组对应一个逐次累加的计数器并通过对计数器进行加密来生成密钥流。也就是说最终的密文分组是通过将计数器加密得到的比特流与明文分组进行XOR运算得到的。
![](files/3-2-5.png)
@ -157,8 +152,7 @@ CTR模式中每个分组对应一个逐次累加的计数器并通过对
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 乘积加密法
### 乘积加密法
**乘积加密法的概念**
@ -166,8 +160,8 @@ CTR模式中每个分组对应一个逐次累加的计数器并通过对
乘积加密法指的是:顺序地执行两个或多个基本密码系统,使得最后结果的密码强度高于每个基本密码系统产生的结果.
Feistel还提出了实现代换和置换的方法。其思想实际上是Shannon提出的利用乘积密码实现混淆和扩散思想的具体应用。
#### 3.3.1 乘积加密法的结构
![](files/3-3-1.png)
输入是分组长为2𝑤的明文和一个密钥K。将每组明文分成左右两半𝐿_0和𝑅_0 在进行完n轮迭代后左右两半再合并到一起以产生密文分组。其第i轮迭代的输入为前一轮输出的函数
@ -177,8 +171,8 @@ $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)
@ -200,6 +194,7 @@ $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比特的密钥长度。
@ -211,15 +206,16 @@ $LE_{i-1}=RE_i \bigoplus F(RE_{i-1},K_i)=RE_i \bigoplus F(LE_i,K_i)$
① 快速的软件实现:在很多情况中,算法是被镶嵌在应用程序中,因而无法用硬件实现。此时算法的执行速度是考虑的关键。
② 算法容易分析:如果算法能被无疑义地解释清楚,就可容易地分析算法抵抗攻击的能力,有助于设计高强度的算法。
### 3.4 DES加密技术
### 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)
@ -228,12 +224,15 @@ DES的基本结构是由乘积加密算法组成的。它对明文中每一个
![](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)
@ -241,6 +240,7 @@ DES的基本结构是由乘积加密算法组成的。它对明文中每一个
![](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)
@ -299,12 +299,12 @@ S盒的每一行定义了一个可逆代换。
![](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。
@ -331,10 +331,9 @@ S盒的每一行定义了一个可逆代换。
为了得到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依次类推。
DES的优势之一就是其解密过程与加密过程在本质上是完全相同的。这主要是因为DES是基本Feistel网络。与加密相同相比解密过程中只有密钥编排逆转了即解密的第一轮需要子密钥16第二轮需要子密钥15依次类推。
#### 3.4.7 DES软件实现与硬件实现
@ -346,24 +345,23 @@ DES的优势之一就是其解密过程与加密过程在本质上是完全相
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^{*}$在此群中的逆元。
@ -378,8 +376,8 @@ $$\Delta Y_{0}, \Delta Y_{1},..., \Delta Y_{r}$$
② 均匀随机地选择明文$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]
@ -406,4 +404,5 @@ $$P[i_1,i_2,...,i_a]\bigoplus C\bigoplus [j_1,j_2,...,j_b]=K[k_1,k_2,...,k_c]$$
![](files/3-5-2-3.png)
#### 3.5.3 其他密码分析方法
如何对差分密码分析和线性密码分析进行改进,降低它们的复杂度仍是现在理论研究的热点,目前已推出了很多改进方法,例如,高阶差分密码分析、截段差分密码分析truncated differential cryptanalysis、不可能差分密码分析、多重线性密码分析、非线性密码分析、划分密码分析和差分-线性密码分析再如针对密钥编排算法的相关密钥攻击、基于Lagrange插值公式的插值攻击及基于密码器件的能量分析power analysis另外还有错误攻击、时间攻击、Square攻击和Davies攻击等。

View File

@ -2,25 +2,25 @@
**author : Odyssey@cyberpeace**
## 知识点
- [公钥密码体制的基本概念](#公钥密码体制的基本概念)
- [公钥密码中的数学知识](#公钥密码中的数学知识)
- [RSA密码体制](#rsa密码体制)
- [基于离散对数的密码体制](#基于离散对数的密码体制)
- [椭圆曲线密码体制](#椭圆曲线密码体制)
### 知识点
- 公钥密码体制
- 常见公钥密码
## 学习目标
### 学习目标
- 掌握公钥密码体制的基本思想
- 掌握公钥密码体制中的数学原理
- 掌握常见公钥密码的加解密原理
- 了解公钥密码体制在信息安全领域的实际应用
## 目录
4.1 公钥密码体制的基本概念
4.2 公钥密码中的数学知识
4.3 RSA密码体制
4.4 基于离散对数的密码体制
4.5 椭圆曲线密码体制
### 4.1 公钥密码体制的基本概念
### 公钥密码体制的基本概念
#### 4.1.1 对称密码与非对称密码
@ -34,7 +34,6 @@
- 密钥个数即使解决了密钥分配问题我们仍然需要保存和处理大量密钥。在一个拥有n个用户的网路中如果每对用户之间都需要一个单独的密钥对那么网络上的密钥对个数会变成$\frac {n*(n-1)}{2}$ 。
- 缺少对欺骗行为的防御机制。由于通信双方的密钥相同,任意一方都可以伪造另外一方的信息或否认自己发送的信息。
#### 4.1.3 公钥密码解决的问题
公钥密码体制的概念是在解决单钥密码体制中最难解决的这两个问题时提出的。
@ -43,7 +42,6 @@
1976年W.Diffie和M.Hellman对解决上述两个问题有了突破从而提出了公钥密码体制。
#### 4.1.4 公钥密码体制的原理
公钥密码算法的最大特点是采用两个相关密钥将加密和解密能力分开,其中一个密钥是公开的,称为公开密钥,简称公开钥,用于加密;另一个密钥是为用户专用,因而是保密的,称为秘密密钥,简称秘密钥,用于解密。因此公钥密码体制也称为双钥密码体制。算法有以下重要特性:
@ -59,8 +57,7 @@
- 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 公钥密码体制算法条件
@ -81,7 +78,6 @@
想要理解公钥密码算法,并知道什么样的算法属于单向函数,我们需要学习一些数论知识,包括欧几里得算法、欧拉函数、费马小定理、欧拉定理等。
#### 4.2.3 素数和互素数
**1. 因子**
@ -158,7 +154,6 @@ $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$
@ -214,7 +209,6 @@ $(a+b)\space mod\space n=[(j+k)n+r_a+r_b]\space mod\space n=(r_a+r_b)\space mod\
性质②、③的证明类似。
#### 4.2.7 扩展的欧几里得算法
在讲欧几里得算法的时候我们已经知道两个整数 $r_0$ 和 $r_1$ 的gcd的计算可以通过不断进行迭代地减小操作数来实现。然而事实证明欧几里得算法的主要应用并不在计算gcd。扩展的欧几里得算法可以用来计算模逆元而模逆元在公钥密码学中占有举重若轻的地位。拓展的欧几里得算法除了可以计算gcd外还能计算以下形式的线性组合
@ -285,8 +279,8 @@ $(p-1)!ap-1≡(p-1)! mod p$
![](files/2018-05-15-11-40-03.png)
#### 4.2.9 素性检验
素性检验是指对给定的数检验其是否为素数。对于大数的素性检验来说没有简单直接的方法,本节介绍一个概率检验法,为此需要以下引理。
引理: 如果p为大于2的素数则方程$x^2≡1(mod\space p)$的解只有x≡1和x≡-1。
@ -323,8 +317,8 @@ for循环结束后有$d≡a^{n-1}\space mod\space n$由Fermat定理知
该算法有以下性质: 对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。
@ -403,7 +397,6 @@ D对应的密文为$x\equiv (F_1a_1+F_2a_2+...+F_ka_k)(mod\space M)$
**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$成立则是困难的,这就是离散对数问题。
@ -423,13 +416,13 @@ $y=f(x)=x^n+a_{n-1}x^{n-1}+...+a_1x+a_0\space mod\space p$
$s=f(x)=a_1x_1+a_2x_2+...+a_nx_n$
是容易的而由A和S求x则是困难的这就是背包问题又称子集和问题。
### RSA密码体制
### 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的欧拉函数值。
@ -450,7 +443,6 @@ $m=c^d \space mod \space n$
![](files/4-3-1-4.png)
#### 4.3.2 RSA算法中的计算问题
**RSA的加密与解密过程**
@ -476,8 +468,8 @@ $m=b_k2^k+b_{k-1}2^{k-1}+…+b_12+b_0$
可见寻找大素数是一个比较繁琐的工作。然而在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位十进制的素数。
@ -498,7 +490,6 @@ p+q=n-φ(n)+1
- 顺序检查大于$\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)$
@ -517,8 +508,8 @@ $c^{e^t}\equiv (m^e)^{e^t}\equiv m^{e^{t+1}}(mod\space n)$
此外,研究结果表明,如果$e < n$$d < n^{\frac{1}{4}}$则d能被容易地确定
#### 4.3.4 对RSA的攻击
RSA存在以下两种攻击并不是因为算法本身存在缺陷而是由于参数选择不当造成的。
**1. 共模攻击**
@ -546,14 +537,14 @@ $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上的离散对数难题。
@ -561,6 +552,7 @@ ElGamal加密算法可以定义在任何循环群 {\displaystyle G} G上。它
ElGamal加密算法由三部分组成密钥生成、加密和解密。
#### 4.4.2 DiffieHellman密钥交换
**1密钥生成**
- 选取大素数p且要求$p-1$有大素数因子。是一个本原元。
- 随机选取整数$x$,$1≤x≤p-2$,计算$y=g^x\space mod\space p$。
@ -576,14 +568,17 @@ ElGamal加密算法由三部分组成密钥生成、加密和解密。
$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$
@ -610,15 +605,15 @@ $y^2=axy+by=x^3+cx^2+dx+e$
以上定义的加法具有加法运算的一般性质,如交换律、结合律等。
#### 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)所示。
@ -666,8 +661,8 @@ $$
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共有
@ -683,6 +678,7 @@ $|\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,...}$
@ -693,6 +689,7 @@ $x=\{mk+j,j=0,1,2,...\}={30m,30m+1,30m+2,...}$
\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密码体制是基于有限域上离散对数问题的公钥体制下面考虑如何用椭圆曲线来实现这两种密码体制
@ -723,7 +720,6 @@ 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密码体制相比椭圆曲线密码体制有如下优点。

View File

@ -1,17 +1,16 @@
# CRYPT-5 消息认证和哈希(杂凑)函数
# CRYPT-5 消息认证和哈希函数
**author : Odyssey@cyberpeace**
## 目录
5.1 消息认证
5.2 消息认证码MAC
5.3 Hash函数
5.4 MD5哈希函数
5.5 安全H哈希算法SHA-1
5.6 基于分组密码与离散对数的哈希函数
- [消息认证](#消息认证)
- [消息认证码MAC](#消息认证码mac)
- [Hash函数](#hash函数)
- [MD5哈希函数](#md5哈希函数)
- [安全哈希算法SHA-1](#安全哈希算法sha-1)
- [基于分组密码与离散对数的哈希函数](#基于分组密码与离散对数的哈希函数)
### 消息认证
### 5.1 消息认证
消息认证的目标是:收到一条消息,希望确保消息在传递的过程中没有被改变
- 根据消息和秘密密钥生成一个短序列位
- 为了验证消息,通信双方将计算相同的位模式,假设他共享相同的密钥
@ -32,29 +31,30 @@
消息认证机制和数字签字机制都需有产生认证符的基本功能这一基本功能又作为认证协议的一个组成部分。认证符是用于认证消息的数值它的产生方法又分为消息认证码MACmessage authentication code和哈希函数hash function两大类
### 5.2 消息认证码MAC
### 消息认证码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.1 消息认证码的定义及使用方式
### 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的函数所使用的密钥。
@ -80,8 +80,8 @@ $C_K(M)=E_K[\varDelta(M)]$
第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
@ -93,23 +93,22 @@ $C_K(M)=E_K[\varDelta(M)]$
其中E为DES加密算法K为密钥。
数据认证码或者取为$O_N$或者取为$O_N$的最左M个比特其中16≤M≤64。
### Hash函数
### 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
@ -117,15 +116,15 @@ h(x)=h(x)
* 强抗碰撞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最小应是多少
@ -147,7 +146,6 @@ $p(365,k)=1-(1-\frac{1}{365})(1-\frac{2}{365}...(1-\frac{k-1}{365})$
>设Hash函数值有n个比特m是真消息M是伪造的假消息分别把消息m和M表示成r和R个变形的消息。消息与其变形消息具有不同的形式但有相同的含义。将消息表示成变形消息的方法很多例如增加空格、使用缩写、使用意义相同的单词、去掉不必要的单词等。
#### 5.3.4 Hash函数的安全性
**生日攻击法**
@ -206,7 +204,6 @@ $h_1=E_k(m_1,IV)$
$d=h(m)=E_k(m_2,h_1)$
#### 5.3.5 Hash函数的迭代构造法
**压缩函数compression function**
@ -236,8 +233,8 @@ $h(x)=g(H_r)$
- 在预处理阶段必须保证变换xy是单射。因为如果预处理变换xy不是单射则存在xx使得y=y从而h(x)=h(x)即能够找到h的碰撞。
- 对于任意无碰撞的压缩函数都可以使用迭代技术构造一个无碰撞的Hash函数。
### MD5哈希函数
### 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公开发表.
@ -249,6 +246,7 @@ MD5(MD:message digest,消息摘要)
- 倾向于使用低端结构
#### 5.4.1 MD5算法
MD5算法的输入可以是任意长度的消息x对输入消息按512位的分组为单位进行处理输出128位的散列值MD(x)。整个算法分为五个步骤。
**步骤1: 增加填充位**
@ -397,6 +395,7 @@ $L^s(v)$表示对32位的变量v循环左移s位。s的值与轮数和迭代步
- MD =散列值
### 5.4.2 MD5的安全性
* Rivest猜测MD5可能是128位Hash函数中强度最大的。
* 目前对MD5的攻击已取得以下结果
- T. Berson1992已经证明对单轮的MD5算法利用差分密码分析可以在合理的时间内找出散列值相同的两条消息。这一结果对MD5四轮运算的每一轮都成立。但是目前尚不能将这种攻击推广到具有四轮运算的MD5上.
@ -408,7 +407,7 @@ $L^s(v)$表示对32位的变量v循环左移s位。s的值与轮数和迭代步
- 国际密码学家Lenstra利用王小云等提供的MD5碰撞伪造了符合X.509标准的数字证书.
* MD5算法抗密码分析能力较弱,对MD5的生日攻击所需代价为264数量级. 所以, 必须设计新的Hash算法, 使其与MD5相比具有更长的散列值和更高的安全性.
### 5.5 安全Hash算法SHA-1
### 安全哈希算法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代码实现。
@ -482,7 +481,6 @@ $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$
|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的真值表
@ -517,8 +515,8 @@ $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$
+ SUM_{32}=对输入字的模$2^{32}$相加
+ MD =散列值
#### 5.5.2 SHA-1和MD5的比较
* SHA-1与MD5的算法类似所以它们的性质极为相似
* 抗穷举攻击的能力
- SHA1抗穷举攻击的能力比MD5强
@ -539,14 +537,12 @@ $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$
* 数据的存储方式
MD5使用little-endian方式SHA-1使用big-endian方式。这两种方式没有本质的差异
### 5.6 基于分组密码与离散对数的Hash函数
### 基于分组密码与离散对数的哈希函数
**Hash函数的间接构造法**
- 利用已有的密码算法构造Hash函数
- 如果密码算法是安全的那么利用它所构造的Hash函数也是安全的
#### 5.6.1 利用分组密码算法构造Hash函数
**已知条件**
@ -573,8 +569,8 @@ $y_i=x_i\oplus E_k(y_{i-1})(1\leq i\leq L)$
在密钥公开的情况下基于分组密码CBC工作模式和CFB工作模式构造的Hash函数是不安全的它们甚至不是弱无碰撞的.
#### 5.6.2 基于离散对数问题的Hash函数
* 基于一些困难数学问题诸如离散对数问题、因子分解问题、背包问题等可以构造出一些Hash函数这些Hash函数的安全性依赖于对应数学问题的困难性
* Chaum、Heijst和Pfitzmann1992年提出的基于离散对数问题构造的Hash函数
- 运行速度不是很快

View File

@ -1 +1,11 @@
# 1.6 密码学基础
* [1.6.1 密码学导论](1.6.1_crypto_intro.md)
* [1.6.2 流密码](1.6.2_stream_cipher.md)
* [1.6.3 分组密码](1.6.3_block_cipher.md)
* [1.6.4 公钥密码](1.6.4_asymmetric.md)
* [1.6.5 消息认证和哈希函数](1.6.5_hash.md)
* [1.6.6 数字签名](1.6.6_signature.md)
* [1.6.7 密码协议](1.6.7_protocol.md)
* [1.6.8 密钥分配与管理](1.6.8_key_distribution.md)
* [1.6.9 数字货币](1.6.9_digital_currency.md)