网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

数据加密标准(DES)| 第1部分

更新时间:2026年03月27日   作者:spoto   标签(Tag):

数据加密标准(DES)是一种对称式分组密码。所谓“对称”,指的是输入文本和输出文本的大小是相同的,都是64位。这里的“分组”意味着,加密时是将多个比特一起作为输入,而不是逐位进行加密。不过,数据加密标准存在被强大攻击破解的可能性,因此后来被高级加密标准(AES)所取代。

  • 这是一种块密码算法,它以64位的数据块为单位来加密数据。
  • 它接受64位明文作为输入,并生成相应的64位密文作为输出。
  • 密钥的主要长度为64位,但通过跳过密钥中每8位来将其转换为56位。
  • 该算法通过16轮来对文本进行加密处理,每轮过程中都会使用48位的子密钥。
  • 这个48位的子密钥是从56位的有效密钥中生成的。
  • 无论是加密还是解密,都使用相同的算法和密钥,只是有一些小的调整而已。

数据加密标准(DES)的工作原理

DES基于以下两个属性来构建的:费斯特尔密码也就是说替换(也称为混淆)和移位(也称为扩散)DES包含16个步骤,每个步骤被称为一个“轮次”。在每个轮次中,都会执行替换和移位等操作。

数据加密标准

那个加密以64位形式开始明文该数据需要使用64位密钥进行加密。明文会被传递给初始置换函数,而密钥则通过Permuted Choice 1(PC-1)算法进行置换处理。

初始排列

这个64位的明文被输入到一个初始置换函数当中,该函数会重新安排各个比特的顺序。比特顺序的更改是通过预先定义的表格来实现的。该初始置换表是一个8×8的矩阵,共有64个条目,每个条目都指定了原始明文中某个比特的新位置。

初始排列表

585042342618102
605244362820124
625446383022146
645648403224168
57494133251791
595143352719113
615345372921135
635547393123157

IP表的工作原理:

  • 该置换后的数据块中的第一个位,来源于原始明文的第58位。
  • 第二部分则来自第50位,以此类推。
  • 最后一位数字来源于原始明文的第7位。

初始排列只发生一次,而且是在第一轮之前发生的。排列这个函数的执行过程是固定的,不会依赖于明文内容。经过重新排列后的64位明文会经历16轮处理。每一轮处理都会使用与上一轮不同的48位子密钥。这些子密钥是从64位的密钥中生成的。

关键转型

这个64位的初始密钥被转换为56位的有效密钥。这个56位的密钥又进一步分解为48位的子密钥,这些子密钥分别用于16个Feistel轮次中。

将64位密钥转换为56位密钥

首先,需要处理Permuted Choice 1(PC-1)这一步骤。通过这一步骤,密钥的长度被缩减到了56位。在PC-1中,密钥中的每第八位会被舍弃。也就是说,第8位、第16位、第24位、第32位、第40位、第48位、第56位以及第64位会被舍弃。

处于绿色标记位置的位会被舍弃。

这些被丢弃的位被称为奇偶校验位,它们用于检测错误。剩下的56个位被分成两半,每半为28位。

  • 左半部分 (C)i前28位。
  • 右侧部分 (D)i最后28位

这里,我用来表示Feistel轮次的次数。

生成 48 位的子密钥

在16轮比赛中,每轮的右侧部分(C)i以及剩下的半份(D)i经历/承受循环左移操作.

DES中的关键转换

在Feistel轮次的1、2、9和16中,左右两半都经历了1位左移操作。而在其他轮次中(3、4、5、6、7、8、10、11、12、13、14、15),左右两半则经历了2位左移操作。

Feistel轮转中的循环左移操作

在执行循环移位操作之后,Ci 以及Di这些比特再次被组合成56位的块。然后,这个块会经过置换选择步骤2的处理。在PC-2过程中,从56个比特中选取48个比特来形成子密钥(K)。i这48位数据是根据下面所示的预定义表格来选择的。

排列选择表2

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

根据此表格,第14位被放置在第一个位置,第17位被放置在第二个位置,第11位被放置在第三个位置,以此类推。该表格所生成的48位子密钥将被用于……密码/加密方式在Feistel轮转过程中,所处理的明文数据。

在下一轮中,我们将使用已经左移过的C值。i以及Di我们分别处理左右两半部分。我们再次对这两半部分进行循环左移操作。然后,我们将得到的结果合并成一个56位的块。接着,我们使用排列选择法,将这个56位的块缩小为48位的子密钥,以便用于下一轮操作。

在“循环左移”和“排列选择2”的过程中,共进行了16轮操作。同时,还使用了不同的子密钥(K)。i每个Feistel轮次都会生成这样的结构。

每个48位的子密钥(K)i)是异或运算在Feistel轮次中,右侧的部分被扩大了。下面是对每个Feistel轮次中发生的情况的详细解释。

费斯特尔轮转法(1-16轮)

每一轮过程中,都会从初始排列函数中获得64位的排列后的明文,同时还会得到48位转换后的子密钥(K)。i经过排列后的64位明文被分为两半,分别称为左明文和右明文。这两部分的长度都是32位。右明文会经过Mangler(F)函数的处理。Mangler(F)函数包括对右明文的扩展、密钥混合、替换操作(S盒)以及排列操作(P盒)。

DES中的单Feistel轮转算法

RPT首先经过一番处理/审核扩展排列在这种排列中,32位的右密文被扩展为48位,这一过程是通过扩展框或E框表来实现的。

E-Box扩展表

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位的扩展块是通过按照E-Box表格中的方式来排列各个位元而生成的。

这个扩展的块与我们在密钥转换过程中生成的48位轮转子密钥进行XOR运算。XOR或 exclusive OR如果两个输入相同,那么操作的结果将是‘0’;否则,结果将是‘1’。执行XOR运算之后,得到的48位数据会被分成8个各为6位的子块。每个子块随后会被分别送入不同的S盒中进行处理。1 给S8).

例如,XOR运算的结果会被转换为6位的数据块。具体转换方式如下:

101010 010001 011110 111010 100001 100110 010100 100111

这些6位的二进制数将会被转换为4位,这一过程是通过S-Boxes来实现的。

S-Box

S-Boxes是一种预定义的查找表,它能够将6位的数据压缩为4位的数据。以下是这些S-Boxes的列表。

假设前6位数字是101010。我们将这一组数字分成两部分,每部分的位数分别为2位和4位。其中,最前面的1位与最后面的1位合并在一起,形成2位的部分;其余的位则构成4位的部分。

101010 -> (1)(0101)(0) -> 可以拆分为10和0101

我们在 S 的行和列中寻找这些部分。1在表格中,当行号为“10”,列号为“0101”的单元格里,数值为“6”。1该数值的二进制表示为“0110”。这是S-Box 1从6位输入“101010”中生成的4位数值。

6位的数据块:‘101010’转换为4位的数据块后变为‘0110’。

同样地,我们也会将每6位的数据转换为4位的值。S-Boxes这个过程被称为“替换”。之后,我们将这4位的数据块合并起来,得到32位的输出数据。而这一32位的数据又会根据下面的表格进行重新排序。

P-盒置换

167202129122817
11523265183110
282414322739
19133062211425

这种排列过程被称为“置换”。在置换之后,32位的数据块就构成了mangler函数的输出结果。这个32位数据块会与在Feistel轮次开始时所生成的32位左半部分或左明文进行异或运算。这次异或运算的结果,将会作为下一轮操作的右半部分或右明文;而初始的右半部分则会被用作下一轮操作的左半部分。

Li= Ri-1

Ri= Li-1⊕ F(R)i-1Ki)

在何处

  • Li-1当前轮次的左半部分或左明文(LPT)。
  • Li下一轮的左半部分或左部分明文(LPT)。
  • Ri-1当前轮次的右半部分或右明文(LPT)。
  • Ri下一轮中的右半部分或右明文(LPT)。

我们采用了与16轮操作相同的步骤,只不过使用的是通过密钥转换生成的子密钥。整个过程的示意图如下所示。

DES中的曼格勒函数与关键变换

32位交换与逆初始排列

在经历了这16轮处理之后,我们得到了两个32位的数据块,分别位于“左”和“右”两个位置。这两个32位的数据块再次被交换位置,最终得到一个64位的完整数据块。这一步骤在DES加密算法中被称为“32位交换”。

最后,该块会经历一个逆初始排列操作。这实际上就是最初进行的初始排列操作的逆过程。

逆初始置换

输出位置输入位置

输出位置

输入位置

输出位置

输入位置

输出位置

输入位置

58625761505449534246414534383337263025291822172110149132615606459635256515544484347364035392832273120241923121611154837
1173349
2183450
3193551
4203652
5213753
6223854
7233955
8244056
9254157
10264258
11274359
12284460
13294561
14304662
15314763
16324864

逆初始排列的结果就是最终的64位密文,它实际上是原始明文经过加密后的结果。

DES加密算法中的解密过程

在DES加密过程中,解密的过程与加密过程类似,只是顺序相反。由于DES是一种对称密钥算法,因此用于加密和解密的公钥是相同的。不过,各个子密钥(即循环密钥)的应用顺序是相反的。

  • 反向子键应用在键调度过程中生成的16个键值,是以相反的顺序被使用的(从K开始)。16到K那里1在解密过程中。
  • 逆Feistel函数Feistel网络结构确保了解密过程与加密过程是对称的。每一轮操作都包含相同的步骤(扩展、S盒替换、置换),但所使用的子密钥则是相反的。
  • 最终排列(Final Permutation)经过16轮操作后,输出结果会经历逆初始排列操作,从而逆转最初的随机排列过程。

数据加密标准(DES)的相关程序/工具

以下是……Python用于数据加密标准(DES)的编程方式。所使用的明文和密钥如下:

明文 = “123456ABCD132536”

密钥 = “AABB09182736CCDD”

Python
# 上述方法的Python3代码# 十六进制到二进制的转换def hex2bin(s):	mp = {‘0’: 0000
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料