这周研究了DES相关的知识,花了很长时间终于彻底理解了原理,这里就来详细的介绍下。0x01 简介
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。0x02 原理
DES采用了64位的分组长度和56位的密钥长度,它将64位的输入经过一系列变换得到64位的输出。解密则使用了相同的步骤和相同的密钥。DES的密钥长度为64位,由于第n*8(n=1,2,…8)是校验位,因此实际参与加密的长度为56位,密钥空间含有2^56个密钥。初始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
2.左右分组
C0(28位)=K57K49K41....K44K3657,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...K12K463,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
3.循环左移
根据轮数,将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
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
4.再次置换
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。需要注意其中循环左移的位数。将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。经过初始置换后,进行16轮完全相同的运算,在运算过程中数据与秘钥结合。函数f的输出经过一个异或运算,和左半部分结合形成新的右半部分,原来的右半部分成为新的左半部分。每轮迭代过程如下:Rn = L(n - 1)⊕f(Rn-1,kn-1)Kn是向第N层输入的48位的秘钥,f是以Rn-1和Kn为变量的输出32位的函数函数f
函数f由四步运算构成:子密钥生成、扩展置换、S盒代替、P盒置换通过扩展置换E,数据的右半部分Rn从32位扩展到48位。扩展置换改变了位的次序,重复了某些位。a、产生与秘钥相同长度的数据以进行异或运算,R0是32位,子秘钥是48位,所以R0要先进行扩展置换之后与子秘钥进行异或运算;b、提供更长的结果,使得在替代运算时能够进行压缩。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的输入是110011.第一位和最后一位组合形成11(二进制),转成10进制为3,即对应S盒8的第3行。中间四位组成1001(二进制),转成10进制为9,对应S盒第9列。因此输出结果为S盒8第3行第9列值的二进制,即12的二进制1100.经过S盒代替运算得到的32位输出作为P盒置换的输入块。将32位的输入的第16位放在第一位,第七位放在第二位,第二十位放在第三位,以此类推。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。0x03 示例
DES处理比特或者说二进制数字。我们知道,每四个比特构成一个十六进制数。DES加密一组64位的信息,也就是16个16进制数。为了完成加密,DES同样使用64位长的密码。但是,秘钥中每8位被忽略掉,这样导致DES中有效秘钥长度为56位。但是在任何情况下,每64位一个块是DES永恒的组织方式。但大部分情况下,现实生活中的明文都不是64位(16个16进制位)的整数倍。Your lips are smoother than vaseline
ps:一个字节8比特,就是八个二进制位,可以表示两个16进制的数。所以在DES加密前,这段文本必须在尾部补充一些额外的字节。一旦密文被解密,这些多余的字节将被丢弃。当然,具体有多种补充的方法。在这里,我们简单地补充0在尾部,使得消息是8字节的整数倍。596F7572206C6970 732061726520736D 6F6F746865722074 68616E2076617365 6C696E650D0A
注意这里前72个十六进制数字代表英文,但0D代表回车符,0A代表换行符,代表文本文件的结束。然后我们在这段十六进制码的尾部添加一些0,使其恰好为80个十六进制位:596F7572206C6970 732061726520736D 6F6F746865722074 68616E2076617365 6C696E650D0A0000
C0999FDDE378D7ED 727DA00BCA5A84EE 47F269A4D6438190 9DD52F78F5358499 828AC9B453E0E653
这就是可供传输或储存的秘密代码了。解密它就可以得到原文“Your lips are smoother than vaseline”。0x04 后序
可能看起来比较难,但是理解了还是挺容易的。如果感觉不太理解的话可以私信我,欢迎大家一起学习交流。来源:先知(https://xz.aliyun.com/t/6748#toc-0)如有侵权,请联系删除
每日坚持学习与分享,觉得文章对你有帮助可在底部给点个“再看”