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

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个轮秘钥 ki,其中每一个轮秘钥 ki 都是48位。

  轮秘钥的初始置换表PC-1如下:
在这里插入图片描述
  如上表,置换的意思是,将置换前的第57位放在置换后的第0位,将置换前的第49位放在置换后的第1位,将置换前的第41位放在置换后的第2位,其它的依次类推。PC-2的置换原理与PC-1的置换原理是完全一样的。

  PC-2轮秘钥置换如下:
在这里插入图片描述

  DES加密时轮秘钥生成过程如下图所示:
在这里插入图片描述

  1. 将得到的56位秘钥分为 C0 和 D0 两部分,每一部分分别28bit;
  2. 长度均为28bit的左右两部分将周期性的向移动1位或者2位(即循环移动),而移动的位数则取决于轮数i,其规则如下:
      (1)在第i= 1, 2, 9, 16轮中,左右两部分均向左移1位;
      (2)在其它轮中,左右两部分均往左移2位;
      (3)循环移位的总数为:4*1 + 12 * 2 = 28,进而得到一个有趣的属性,即C0 = C16 和 D0 = D16,这对解密子秘钥的逆序生成非常有用。

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…)

猜你喜欢

转载自blog.csdn.net/KXue0703/article/details/124517080