文章目录
DES加密算法具体步骤
算法背景
DES全称为Data Encryption Standard,即数据加密标准,是一种使用**加密的块算法,1977年被美国联邦*的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级*通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。不过已经发现DES容易受到非常强大的攻击,因此DES的普及程度略有下降。
算法描述
DES算法明文分组长度为64 bit,**长度也为64 bit,但是实际**长度只有56位,其中第8、16、24、32、40、48、56、64位是奇偶校验位,用于检查**在产生、分配及存储过程中可能发生的错误。
算法流程图
原始文档给的算法流程图如下:
简化后流程图:
初始置换IP
利用初始置换IP(Initial Permutation)对明文X进行换位处理,打乱原来的次序,得到一个乱序的64 bit 明文组。
https://en.wikipedia.org/wiki/DES_supplementary_material
IP Table:
IP表的意思为:将X中的58位数据放在转换后生成的X’表的第1位,X中的第50位放在X’的第2位,X中的42位放在第3位…X中的第7位放在X’的最后一位。
例如,初始X为:01010011 01100101 01100011 01110010 01100101 01110100 00100000 01001101
则经过初始置换IP表进行置换后 变成:10111111 00101001 10110010 10010111 00000000 01111110 10000000 00001101 。
进行完IP置换后,将X分成左右两部分,左边记为L0,右边记为R0:
L0 = 10111111 00101001 10110010 10010111
R0 = 00000000 01111110 10000000 00001101
然后进入轮函数。
子**生成
在DES中,加密者输入的明文和**都是64 bit,其中只有56 bit是有用的位数(因为有8位为奇偶校验位)。但是DES加密过程有16轮循环函数,其中需要用到16个**,所以要将这56 bit**扩展生成16个48 bit 的子**。步骤如下:
1. 用PC_1表置换
PC_1置换的主要步骤和初始IP置换一样,PC_1置换的目的是为了去掉64 bit**k中的8个奇偶校验位,并对其余56位打乱排列。置换完成后,同样将**分成左右两部分各28 bit,左边为C0, 右边为D0。
例如:原始**:K=00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
经过PC_1置换后:K=1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
分成左右两部分C0和D0:
C0= 1111000 0110011 0010101 0101111
D0= 0101010 1011001 1001111 0001111
2. 创建16个块Cn和Dn
对于1<=n<=16,在第n轮分别对Cn-1和Dn-1进行循环左移,所移的位数为1位或者2位,取决于n的值,当n=1,2,9,16时左移1位,其它左移2位。因此表格如下:
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
左移位数 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
进行移位后得到C1到C16,,D1到D16。
3. 得到16个子**K
Kn = PC_2(CnDn),PC_2为固定置换,用于从 CnDn 中选取48 bit作为子**Kn,CnDn 表示从左到右将 Dn 排在 Cn 的后面,CnDn 的长度为56 bit。
至此,子**全部生成,进入轮函数。
轮函数
轮函数中将IP置换后的明文进行16次迭代,每个循环都使用我们之前计算的16个48 bit **之一。
F函数
加密函数f是整个DES算法的核心。函数f如上图所示,函数以长度为32 的比特串 A = R(32 bit)作为第1个输入,以长度为48的比特串变元J = K(48 bit)作为第2个输入,产生的输出是长度为32的比特串。
1. 位选择函数E
对第一个变元A,由给定的选择扩展函数可以将其扩展为48 比特串E(A)。
2. S盒代换
将 E(A) 和 K 进行异或操作后,把比特串分为8组,一组 6 bit,分别对每一组进行S盒代换。经过S盒,每一组由 6 bit 缩减为 4 bit。
S盒的行号从0到3,列号从0到15。
代换的过程如下,例如需要代换的第一组数据输入为011001,则第一位0和最后一位1组合成的01即为行号,中间的1101为列号,第一组数据对应S1,01转化成10进制为1,1101转化成10进制为13,因此S1中的第1行第13列就为对应的输出,查表得5,转化成2进制为0101。因此0101就为最终的4位输出。
3. P盒代换
P为固定置换,将经过S盒变换得到的32 bit进行一个置换操作。
至此,得到F函数的最终输出。
轮函数步骤
令+表示XOR加法 (模2诸位加法) ,对于第n轮有:
进行16轮,得到R16和L16。
逆初始置换IP-1
轮函数最后一步的左边32 bit和右边32 bit合成64 bit,再进行逆初始置换,得到最终密文。
IP-1 Table:
DES解密
DES的解密过程与加密过程相同,只不过在16次迭代中使用子**的次序正好相反。解密时,第1次迭代使用子**K16,第2次使用子**K15,以此类推…,第16次使用子**K1。
三重DES
DES的**长度被证明已经不能满足当前安全的要求,为了增强DES安全性,人们开始提出针对DES的各种改进方案,一种简单的方法就是使用多重DES,其中三重DES应用最广泛。三重DES就是使用3次DES运算,**长度增加到112 bit或168 bit,可以有效克服DES面临的穷举攻击,但实现速度更慢。因此,三重DES只是在DES变得不安全的情况下一种临时解决方案。