一、背景与历史
数据加密标准(Data Encryption Standard,DES)也称为数据加密算法(Data Encryption Algorithm,DEA)(ANSI)和DEA-1(ISO),是最近20年来使用的加密算法。介绍DES的细节还有两个作用:第一:介绍DES;第二,更重要的是分析和理解实际的加密算法。利用这个方法,我们还要从概念上介绍其他的加密算法,但不准备深入介绍,因为通过DES介绍已经可以了解计算机加密算法的工作原理。
DES的产生可以追溯到1972年,美国的国家标准局(NBS,即现在的国家标准与技术会NIST)启动了一个项目,旨在保护计算机和计算机通信中的数据。它们想开发一个加密算法。两年之后,NBS发现IBM公司的Lucifer相当理想,没必要从头开发一个新的加算法。经过几次讨论,NBS于1975年发布了这个加密算法的细节。到1976年底,美国邦政府决定采用这个算法,并将其更名为DES。不久,其他组织也认可和采用DES作为算法。
二、DES的工作原理
1.基本与原理
DES是个块加密法,按64位块长加密数据,即把64位明文作为DES的输入,产生64位密文输出。加密与解密使用相同的算法和**,只是稍作改变。**长度位56位,下图显示了DES的工作原理:

DES使用56位**。实际上,最初的**是64位,但在DES过程开始之前放弃**的第8位,从而得到56位**,即放弃第8、16、24、32、40、48、56和64位。放弃之前,可以用这些位进行奇偶校验,保证**中不包含任何错误。
简单地说,DES利用加密的两个基本属性:替换和变换。DES一共16步,每一步称为一轮,每一轮进行替换与变换步骤,下面介绍DES的主要步骤:
(1)首先将64位明文块送入初始置换函数。
(2)对明文进行初始置换。
(3)初始置换产生转换块的两半,假设为左明文(LPT)和右明文(RPT)。
(4)每个左明文与右明文经过16轮加密过程,各有各的**。
(5)最后,将左明文和右明文重新连接起来,对组成的块进行最终置换。
(6)这个过程的结果得到64位密文。
其过程如下图:

2.初始置换
初始置换只发生一次,是在第一轮之前进行的,指定初始置换中的变换如何进行,如下表所示。例如,它指出初始置换将原明文块中的第一位换成原明文块的第58位,第二位换成明文块的第50位,等等,这只是把明文块的进行移位。
明文块中各个位置 |
初始置换后的内容 |
1 |
58 |
2 |
60 |
3 |
42 |
… |
… |
64 |
7 |
上表显示了IP使用的一部分变换规则表。IP完成后,得到的64位置换文本块分成两半,各32位,左块称为左明文(LPT),右块称为右明文(RPT)。然后对这两块进行16轮操作。
3.DES的一轮
DES的每一轮包括如下图所示的所有步骤:

第一步:**交换
最初的64位**通过放弃每个第8位而得到的56位**。这样,每一轮有56位**。每一轮从这个56位**产生不同的48位子**,称为**交换。为此,56位**分成两半,各为28位,循环左移一位或两位。例如,可以用下表显示每一轮移动的**位数:
轮次 |
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 |
相应移位后,选择56位中的48位。选择56位中的48位时使用如下表:
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 |
由于**交换要进行置换和选择56位的48位,因此称为压缩置换。
第二步:扩展置换
经过初试置换后,我们得到两个32位的明文区,分别称为左明文和右明文。扩展置换将32位扩展到48位。除了从32位扩展到48位之外,这些位也进行置换,因此称为扩展置换,其过程可以如下表示:
(1)将32位右明文分成8块,每块各有4位。
(2)将上一步的每个4位块扩展成6位,即每个4位块增加2位。增加的2位实际上是重复4位块的第一位和第四位。其扩展的流程如下图:

注意第一个输入位在第二个输入位重复,并在48位重复,同样第32个输出位在第47个输出位和第一个输出位。因此扩展置换实际上可以用如下表所示:
32 |
1 |
2 |
3 |
4 |
5 |
4 |
5 |
6 |
7 |
8 |
9 |
8 |
9 |
10 |
11 |
12 |
13 |
12 |
13 |
14 |
15 |
16 |
17 |
16 |
17 |
18 |
19 |
20 |
21 |
20 |
21 |
22 |
23 |
24 |
25 |
24 |
25 |
26 |
27 |
28 |
29 |
28 |
29 |
30 |
31 |
32 |
1 |
现在将**与48位右明文进行异或运算,将结果传递到下一步。
第三步:S盒替换
S盒替换过程从压缩**与扩展右明文异或运算得到的48位输入用替换技术得到32位输出。替换使用了8个替换盒(也称为S盒),每个盒有6个输入位和4个输出位。48位输入块分成8个字块(各有6位),每个子块制定一个S盒。S盒将6为输入变成4位输出,其过程如下图所示:

可以把每个S盒看成一个表,4行(0到3)和16列(0到15),这样共有8个表。在每个行和列的相交处,有一个4位数(是S盒的4位输出),S盒的8个表,如下表所示:
14 |
4 |
13 |
1 |
2 |
15 |
11 |
8 |
3 |
10 |
6 |
12 |
5 |
9 |
0 |
7 |
0 |
15 |
7 |
4 |
14 |
2 |
13 |
1 |
10 |
6 |
12 |
11 |
9 |
5 |
3 |
8 |
4 |
1 |
14 |
8 |
13 |
6 |
2 |
11 |
15 |
12 |
9 |
7 |
3 |
10 |
5 |
0 |
15 |
12 |
8 |
2 |
4 |
9 |
1 |
7 |
5 |
11 |
3 |
14 |
10 |
0 |
6 |
13 |
15 |
1 |
8 |
14 |
6 |
11 |
3 |
4 |
9 |
7 |
2 |
13 |
12 |
0 |
5 |
10 |
3 |
13 |
4 |
7 |
15 |
2 |
8 |
14 |
12 |
0 |
1 |
10 |
6 |
9 |
11 |
5 |
0 |
14 |
7 |
11 |
10 |
4 |
13 |
1 |
5 |
8 |
12 |
6 |
9 |
3 |
2 |
15 |
13 |
8 |
10 |
1 |
3 |
15 |
4 |
2 |
11 |
6 |
7 |
12 |
0 |
5 |
1 |
49 |
10 |
0 |
9 |
14 |
6 |
3 |
15 |
5 |
1 |
13 |
12 |
7 |
11 |
4 |
2 |
8 |
13 |
7 |
0 |
9 |
3 |
4 |
6 |
10 |
2 |
8 |
5 |
14 |
12 |
11 |
15 |
1 |
13 |
6 |
4 |
9 |
8 |
15 |
3 |
0 |
11 |
1 |
2 |
12 |
5 |
10 |
14 |
7 |
1 |
10 |
13 |
0 |
6 |
9 |
8 |
7 |
4 |
15 |
14 |
3 |
11 |
5 |
2 |
12 |
7 |
13 |
14 |
3 |
0 |
6 |
9 |
10 |
1 |
2 |
8 |
5 |
11 |
12 |
4 |
15 |
13 |
8 |
11 |
5 |
6 |
15 |
0 |
3 |
4 |
7 |
2 |
12 |
1 |
10 |
14 |
9 |
10 |
6 |
9 |
0 |
12 |
11 |
7 |
13 |
15 |
1 |
3 |
14 |
5 |
2 |
8 |
4 |
3 |
15 |
0 |
6 |
10 |
1 |
13 |
8 |
9 |
4 |
5 |
11 |
12 |
7 |
2 |
14 |
2 |
12 |
4 |
1 |
7 |
10 |
11 |
6 |
8 |
5 |
3 |
15 |
13 |
0 |
14 |
9 |
14 |
11 |
2 |
12 |
4 |
7 |
13 |
1 |
5 |
0 |
15 |
10 |
3 |
9 |
8 |
6 |
4 |
2 |
1 |
11 |
10 |
13 |
7 |
8 |
15 |
9 |
12 |
5 |
6 |
3 |
0 |
14 |
11 |
8 |
12 |
7 |
1 |
14 |
2 |
13 |
6 |
15 |
0 |
9 |
10 |
4 |
5 |
3 |
12 |
1 |
10 |
15 |
9 |
2 |
6 |
8 |
0 |
13 |
3 |
4 |
14 |
7 |
5 |
11 |
10 |
15 |
4 |
2 |
7 |
12 |
9 |
5 |
6 |
1 |
13 |
14 |
0 |
11 |
3 |
8 |
9 |
14 |
15 |
5 |
2 |
8 |
12 |
3 |
7 |
0 |
4 |
10 |
1 |
13 |
11 |
6 |
4 |
3 |
2 |
12 |
9 |
5 |
15 |
10 |
11 |
14 |
1 |
7 |
6 |
0 |
8 |
13 |
4 |
11 |
2 |
14 |
15 |
0 |
8 |
13 |
3 |
12 |
9 |
7 |
5 |
10 |
6 |
1 |
13 |
0 |
11 |
7 |
4 |
9 |
1 |
10 |
14 |
3 |
5 |
12 |
2 |
15 |
8 |
6 |
1 |
4 |
11 |
13 |
12 |
3 |
7 |
14 |
10 |
15 |
6 |
8 |
0 |
5 |
9 |
2 |
6 |
11 |
13 |
8 |
1 |
4 |
10 |
7 |
9 |
5 |
0 |
15 |
14 |
2 |
3 |
12 |
13 |
2 |
8 |
4 |
6 |
15 |
11 |
1 |
10 |
9 |
3 |
14 |
5 |
0 |
12 |
7 |
1 |
15 |
13 |
8 |
10 |
3 |
7 |
4 |
12 |
5 |
6 |
11 |
0 |
14 |
9 |
2 |
7 |
11 |
4 |
1 |
9 |
12 |
14 |
2 |
0 |
6 |
10 |
13 |
15 |
3 |
5 |
8 |
2 |
1 |
14 |
7 |
4 |
10 |
8 |
13 |
15 |
12 |
9 |
0 |
3 |
5 |
6 |
11 |
6位输入表示选择哪个行哪个列(即那个交点),因此确定4个输出。假设S盒的6位表示为b1、b2、b3、b4、b5、与b6。现在,b1和b6组合,形成一个两位数,两位数可以存储0到3的任何值,它指定行号。其余四位b2、b3、b4和b5形成一个四位数,指定0到15的列号。这样,这个6位输入自动选择行号和列号,可以选择输出。所有S盒的输出组成32位块,传递到一轮的下一阶段,即P盒置换。
第四步:P盒置换
所有S盒的输出组成32位块,对该32位要进行P盒置换。P盒置换机制只是进行简单的置换(即按P表指定把一位换成另一位,而不进行扩展的压缩)。下表显示了P盒:
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 |
第一块的16位表示源输入的第16位移到输出的第一位,第16块的10表示源输入的第10位移到输出的第16位。
第五步:异或或交换
注意上述步骤只是处理了64位明文的右边32位(即右明文),还没有处理左边部分(左明文)。这时,最初的64位明文的左半部分与P盒置换的结果进行异或运算,结果成为新的右明文,并通过交换将旧的右明文变成新的左明文,其过程如下图所示:

4.最终置换
16轮结束之后,进行最终置换(只有一次),即按如下表格进行变换:
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 |
上表所示可以发现第40位输入代替第1位输出,等等。
最终置换的输出就是64位加密块。
5.DES解密
DES加密算法也适用于解密,各个表的值和操作及其顺序是经过精心选择的,使得这个算法可逆。加密与解密过程的唯一差别是**部分倒过来了。如果原先的**K分解为K1,K2,K3,…,K16,用于16轮加密,则解***应为K16,K15,K14,…,K1。
6.分析DES
S盒的使用:DES中的替换表被IBM保密,IBM花费17年的时间提出了S盒的内部设计。一些研究认为,通过S盒,可以对DES进行一定范围的攻击,但是知道现在,也没有具体示例出现。
**长度:任何加密系统都有两个重要方面:加密算法和**。DES算法的内部工作原理对公众是完全公开的。因此,DES的抗攻击强度只能依赖**,这必须是保密的。
DES使用的是56位**,这样就有256中可能的**,这看起来使用蛮力攻击不太实际的。假设即使检查一般**(即一般**空间)就可以找到正确的**,一台计算机每微秒进行一次DES加密,也要1000年的时间才能**。
差分与线性密码分析:1990年,EH Biham与Adi Shamir引人了差分密码分析的概念。这个方法寻找明文具有特定差分的密文对,在明文经过DES不同轮次时分析这些差分的进展。目的是选择具有固定差别的明文对。可以随机选择两个明文,只要其满足特定差分条件(可以是简单异成)。然后在得到的密文中使用差别,对不同**指定不同相似性。分析越来越多的密文对后,就可以得到正确的**。
线性密码分析攻击是Mitsuru Matsui发明的,采用线性近似法。如果把一些明文位进行异或操作,把一些密文位进行异或,然后把结果进行异或,则会得到一个位,是一些**位的异成。
计时攻击:计时攻击更多的是针对非对你**加密,但也可用于对称**加密。其思想很简单:观察加密算法在解密不同密文块所花费的时间长短。通过观察这些计时,来尝试获得明文或用于加密的**。通常,解密不同长度的明文块所花费的时间是不同的。