这周研究了DES相关的知识,花了很长时间终于彻底理解了原理,这里就来详细的介绍下。
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。
入口参数
Key:7字节共56位,是DES算法的工作密钥
Data:8字节64位,是要被加密或被解密的数据
Mode:DES的工作方式,分为加密或解密
DES采用了64位的分组长度和56位的密钥长度,它将64位的输入经过一系列变换得到64位的输出。解密则使用了相同的步骤和相同的密钥。DES的密钥长度为64位,由于第n*8(n=1,2,…8)是校验位,因此实际参与加密的长度为56位,密钥空间含有2^56个密钥。
### 子密钥的生成
##### 1.初始置换
初始Key值为64位,但其中的第8、16...等位是奇偶校验位,不参与运算。故64位Key先通过选择换位表(置换选择表1)的变换变成56位。
==ps:这里的数字表示原数据的位置,不是数据==
57,49,41,33,25,17,9,1,
58,50,42,34,26,18,10,2,
59,51,43,35,27,19,11,3,
60,52,44,36,63,55,47,39,
31,23,15,7,62,54,46,38,
30,22,14,6,61,53,45,37,
29,21,13,5,28,20,12,4
将56位密钥分成C0和D0两部分。
C0(28位)=K57K49K41....K44K36
57,49,41,33,25,17,9,
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
D0(28位)=K63K55K47...K12K4
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4
根据轮数,将Cn和Dn分别循环左移1位或2位。
每轮循环左移移动的位数如下:
第一轮是循环左移1位。C0循环左移1位后得到C1如下:
49,41,33,25,17,9,1,
58,50,42,34,26,18,10,
2,59,51,43,35,27,19,
11,3,60,52,44,36,57
D0循环左移1位后得到D1如下:
55,47,39,31,23,15,7,
62,54,46,38,30,22,14,
6,61,53,45,37,29,21,
13,5,28,20,12,4,63
C1和D1合并之后,再经过置换选择表2生成48位的子秘钥K1。
去掉第9、18、22、25、35、38、43、54位,从56位变成48位,再按表的位置置换。置换选择表2(PC-2)如下:
14,17,11,24,1,5,
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32
此时得到子密钥K1。C1和D1再次经过循环左移变换生成C2和D2.C2和D2合并,通过PC-2生成子密钥K2。
以此类推得到子密钥K1~K16。需要注意其中循环左移的位数。
#### 密文生成
1.初始置换
将64位的明文输入块通过初始置换函数变为64位的密文输出块,并把输出块分为L0、R0两部分,每部分均为32位。初始置换规则如下:
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17, 9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7,
即将输入的64位明文的第1位置换到第40位,第2位置换到第8位,第3位置换到第48位。以此类推,最后一位是原来的第7位。置换规则是规定的。L0(Left)是置换后的数据的前32位,R0(Right)是置换后的数据的后32位。
例如:64位输入块是D1~D64,则经过初始置换后是D58,D50...D7。则L0=D58,D50,D12...D8;R0=D57,D49,D41...D7。
2.加密处理
经过初始置换后,进行16轮完全相同的运算,在运算过程中数据与秘钥结合。
函数f的输出经过一个异或运算,和左半部分结合形成新的右半部分,原来的右半部分成为新的左半部分。每轮迭代过程如下:
Ln = R(n - 1);
Rn = L(n - 1)⊕f(Rn-1,kn-1)
⊕:异或运算
Kn是向第N层输入的48位的秘钥,f是以Rn-1和Kn为变量的输出32位的函数
函数f由四步运算构成:子密钥生成、扩展置换、S盒代替、P盒置换
子密钥生成上面已经说过,接下来说扩展置换。
扩展置换E(E位选择表)
通过扩展置换E,数据的右半部分Rn从32位扩展到48位。扩展置换改变了位的次序,重复了某些位。
扩展置换的目的:
a、产生与秘钥相同长度的数据以进行异或运算,R0是32位,子秘钥是48位,所以R0要先进行扩展置换之后与子秘钥进行异或运算;
b、提供更长的结果,使得在替代运算时能够进行压缩。
扩展置换E规则如下:
S盒代替
Rn扩展置换之后与子秘钥Kn异或以后的结果作为输入块进行S盒代替运算,功能是把48位数据变为32位数据。
代替运算由8个不同的代替盒(S盒)完成。每个S盒有6位输入,4位输出。
所以48位的输入块被分成8个6位的分组,每一个分组对应一个S盒代替操作。经过S-盒代替,形成8个4位分组结果。
==注意:每一个S盒的输入数据是6位,输出数据是4位,但是每个S-盒自身是64位!!==
8个S-盒的值如下图(从上到下依次为S1-S8):
以S盒8为例:
假设S盒8的输入是110011.第一位和最后一位组合形成11(二进制),转成10进制为3,即对应S盒8的第3行。中间四位组成1001(二进制),转成10进制为9,对应S盒第9列。因此输出结果为S盒8第3行第9列值的二进制,即12的二进制1100.
P盒置换
经过S盒代替运算得到的32位输出作为P盒置换的输入块。将32位的输入的第16位放在第一位,第七位放在第二位,第二十位放在第三位,以此类推。
P-盒置换表(表示数据的位置)共32位
16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,
2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25,
经过P-盒置换的结果与最初64位分组的左半部分异或,然后左右两部分交换,开始下一轮迭代。
逆置换
经过16次的迭代运算后,将左右两部分合并,再次经过初始逆置换IP^-1,它是初始置换的逆运算,最后得到分组的最终密文。
从初始置换规则中可以看到,原始数据的第1位置换到了第40位,第2位置换到了第8位。则逆置换就是将第40位置换到第1位,第8位置换到第2位。以此类推,逆置换规则如下:
40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58 26,33,1,41, 9,49,17,57,25,
加密和解密可以使用相同的算法。加密和解密唯一不同的是秘钥的次序是相反的。就是说如果每一轮的加密秘钥分别是K1、K2、K3...K16,那么解密秘钥就是K16、K15、K14...K1。为每一轮产生秘钥的算法也是循环的。加密是秘钥循环左移,解密是秘钥循环右移。解密秘钥每次移动的位数是:0、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1。
DES处理比特或者说二进制数字。我们知道,每四个比特构成一个十六进制数。DES加密一组64位的信息,也就是16个16进制数。为了完成加密,DES同样使用64位长的密码。但是,秘钥中每8位被忽略掉,这样导致DES中有效秘钥长度为56位。但是在任何情况下,每64位一个块是DES永恒的组织方式。
但大部分情况下,现实生活中的明文都不是64位(16个16进制位)的整数倍。
比如:
Your lips are smoother than vaseline
这段文本是38个字节(76个16进制位)长的。
ps:一个字节8比特,就是八个二进制位,可以表示两个16进制的数。
所以在DES加密前,这段文本必须在尾部补充一些额外的字节。一旦密文被解密,这些多余的字节将被丢弃。当然,具体有多种补充的方法。在这里,我们简单地补充0在尾部,使得消息是8字节的整数倍。
这段纯文本在16进制下是:
596F7572206C6970 732061726520736D 6F6F746865722074 68616E2076617365 6C696E650D0A
注意这里前72个十六进制数字代表英文,但0D代表回车符,0A代表换行符,代表文本文件的结束。然后我们在这段十六进制码的尾部添加一些0,使其恰好为80个十六进制位:
596F7572206C6970 732061726520736D 6F6F746865722074 68616E2076617365 6C696E650D0A0000
如果我们秘钥
0E329232EA6D0D73
加密这段数据,我们将得到如下密文:
C0999FDDE378D7ED 727DA00BCA5A84EE 47F269A4D6438190 9DD52F78F5358499 828AC9B453E0E653
这就是可供传输或储存的秘密代码了。解密它就可以得到原文“Your lips are smoother than vaseline”。
可能看起来比较难,但是理解了还是挺容易的。如果感觉不太理解的话可以私信我,欢迎大家一起学习交流。