密码学中的数据加密标准(DES)

一、背景与历史

数据加密标准(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)
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位密文。
其过程如下图:
密码学中的数据加密标准(DES)
2.初始置换
初始置换只发生一次,是在第一轮之前进行的,指定初始置换中的变换如何进行,如下表所示。例如,它指出初始置换将原明文块中的第一位换成原明文块的第58位,第二位换成明文块的第50位,等等,这只是把明文块的进行移位。

明文块中各个位置 初始置换后的内容
1 58
2 60
3 42
64 7

上表显示了IP使用的一部分变换规则表。IP完成后,得到的64位置换文本块分成两半,各32位,左块称为左明文(LPT),右块称为右明文(RPT)。然后对这两块进行16轮操作。
3.DES的一轮
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位块的第一位和第四位。其扩展的流程如下图:
密码学中的数据加密标准(DES)
注意第一个输入位在第二个输入位重复,并在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位输出,其过程如下图所示:
密码学中的数据加密标准(DES)
可以把每个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盒置换的结果进行异或运算,结果成为新的右明文,并通过交换将旧的右明文变成新的左明文,其过程如下图所示:
密码学中的数据加密标准(DES)
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位**,这样就有2562^{56}中可能的**,这看起来使用蛮力攻击不太实际的。假设即使检查一般**(即一般**空间)就可以找到正确的**,一台计算机每微秒进行一次DES加密,也要1000年的时间才能**。
差分与线性密码分析:1990年,EH Biham与Adi Shamir引人了差分密码分析的概念。这个方法寻找明文具有特定差分的密文对,在明文经过DES不同轮次时分析这些差分的进展。目的是选择具有固定差别的明文对。可以随机选择两个明文,只要其满足特定差分条件(可以是简单异成)。然后在得到的密文中使用差别,对不同**指定不同相似性。分析越来越多的密文对后,就可以得到正确的**。
线性密码分析攻击是Mitsuru Matsui发明的,采用线性近似法。如果把一些明文位进行异或操作,把一些密文位进行异或,然后把结果进行异或,则会得到一个位,是一些**位的异成。
计时攻击:计时攻击更多的是针对非对你**加密,但也可用于对称**加密。其思想很简单:观察加密算法在解密不同密文块所花费的时间长短。通过观察这些计时,来尝试获得明文或用于加密的**。通常,解密不同长度的明文块所花费的时间是不同的。