一、背景与历史
数据加密标准(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位密钥,这样就有
2
56
2^{56}
256中可能的密钥,这看起来使用蛮力攻击不太实际的。假设即使检查一般密钥(即一般密钥空间)就可以找到正确的密钥,一台计算机每微秒进行一次DES加密,也要1000年的时间才能破解。
差分与线性密码分析:1990年,EH Biham与Adi Shamir引人了差分密码分析的概念。这个方法寻找明文具有特定差分的密文对,在明文经过DES不同轮次时分析这些差分的进展。目的是选择具有固定差别的明文对。可以随机选择两个明文,只要其满足特定差分条件(可以是简单异成)。然后在得到的密文中使用差别,对不同密钥指定不同相似性。分析越来越多的密文对后,就可以得到正确的密钥。
线性密码分析攻击是Mitsuru Matsui发明的,采用线性近似法。如果把一些明文位进行异或操作,把一些密文位进行异或,然后把结果进行异或,则会得到一个位,是一些密钥位的异成。
计时攻击:计时攻击更多的是针对非对你密钥加密,但也可用于对称密钥加密。其思想很简单:观察加密算法在解密不同密文块所花费的时间长短。通过观察这些计时,来尝试获得明文或用于加密的密钥。通常,解密不同长度的明文块所花费的时间是不同的。