第6章对称密码的其他内容3.docx
《第6章对称密码的其他内容3.docx》由会员分享,可在线阅读,更多相关《第6章对称密码的其他内容3.docx(11页珍藏版)》请在冰豆网上搜索。
![第6章对称密码的其他内容3.docx](https://file1.bdocx.com/fileroot1/2023-1/4/02b38584-e346-4d70-a054-5909ca27f39d/02b38584-e346-4d70-a054-5909ca27f39d1.gif)
第6章对称密码的其他内容3
第6章对称密码的其他内容
6.1多重加密与三重DES算法
6.1.1双重DES
为了提高DES的安全性,并利用实现DES的现有软硬件,可将DES算法在多密钥下多重使用。
使用两个密钥为K1和K2,密文为
C=Ek2[Ek1[P]]
解密时,以相反顺序使用两个密钥:
P=Dk1[Dk2[C]]
如果已知一个明文密文对(P,C),攻击的实施可如下进行:
首先,用256个所有可能的K1对P加密,将加密结果存入一表并对表排序,然后用256个所有可能的K2对C解密,在上述表中查找与C解密结果相匹配的项,如果找到,则记下相应的K1和K2。
最后再用一新的明文密文对(P’,C’)检验上面找到的K1和K2。
用K1和K2对P’两次加密,若结果等于C’,就可确定K1和K2是所要找的密钥。
二重DES会受到中间人的攻击。
6.1.2使用两个密钥的三重DES
加密:
C=Ek1[Dk2[Ek1[P]]]
解密:
P=Dk1[Ek2[Dk1[C]]]
6.1.3使用三个密钥的三重DES
加密:
C=Ek3[Ek2[Ek1[P]]]
解密:
P=Dk1[Dk2[Dk3[C]]]
有些基于Internet的应用已经采纳了这种三重DES。
6.2分组密码的工作模式
DES算法是提供数据安全的基本构件。
为了将DES应用于实际,人们定义了五种工作模式(FIPS81).这些模式也可用于包括3DES和AES在内的任何分组密码。
(1)电码本(ECB)模式
ECB(electroniccodebook)模式是最简单的运行模式,它一次对一个64比特长的明文分组加密,而且每次的加密密钥都相同,如图3-10所示。
当密钥取定时,对明文的每一个分组,都有一个惟一的密文与之对应。
因此形象地说,可以认为有一个非常大的电码本,对任意一个可能的明文分组,电码本中都有一项对应于它的密文。
图3-10 ECB模式示意图
如果消息长于64比特,则将其分为长为64比特的分组,最后一个分组如果不够64比特,则需要填充。
解密过程也是一次对一个分组解密,而且每次解密都使用同一密钥。
图3-10中,明文是由分组长为64比特的分组序列P1,P2,…PN构成,相应的密文分组序列是C1,C2,…,CN。
ECB模式特别适合于数据较少的情况,比如加密密钥。
ECB的最大特性是同一明文分组在消息中重复出现的话,产生的密文分组也相同。
ECB用于长消息时可能不够安全。
(2)密码分组链接(CBC)模式
为了解决ECB的安全缺陷,可以让重复的明文分组产生不同的密文分组,CBC(Cipher block chaining)模式就可满足这一要求。
图3-11是CBC模式示意图,它一次对一个明文分组加密,每次加密使用同一密钥,加密算法的输入是当前明文分组和前一次密文分组的异或,因此加密算法的输入不会显示出与这次的明文分组之间的固定关系,所以重复的明文分组不会在密文中暴露出这种重复关系。
图3-1l CBC模式示意图
第一块明文可以和一个初始矢量(IV)异或后再加密。
IV必须为收发双方共享。
为了增加安全性,IV应该和密钥一样加以保护,比如用ECB加密来保护IV。
CBC模式对加密长于64比特的消息非常合适,亦可用于认证。
(3)密码反馈(CFB)模式
如上所述,DES是分组长为64比特的分组密码,但利用CFB(cipherfeedback)模式或OFB模式可将DES转换为流密码。
流密码不需要对消息填充,而且运行是实时的。
因此如果传送字母流,可使用流密码对每个字母直接加密并传送。
流密码具有密文和明文一样长这一性质,因此,如果需要发送的每个字符长为8比特,就应使用8比特密钥来加密每个字符。
如果密钥长超过8比特,则造成浪费。
图3-12是CFB模式示意图,设传送的每个单元(如一个字符)是j比特长,通常取j=8,与CBC模式一样,明文单元被链接在一起,使得密文是前面所有明文的函数。
加密时,加密算法的输入是64比特移位寄存器,其初值为某个初始向量IV。
加密算法输出的最左(最高有效位)j比特与明文的第一个单元P1,进行异或,产生出密文的第1个单元C1,并传送该单元。
然后将移位寄存器的内容左移j位并将C1送入移位寄存器最右边(最低有效位)j位。
这一过程继续到明文的所有单元都被加密为止。
CFB模式除能获得保密性外,还能用于认证。
(4)输出反馈(OFB)模式
OFB(outputfeedback)模式的结构类似于CFB,见图3-13。
不同之处如下:
OFB模式是将加密算法的输出反馈到移位寄存器,而CFB模式中是将密文单元反馈到移位寄存器。
OFB模式的优点是传输过程中比特错误不会被传播。
(6)计数器模式
见课本P148图6.7.
计数器模式有如下优点:
●硬件效率高:
与三种链接模式不同,CTR模式能够并行处理多块明文(密文)的加密(解密)。
●软件效率高
●预处理
●随机访问:
密文的第i个明文组能够用一种随机访问的方式处理。
●可证明安全性:
能够证明CTR模式至少和本节讨论的其他模式一样安全。
●简单性:
只用加密算法。
模式
描述
典型应用
电码本(ECB)
用相同的密钥分别对明文组加密。
●单个数据的安全传输(如一个加密密钥)
密码分组链接(CBC)
加密算法的输入是上一个密文组和下一个明文组的异或。
●普通目的的面向分组的传输
●认证
密码反馈(CFB)
一次处理j位。
上一个分组密文作为产生一个伪随机数输出的加密算法的输入,该输出与明文异或,作为下一分组的输入。
●普通目的的面向分组的传输
●认证
输出反馈(OFB)
与CFB基本相同,只是加密算法的输入是上一次DES的输出
●噪声通道上的数据流的传输(如卫星通信)
计数器(CTR)
每个明文组是与加密的计数器的异或。
对每个后续的组,计数器是累加的。
●普通目的的面向分组的传输用于高速需求
6.3流密码和RC4
6.3.1流密码的结构:
一个典型的流密码每次加密一个字节的明文,当然流密码也可被设计为每次操作一比特或者大于一个字节的单元。
图6.8给出了一个典型的流密码的结构图。
在该结构中密钥输入到一个伪随机数(比特)发生器,该伪随机数发生器产生一串随机的8比特数。
一个伪随机流就是在不知道输入密钥的情况下不可预知的比特流。
发生器的输出称为密钥流,通过与同一时刻一个字节的明文流进行异或操作产生密文流。
明文
密钥流
------------
密文
解密需要使用相同的伪随机序列:
密文
密钥流
------------
明文
●设计流密码需要考虑的主要因素:
1.加密序列的周期要长。
伪随机数发生器实质上使用的是产生确定的比特流的函数。
该比特流最终将出现重复。
重复的周期越长,密码分析的难度就越大。
2.密钥流应该尽可能地接近于一个真正的随机数流的特征。
例如,1和0的个数应近似相等。
若密钥流为字节流,则所有256种可能的字节的值出现频率应近似相等。
密钥流的随机特性越好,则密文越随机,密码分析就越困难。
3.伪随机数发生器的输出取决于输入密钥的值。
为了防止穷举攻击,密钥应该足够长,对于分组密码也要有同样的考虑。
因此,从目前的软硬件技术发展来看,至少应当保证密钥长度不小于128比特。
流密码的主要优点是其相当于分组密码来说,往往速度更快而且需要编写的代码更少。
表6.2PentiumII上对称密码的速度对比
密码
密钥长度
速度(Mb/s)
DES
56
9
3DES
168
3
RC4
可变
45
分组密码的优点是可以重复使用密钥,然而如果用流密码对两个明文加密中使用相同的密钥,则密码分析就会相当容易,因为对两个密文流进行异或,得出的结果就是两个原始明文的异或。
应用:
对于需要对数据流进行加密解密的应用,比如通过一个数据通信信道或者网页浏览连接,流密码就是很好的解决方案。
而对于处理成块的数据,比如文件传输,电子邮件和数据库,分组密码则更为适用。
6.3.2RC4算法
RC4是RonRivest为RSA公司在1987年设计的一种流密码。
它是一个可变密钥长度、面向字节操作的流密码。
该算法以随机置换作为基础。
分析显示该密码的周期大于10100。
每输出一个字节的结果仅需要8条到16条机器操作指令。
RC4算法:
用从1到256个字节(8~2048比特)的可变长度密钥初始化一个256个字节的状态向量S,S的元素记为S[0],S[1],…,S[255],从始到终置换后的S包含从0~255所有的8比特数。
对于加密和解密,字节K由S中255个元素按一定方式选出一个元素而生成。
每生成一个K的值,S中的元素个体就被重新置换一次。
初始化S
开始时,S中元素的值被置为按升序从0~255,即S[0]=0,S[1]=1,…,S[255]=255。
同时建立一个临时矢量T。
如果密钥K的长度为256字节,则将K赋给T。
否则若密钥长度为keylen字节,则将K的值赋给T的前keylen个元素,并循环重复用K的值赋给T剩下的元素,直到T的所有元素都被赋值。
这些操作可被概括如下:
/*Initialiation*/
fori=0to255do
S[i]=i;
T[i]=K[imodkeylen];
然后用T产生S的初始置换,从S[0]到S[255],对每个S[i],根据由T[i]确定的方案,将S[i]置换为S中的另一字节:
/*InitialPermutationofS*/
j=0;
fori=0to255do
j=(j+S[i]+T[i])mod256;
Swap(S[i],S[j]);
因为对S的操作仅是交换,所以惟一的改变就是置换。
S仍然包含所有值为0~255的元素。
密钥流的生成
矢量S一旦完成初始化,输入密钥就不再被使用,密钥流的生成是从S[0]到S[255],对每个S[i],根据当前S的值,将S[i]与S中的另一字节置换。
当S[255]完成置换后,操作继续重复从S[0]开始:
/*StreamGeneration*/
i,j=0;
while(true)
i=(i+1)mod256
j=(j+S[i])mod256;
Swap(S[i],S[j]);
t=(S[i]+S[j])mod256;
K=S[t];
加密中,将k的值与下一明文字节异或;解密中,将k的值与下一密文字节异或。
关于分析RC4的攻击方法有许多公开发表的文献,但没有哪种方法对于攻击足够长度密钥(如128比特)的RC4有效。
思考题:
1.分组密码的工作模式有哪几种?
各种模式的特点是什么?
2.二密钥三重DES如何复用同一密钥?
(用公式表示)。
对二密钥三重DES的穷举攻击代价是多少?
3.请列出设计流密码要考虑的重要因素。
4.为什么流密码的密钥不能重复使用?
5.RC4中用到的基本操作是什么?
6.实验题:
(1)*利用java加密包编程实现二密钥三重DES算法。
(2)*编程实现RC4算法。