第三章 分组密码和数据加密标准(DES)
流密码与分组密码
分组密码:
所谓分组密码是将明文分成一组一组,在密钥的控制下,经过加密变换生成一组一组的密文。
Step 1:将明文消息序列m1, m2, …, mi, …划分成等长的消息组(m1, …, mn),(mn+1, …, m2n),…
Step 2:在密钥k=k1, k2, …, kn的控制下按固定的加密算法一组一组进行加密。
Step 3:最后输出一组一组密文(c1, c2, …, cl),(cl+1, cl+2, …, c2l)。
在相同密钥下,分组密码对每组明文所进行的变换是一样的,因此只需要研究对单独一组明文进行加密变换。
Feistel密码
Feistel建议使用乘积密码的概念来逼近理想分组密码。乘积密码是指依次使用两个或两个以上基本密码,所得结果的密码强度将强于所有单个密码的强度。
C=Enckn(...Enck2(Enck1(m))…)
Feistel密码:
代替:每个明文元素或元素组被唯一地替换为相应的密文元素或元素组。
置换:明文元素的序列被替换为该序列的一个置换。也就是说,序列里没有元素被添加,删除或替换,但序列里出现的顺序改变了。
- 扩散:将明文的统计特性散布到密文中去,这可以通过让每个明文数字尽可能地影响多个密文数字。
混淆:使密文和密钥之间的统计关系尽可能复杂,以使敌手无法得到密钥。
分组长度: 分组越大则安全性越高,但加密速度就越慢。设计中最为普遍使用的是64比特。
密钥长度:密钥越长则安全性越高,但加密速度就越慢。现在普遍认为64比特或更短的密钥长度是不安全的,通常使用128比特的密钥长度。
- 迭代轮数:单轮结构远不足以保证安全性,但多轮结构可提供足够的安全性。典型地,轮数取为16。
- 子密钥产生算法:该算法的复杂性越大,则密码分析的困难性就越大。
- 轮函数F:轮函数的复杂性越大,密码分析的困难性也越大。
- 快速软件加/解密:许多情况下,算法是被镶嵌在应用程序中,因而无法用硬件实现。此时算法的执行速度是考虑的关键。
- 简化分析难度:如果算法能被无疑义地解释清楚,就可容易地分析算法抵抗攻击的能力,有助于设计高强度的算法。
数据加密标准(DES)
在2001年高级加密标准(AES)提出前,DES一直是使用最广泛的加密方案。
分组长度为64比特,密钥长度为56比特。
DES在1975年3月17日首次被公布在联邦记录中,经过大量的公开讨论后,DES于1977年1月15日被正式批准并作为美国联邦信息处理标准。
规定每隔5年由美国国家保密局作出评估,并重新批准它是否继续作为联邦加密标准。
DES加密算法概述:
- DES的结构是典型的Feistel密码结构。
- 明文分组长度为64bit。
- 密文分组长度为64bit。
- 初始密钥长度为64bit。(其中,第8、16、24、32、40、48、56、64为奇偶校验位,因此,实际的密钥长为56bit。)
DES加密过程:
- 初始置换IP:重排明文分组的64 bit数据。
- 具有相同功能的16轮迭代:每轮中都有置换和代换运算,第16轮变换的输出分为左右两半,并交换次序。
- 逆初始置换IP-1(IP的逆):产生64 bit的密文。
子密钥Ki的生成:
- 初始密钥K为64 bit,首先置换选择PC1置换。
- 将置换后的56 bit分为各28 bit的左、右两半,分别记为C0和D0。在第i轮分别对Ci-1和Di-1进行循环左移,移位后的结果作为求下一轮子密钥的输入,同时也作为置换选择PC2的输入。
- 通过置换选择PC2产生的48 bit的Ki,即为i轮的子密钥,作为轮函数f (Ri-1, Ki)的输入。
S盒代换:
DES算法中除了S盒是非线性变换外,其余变换均为线性变换,S盒是经过精心设计和严格挑选的。
DES算法保密的关键在于S盒!
DES的解密过程:
- DES的加密算法具有可逆性,解密64 bit密文消息分组使用与加密相同的算法,所不同的是子密钥顺序使用相反,依次为 K16, K15, …, K1。
- 当64 bit密文作为明文输入时,解密过程的第1轮迭代使用子密钥K16,第2轮迭代使用子密钥K15,…,第16轮迭代使用子密钥K1,结果输出得到64 bit明文。
56位密钥的使用:
在DES成为标准时,采用的密钥是56 bit,其密钥量仅为256约为1017个,难以抵抗穷举搜索攻击。
问题主要集中在算法中的8个S盒上。DES密码体制的安全性依赖于非线性的S盒。S盒设计的详细准则一直没有公开,致使许多密码学家怀疑S盒设计中可能包含陷门。
双重DES :
针对DES有效密钥长度偏短等安全性问题,人们利用实现DES的现有软硬件,寻求使用DES的多重加密方案以增加密码体制的强度。实用中一般广泛采用的有二重和三重DES等几种形式。
第四章 数学基础(略)
第五章 AES
AES应用实例:
- 路由器
- 安卓
- SIM卡
总体结构:
AES是一个迭代型分组密码:
- 分组长度:可以独立地指定为128比特、192比特、256比特。
- 密钥长度:可以独立地指定为128比特、192比特、256比特。
状态、种子密钥和轮数:
类似于明密文分组,算法的中间结果也分组,称中间结果的分组为状态,所有的操作都在状态上进行。
- 状态可以用以字节为元素的矩阵表示,该矩阵有4行,列数记为Nb,Nb等于分组长度除以32。
- 种子密钥也用一个以字节为元素的矩阵表示,该矩阵有4行,列数记为Nk,Nk等于分组长度除以32。
迭代的轮数记为Nr,Nr与Nb和Nk有关,Nr与Nb和Nk的关系如下表:
详细结构
当Nk等于4时,整个算法由10轮组成。每轮由4个变换模块组成,分别是:
- 字节代换(ByteSub)
- 行移位(ShiftRow)
- 列混合(MixColumn)
- 轮密钥加(AddRoundKey)
最后一轮略有不同,没有列混合。
加密过程:
- 初始轮密钥加
- Nr-1轮迭代
- 最后一轮变换
字节代替变换(ByteSub)
字节代换是非线形变换,独立地对状态的每个字节进行。代换表(即S-盒)是可逆的,由以下两个变换的合成得到:
- 首先,将字节看作GF(28)上的元素,映射到自己的乘法逆元,00映射到自己。
- 其次,对字节做如下的(GF(2)上的,可逆的)仿射变换:
行移位变换(ShiftRow)
状态矩阵State中的每一行将以字节为单位,循环左移不同的位移量。
- 第一行:保持不变
- 第二行:循环左移一个字节
- 第三行:循环左移两个字节
- 第四行:循环左移三个字节
列混合变换(MixColumn)
将State乘以一个固定的矩阵A。
轮密钥加变换(AddRoundKey)
密钥加是将轮密钥Ki简单地与状态State进行逐比特异或。
AES的密钥扩展
密钥扩展指从种子密钥得到轮密钥的过程,其基本原则如下:
- 轮密钥的比特数等于分组长度乘以轮数加1:128 bit × (10+1) = 1408 bit
- 种子密钥被扩展成为扩展密钥(密钥扩展)。
- 轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前Nb个字,第2轮轮密钥取接下来的Nb个字,如此下去(轮密钥选取)。
密钥扩展算法
将种子密钥扩展为扩展密钥的计算过程如下:
当种子密钥长度为128bit时,Nk=4:
temp = SubByte(RotByte(W[i-1])) Å Rcon[i/Nk]
- RotByte( ):循环左移一个字节,如W=(a0, a1, a2, a3),则RotByte(W)=(a1, a2, a3, a0)。
- SubByte( ):S盒的字节代换。
- Rcon[i]:轮常数
AES的解密过程
AES加密算法的每一步都可逆!
第6章 分组密码的工作模式
分组密码的工作模式:
为了能在各种应用场合使用DES,1980年,美国在FIPSPUS 81中标准化了DES算法的四种工作模式,后来对AES算法研发过程中,增加了新的工作模式,这些模式适用于任何分组密码算法。
五种常用的工作模式为:
1.电码本(Electronics Code Book,ECB)
2.密文分组链接(Cipher Block Chaining,CBC)
3.密文反馈(Cipher-FeedBack,CFB)
4.输出反馈(Output-FeedBack,OFB)
5.计数器(Counter,CTR)
为了方便描述,定义如下符号:
- Ek:分组密码加密算法
- M1, M2, …, Mn:明文消息中n个连续的分组
- C1, C2, …, Cn:密文消息中n个连续的分组
- IV:初始向量,是一个随机比特串
- HSj(A):A的j个最高有效位,例如HS8(0010101110100101)=00101011
- LSj(A):A中除了j个最高位外剩下的有效位,例如LS8(0010101110100101)=10100101
- A||B:消息分组A和B的链接
电码本模式
电码本模式是分组密码的一个直接应用:它一次对一个明文分组Mi直接加密,每次的加密密钥k都相同。
当密钥k取定时,对明文的每一个分组Mi,都有一个惟一的密文分组Ci与之对应。ECB模式的加密过程为:
Ci=Ek(Mi),i=1,2,…,n
ECB模式的优点:当改变一个明文分组值的时候,仅仅会引起相应的密文分组取值发生变化,而其他密文分组不受影响。
ECB模式的缺点:相同的明文分组会产生相同的密文分组,易暴露明文的固有格式。因此ECB不适用于长消息,建议在大多数情况下不要使用ECB模式进行加密操作。
密文分组链接模式
密码分组链接模式是用于普通数据加密的一种分组密码工作模式。CBC解决了ECB的安全缺陷,可以让重复的明文分组产生不同的密文分组。
C0=IV,
Ci=Ek(MiÅCi-1),
i=1,2, …, n
CBC模式的优点:CBC模式输出的是随机化的密文分组,CBC模式适用于较长的明文消息进行加密。
CBC模式的缺点:当信道噪音等干扰带来密文传输错误时,密文中一位的错误将影响当前分组及下一分组的解密。
密文反馈模式
设传送的每个单元(如一个字符)是j比特长,通常取j=8。以IV作为初始的b比特随机输入分组,存放于移位寄存器中。
I1= IV Ii=LSj(Ii-1)||Ci-1 (i=2,3,…,n)
O1=Ek(I1) Oi=Ek(Ii) (i=2,3,…,n)
C1=M1ÅHSj(O1) Ci=MiÅHSj(Oi) (i=2,3,…,n)
CFB模式的优点:随机化密文。
CFB模式的缺点:当信道噪音等干扰带来密文传输错误时,密文中一位的错误将影响当前分组及下一分组的解密。
输出反馈模式
输出反馈模式在结构上类似于CFB模式,两种模式的不同之处在于:
OFB:将加密算法的输出反馈到移位寄存器
CFB:将密文单元反馈到移位寄存器
计数器模式
计数器模式要求计数器的长度与分组长度相同,它将计数器从初始值开始计数所得到的值作为分组加密算法的输入,经过加密算法变换后的结果与明文分组异或,得到密文分组。
Ci=MiÅE(Ctri),i=1,2, …, n
- CRT模式的优点:
- 可以处理任意长度的数据,而且加密-解密过程仅涉及加密运算,不涉及解密运算,因此不用实现解密算法。
- 能并行处理,即能同时对多个分组的加密-解密进行处理,而不必等到前面分组处理完才开始,而且可以提前进行预处理,这也可以极大地提高处理效率。
- 可以随机地对任意一个密文分组进行解密,对该密文分组的处理与其他密文无关。
第七章 伪随机数的产生和流密码
随机数的使用
大量密码算法或网络安全协议都需要随机数,如:
- 密钥分发和认证
- 会话密钥的产生
- RSA等公钥密码算法
- 对称密码的密钥
现实中的随机数:
- 手机动态验证码
- 动态验证码
- 密码器
随机数的使用
这些应用对随机数序列产生提出了两个不同的要求:随机性和不可预测性。
- 随机性
- 分布均匀性:能通过均匀性检验、独立性检验、游程检验等基本的统计特性检验。
- 独立性:序列中任何子序列不能由其他子序列推导出。
- 不可预测性
- 指即使给出产生序列的硬件和所有以前产生的序列的全部知识,也不可能预测下一个随机位是什么。因此,随机序列是非周期的。
伪随机数发生器
- 物理方法:利用自然界的一些真的随机物理量,如放射性衰变、宇宙射线的触发时间等。
- 计算机产生(数学方法):由一个初始状态(称为“种子”)开始,通过一个确定的算法来生成。一旦给定算法和种子值,输出序列就是确定的了,因此有一定的周期性,规律性和重复性,不是真正的随机数,通常称之为伪随机数。产生伪随机数的算法或硬件一般称为伪随机数发生器。
BBS发生器
BBS(Blum-Blum-Shub)产生器是可证明安全的伪随机比特序列产生器。
首先选择两个大素数p和q,满足
p ≡ q ≡ 3 (mod 4)
令n = pq。再选一随机数s,使得s与n互素。
BBS产生器产生伪随机序列的算法如下:
X0 = s2 mod n
for i = 1 to ∞ do {
Xi = X2i-1 mod n;
R
i
= X
i
mod 2 }
流密码
流密码结构图:
RC4算法
RC4是MIT的Rivest开发的,是使用最为广泛的流密码算法之一。
- RC4的大小由参数n确定。对于一个n位长的字(或0, 1 序列),有2n种不同的排列方式,对应2n个不同的元素(或状态),这些元素组成一个长为2n的数组S。
- RC4每次随机选取数组S中的一个元素输出作为密钥k。
RC4包含了两个算法:
1.密钥调度算法(Key Scheduling Algorithm, KSA):设置数组S的初始排序。
2.伪随机生成算法(Pseud Random Generation Algorithm, PRGA):随机选取元素作为密钥k输出并修改数组S的原始排序,每产生一个密钥k,数组S就被重新排列一次。
KSA算法:
- 常用的RC4的n=8,此时,RC4可以生成28=256个元素的数组S。KSA初始化S,取
S[i]=i (i=0, 1, …, 255)
选择0到255之间的一个子序列作为密钥,填充到密钥数组K[i]=i(i=0, 1, …, 255)中。填充时,这个密钥不断地重复直到填满整个密钥数组。
然后利用以下算法实现数组S的初始随机化排列。
j=0;
for i=0 to 255 do
j=j+S[i]+K[i] (mod 256);
swap (S[i], S[j]);
PRGA算法:
在KSA将数组S进行初始排序的基础上,PRGA从数组S中随机选取元素作为密钥流字节,同时修改S的排序,以便于下一次密钥流的选取。
选取过程取决于索引i和j,这两个索引都从0开始,选取时重复执行以下算法,直到产生与明文的长度相等的密钥流。
i=i+1 (mod 256);
j=j+S[i] (mod 256);
swap (S[i], S[j]);
t=S[i]+S[j] (mod 256);
k=S[t];
output k=S[t];
从算法中可以看出,索引i保证每个元素的改变,索引j保证元素改变的随机性。
RC4的优点是在软件容易实现且运行速度快。RC4广泛用于商业密码产品中,如用于属于IEEE
802.11无线LAN标准的WEP协议和更新的WiFi保护访问协议等。目前所用的初始密钥一般至少为128
位。关于分析RC4的攻击方法有许多公开发表的文献。但是当密钥长度很大时,比如128位,没有那种攻击方法有效。