Welcome 微信登录

首页 / 操作系统 / Linux / DES算法详解

本文主要介绍了DES算法的步骤,包括IP置换、密钥置换、E扩展置换、S盒代替、P盒置换和末置换。

1.DES算法简介

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准。 DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。 密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组。 DES算法的主要流程如下图所示,本文按照流程依次介绍每个模块。

2.IP置换

IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。 置换规则如下表所示:
585042342618102
605244362820124
625446383022146
645648403224168
57494133251791
595143352719113
615345372921135
635547393123157
表中的数字代表原数据中此位置的数据在新数据中的位置,即原数据块的第1位放到新数据的第58位,第2位放到第50位,……依此类推,第64位放到第7位。置换后的数据分为L0和R0两部分,L0为新数据的左32位,R0为新数据的右32位。 设转换前的数据位D1D2D3…D64,则IP置换后的结果为L0=D58D50…D8,R0=D57D49…D7。0x0000 0080 0000 0002转换后的结果为0x0002 0000 0000 0001,且L0=0x0002 0000,R0=0x0000 0001。置换步骤如下: 原数据第33位为1,置换表第33位为64,因此将1放到新数据的第64位;原数据第63位为1,置换表第63位为7,因此将1放到新数据的第7位;其余值为0的位按此置换。要注意一点,位数是从左边开始数的,即最0x0000 0080 0000 0002最左边的位为1,最右边的位为64。

3.密钥置换

不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位。产生的56位密钥由下表生成(注意表中没有8,16,24,32,40,48,56和64这8位):
57494133251791585042342618
10259514335271911360524436
635547393123157625446383022
1466153453729211352820124
在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式如下: 1).将56位的密钥分成两部分,每部分28位。 2).根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
轮数12345678910111213141516
位数1122222212222221
移动后,从56位中选出48位。这个过程中,既置换了每位的顺序,又选择了子密钥,因此称为压缩置换。压缩置换规则如下表(注意表中没有9,18,22,25,35,38,43和54这8位):
14171124153281562110
23191242681672720132
415231374755304051453348
444939563453464250362932
        置换方法同上,此处省略。

4.E扩展置换

扩展置置换目标是IP置换后获得的右半部分R0,将32位输入扩展为48位(分为4位×8组)输出。 扩展置换目的有两个:生成与密钥相同长度的数据以进行异或运算;提供更??的结果,在后续的替代运算中可以进行压缩。 扩展置换原理如下表:
3212345
456789
8910111213
121314151617
161718192021
202122232425
242526272829
28293031321
表中的数字代表位,两列黄色数据是扩展的数据,可以看出,扩展的数据是从相邻两组分别取靠近的一位,4位变为6位。靠近32位的位为1,靠近1位的位为32。表中第二行的4取自上组中的末位,9取自下组中的首位。 我们举个例子看一下(虽然扩展置换针对的是上步IP置换中的R0,但为便于观察扩展,这里不取R0举例): 输入数据0x1081 1001,转换为二进制就是0001 0000 1000 0001B,按照上表扩展得下表
100010
100001
010000
000010
100010
100000
000000
000010
表中的黄色数据是从临近的上下组取得的,二进制为1000 1010 0001 0100 0000 0010 1000 1010 0000 0000 0000 0010B,转换为十六进制0x8A14 028A 0002。      扩展置换之后,右半部分数据R0变为48位,与密钥置换得到的轮密钥进行异或。

5.S盒代替

压缩后的密钥与扩展分组异或以后得到48位的数据,将这个数据送人S盒,进行替代运算。替代由8个不同的S盒完成,每个S盒有6位输入4位输出。48位输入分为8个6位的分组,一个分组对应一个S盒,对应的S盒对各组进行代替操作。 一个S盒就是一个4行16列的表,盒中的每一项都是一个4位的数。S盒的6个输入确定了其对应的输出在哪一行哪一列,输入的高低两位做为行数H,中间四位做为列数L,在S-BOX中查找第H行L列对应的数据(<32)。 8个S盒如下: S盒1
1441312151183106125907
0157414213110612119538
4114813621115129731050
1512824917511314100613
S盒2
1518146113497213120510
3134715281412011069115
0147111041315812693215
1381013154211671205149
S盒3
1009146315511312711428
1370934610285141211151
1364981530111212510147
1101306987415143115212
S盒4
7131430691012851112415
13811561503472121101419
1069012117131513145284
3150610113894511127214
S盒5
2124171011658315130149
1411212471315015133986
4211110137815912563014
1181271142136150910453
S盒6
1211015926801334147511
1015427129561131401138
9141552812370410113116
4321295151011141760813
S盒7
4112141508133129751061
1301174911014351221586
1411131237141015680592
6111381410795015142312
S盒8
1328461511110931450127
1151381037412561101492
7114191214206101315358
2114741081315129035611
  例如,假设S盒8的输入为110011,第1位和第6位组合为11,对应于S盒8的第3行;第2位到第5位为1001,对应于S盒8的第9列。S盒8的第3行第9列的数字为12,因此用1100来代替110011。注意,S盒的行列计数都是从0开始。 代替过程产生8个4位的分组,组合在一起形成32位数据。      S盒代替时DES算法的关键步骤,所有的其他的运算都是线性的,易于分析,而S盒是非线性的,相比于其他步骤,提供了更好安全性。 

6.P盒置换

S盒代替运算的32位输出按照P盒进行置换。该置换把输入的每位映射到输出位,任何一位不能被映射两次,也不能被略去,映射规则如下表:
167202129122817
11523265183110
282414322739
9133062211425
表中的数字代表原数据中此位置的数据在新数据中的位置,即原数据块的第16位放到新数据的第1位,第7位放到第2位,……依此类推,第25位放到第32位。 例如0x10A1 0001进行P盒置换后变为0x8000 0886。 0x10A1 0001表现为表的形式(第一位位于左上角)原来为
00010000
10100001
00000000
00000001
经P盒变换后为
10000000
00000000
00001000
10000110
即1000 0000 0000 0000 0000 1000 1000 0110B,十六进制为0x8000 0886。  最后,P盒置换的结果与最初的64位分组左半部分L0异或,然后左、右半部分交换,接着开始另一轮。 

7.IP-1末置换

末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。末置换规则如下表:
408481656246432
397471555236331
386461454226230
375451353216129
364441252206028
353431151195927
342421050185826
33141949175725
置换方法同上,此处省略。 经过以上步骤,就可以得到密文了。本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/135884.htm