【密码算法 之一】对称加密算法 DES \ 3DES 浅析

  • Post author:
  • Post category:其他




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加密时轮秘钥生成过程如下图所示:


在这里插入图片描述

  1. 将得到的56位秘钥分为 C

    0

    和 D

    0

    两部分,每一部分分别28bit;
  2. 长度均为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…)



版权声明:本文为KXue0703原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。