1. 什么是DES
DES(Data Encryption Standard)是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(FIPS 46-3)。DES一直以来被美国以及其它国家的政府和银行等广泛使用。
然而,随着计算机的进步,现在DES已经能够被暴力破解,强度大不如从前了。20世纪末,RSA公司举办过破译DES的比赛(DES Chanllenge),结果1997年的 DES Challenge I 中用了96天破译秘钥,1998年 DES Challenge II-1 中用了41天,1998年的 DES Challenge II-2 中用了56小时,1999年的 DES Challenge III 中只用了22小时15分钟。
由于DES的密文可以在短时间内被破译,因此除了用它来解密以前的密文以外,现在我们不应该再使用DES了。
DES是以64比特的明文(比特序列)为一个单位进行加密的,这个64比特的单位称为“分组”。以分组为单位进行处理的密码算法称为“分组密码”,DES就是分组密码的一种。
DES每次只能加密64比特的数据,因此,如果需要加密的明文比较长,就需要对DES加密进行迭代(反复),而迭代的具体方式就称为模式(mode)。关于模式的详细分析可参考另一篇文章:
【密码算法 之三】分组密码工作模式 (ECB \ CBC \ CFB \ OFB \ CTR \ XTS)浅析
。
2. 原理
DES的基本结构是由Horst Feistel设计的,因此称为Feistel网络(Feistel network)、Feistel结构(Feistel structure)或者Feistel密码(Feistel cipher)。这一结构不仅用于DES,在其他的很多密码算法中也有应用。
在该网络中,加密的各个步骤称为轮(round),整个加密过程就是若干轮的循环。DES是一种16轮循环的Feistel网络。
2.1 单轮 Feistel 网络
上图表示了Feistel网络的一轮数据处理的情况。输入的数据被等分为左右两半部分分别进行处理。在上图中左半部分称为“左侧”,由半部分称为“右侧”。
中间的“子秘钥”指的是本轮加密所使用的秘钥,在Feistel网络中,每一轮都需要使用不同的子秘钥。由于子秘钥只能在一轮中使用,因此属于“局部秘钥”,因此才称为子秘钥(subkey)。
轮函数的作用是根据“右侧”和子秘钥生成对“左侧”进行加密的比特序列,它是整个密码系统的核心。将轮函数的输出与“左侧”进行XOR运算,得到的结果过就是“加密后的左侧”,而输入的“右侧”则会直接称为“加密后的右侧”。
一轮运算的整体步骤如下:
- 将输入数据等分为左右两半部分;
- 将输入的右侧直接发送到输出的右侧;
- 将输入的右侧发送给“轮函数”;
- 轮函数根据右侧数据与子秘钥,计算出一串随机比特序列;
- 将步骤4中得到的随机比特序列与“左侧数据”进行异或(XOR)运算,并将数据结果作为加密后的左侧。
2.1 多轮 Feistel 网络
- 在Feistel运算时,需要使用不同的子秘钥对一轮数据进行重复若干次,并在每一轮处理之间将“左侧数据”和“右侧数据”对调;
- 最后一轮计算的输出,不需要对调;
- 由于XOR的特性,那么使用同一秘钥,进行一轮加密,再重新运行一次,则又会得到明文;
- Feistel网络的解密过程只需按照加密的相反顺序使用子秘钥,就可以完成数据的解密操作;
- Feistel网络的轮数可以任意增加,无论进行多少轮的运算,都不会出现无法解密的情况;
- 加密和解密使用完全相同的结构来实现,这是 Feistel网络的一个特点;
3. 3DES(TDEA)
三重DES(triple-DES)是为了增加DES的强度,将DES重复3次所得到的一种密码算法,也称为TDEA(Triple Data Encryption Algorithm),通常缩写为3DES。
三重DES加解密流程如下:
- 加密流程:加密(秘钥1)– 解密(秘钥2)– 加密(秘钥3)
- 解密流程:解密(秘钥1)– 加密(秘钥2)– 解密(秘钥3)
- 若秘钥1、秘钥2、秘钥3,使用完全一样的秘钥,那么3DES与DES是完全一样的
- 若秘钥1与秘钥3使用相同的秘钥,而秘钥2使用不同的秘钥,这种三重DES就称为DES-EDE2,如下图所示:
4. 子秘钥
DES的输入秘钥通常是64bit,其中每第8个位都作为前面7位的一个奇偶校验位,没有人清楚以这种方式规范DES的原因,这8个奇偶校验位都不是真正的秘钥位,也没有增加秘钥的安全性,所以说DES其实是一个56位的密码,而不是64位的。
子秘钥(也称轮秘钥)是从原始的56位秘钥中得到16个轮秘钥 k
i
,其中每一个轮秘钥 k
i
都是48位。
轮秘钥的初始置换表PC-1如下:
如上表,置换的意思是,将置换前的第57位放在置换后的第0位,将置换前的第49位放在置换后的第1位,将置换前的第41位放在置换后的第2位,其它的依次类推。PC-2的置换原理与PC-1的置换原理是完全一样的。
PC-2轮秘钥置换如下:
DES加密时轮秘钥生成过程如下图所示:
-
将得到的56位秘钥分为 C
0
和 D
0
两部分,每一部分分别28bit; -
长度均为28bit的左右两部分将周期性的向
左
移动1位或者2位(即循环移动),而移动的位数则取决于
轮数i
,其规则如下:
(1)在第i= 1, 2, 9, 16轮中,左右两部分均向左移1位;
(2)在其它轮中,左右两部分均往左移2位;
(3)循环移位的总数为:4*1 + 12 * 2 = 28,进而得到一个有趣的属性,即C
0
= C
16
和 D
0
= D
16
,这对解密子秘钥的逆序生成非常有用。
5. 总结
- DES 与 3DES 属于“分组密码”算法,目前属于“不推荐,慎用”的算法;
-
DES 与 3DES 的分组长度均为
64bit(8字节)
; -
DES 的秘钥长度为
64bit(8字节)
,真实的有效秘钥长度为
56bit
; -
3DES 的秘钥长度为
192bit(24字节)
,真实的有效秘钥长度为
168bit
;
各种算法的链接地址如下:
【密码算法 之零】对称算法(DES,、3DES、 AES、DM5、HMAC、CMAC、SHAxx、SM3、SM4),非对称算法(RSA、ECC、ECDSA、ECDH、SM2、SM9…)