DES在过去的大多时间里,是最主流的分组密码。但是,因为它的密钥空间太小,所以并不是那么安全。不过,作为对称算法的典型,是值得学习的。

混淆和扩散

首先,我们先给出两个操作的概念,混淆和扩散。

  • 混淆(Confusion):是一种使密钥与密文间关系尽可能模糊的加密操作。如今实现混淆常用的一个元素就是替换。
  • 扩散(Diffusion):是一种为了隐藏明文统计属性而将一个明文符号的影响扩散到多个密文符号的加密操作。最简单的扩散元素就是位置换,常用于DES中;而AES啧使用更高级的Mixcolumn操作。

DES算法

DES是一种使用了56位密钥,对64位长分组进行加密的算法,它是一种对称密码,即加密和解密过程使用相同的密钥。DES对明文的每个分组的加密过程都包含了16轮,且每轮操作完全相同。每轮使用不同的子密钥,子密钥是由主密钥推导而来。

下面是DES流程图

在明文经过初始置换后,被分为​。每轮操作都会把右半部分送入函数​中,得到的输出和​异或,最后这两部分交换,后面每轮都重复这个过程。

Step1:IP置换

IP置换的目的是把明文按位重新组合,并把输出分为两部分。置换如下表

585042342618102
605244362820124
625446383022146
645648403224168
57494133251791
595143352719113
615345372921135
635547393123157

表中的数字代表新数据中此位置的数据在原数据中的位置,即原数据块的第58位放到新数据的第1位,第50位放到第2位,……依此类推,第7位放到第64位。置换后的数据分为​​​和​​两部分,​​​为新数据的左32位,​​​​为新数据的右32位。

需要要注意一点,位数是从左边开始数的,即0x0001最左边的位为1,最右边的位为64。

Step2:密钥置换

不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位。产生的56位密钥由下表生成(注意表中没有8,16,24,32,40,48,56和64这8位):

57494133251791585042342618
10259514335271911360524436
635547393123157625446383022
1466153453729211352820124

在DES的每一轮中,从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式如下:

  • 将56位的密钥分成两部分,每部分28位。
  • 根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
轮数12345678910111213141516
位数1122222212222221

移动后,从56位中选出48位。这个过程中,既置换了每位的顺序,又选择了子密钥,因此称为压缩置换。置换规则如下表(注意表中没有9,18,22,25,35,38,43和54这8位):

14171124153281562110
23191242681672720132
415231374755304051453348
444939563453464250362932

Step3:​函数

函数包含了:E扩展置换、S盒、P置换

E扩展置换

扩展置置换目标:是把32位输入扩展为48位(分为4位×8组)输出。扩展置换目的有两个:生成与密钥相同长度的数据以进行异或运算;提供更长的结果,在后续的替代运算中可以进行压缩。

扩展置换原理如下表:

3212345
456789
8910111213
121314151617
161718192021
202122232425
242526272829
28293031321

最左和最右一列,是扩展数据。可以看出,扩展的数据是从相邻两组分别取靠近的一位,4位变为6位。靠近32位的位为1,靠近1位的位为32。表中第二行的4取自上组中的末位,9取自下组中的首位。

扩展置换之后,右半部分数据R0变为48位,与密钥置换得到的轮密钥进行异或。

S盒代替

压缩后的密钥与扩展分组异或以后,得到48位的数据,将这个数据送入S盒,进行替代运算。替代由8个不同的S盒完成,每个S盒有6位输入4位输出。48位输入分为8个6位的分组,一个分组对应一个S盒,对应的S盒对各组进行代替操作。

一个S盒就是一个4行16列的表,盒中的每一项都是一个4位的数。S盒的6个输入确定了其对应的输出在哪一行哪一列。若记一个输入的二进制为0b abcdef,那么0b af 决定了用盒中的第几行,0b bcde 决定了用盒中的第几列。

S盒依次如下

1441312151183106125907
0157414213110612119538
4114813621115129731050
1512824917511314100613
1518146113497213120510
3134715281412011069115
0147111041315812693215
1381013154211671205149
1009146315511312711428
1370934610285141211151
1364981530111212510147
1101306987415143115212
7131430691012851112415
13811561503472121101419
1069012117131513145284
3150610113894511127214
2124171011658315130149
1411212471315015133986
4211110137815912563014
1181271142136150910453
1211015926801334147511
1015427129561131401138
9141552812370410113116
4321295151011141760813
4112141508133129751061
1301174911014351221586
1411131237141015680592
6111381410795015142312
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盒是非线性的,相比于其他步骤,提供了更好安全性。

P盒置换

S盒代替运算的32位输出按照P盒进行置换。该置换把输入的每位映射到输出位,任何一位不能被映射两次,也不能被略去,映射规则如下表:

167202129122817
11523265183110
282414322739
19133062211425

最后,P盒置换的结果与最初的64位分组左半部分L0异或,然后左、右半部分交换,接着开始另一轮。

Step4:IP末置换

末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入。置换规则如下表:

408481656246432
397471555236331
386461454226230
375451353216129
364441252206028
353431151195927
342421050185826
33141949175725

 

经过以上步骤就可以得到密文。

reference: