DES加密算法详细过程

文档翻译 专栏收录该内容
2 篇文章 0 订阅

 

DES加密算法(Data Encryption Standard, DES)

 

算法描述

DES算法对定长(64-bits)的数据块进行处理。每一个64 bit的数据块会被分为左半部分(用L表示)和右半部分(用R表示),每一部分的长度为32 bit。

例如:M表示一个待加密的信息,令M=0123456789ABCDEF(16进制),将其转换成二进制,得到:

M = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

L = 0000 0001 0010 0011 0100 0101 0110 0111

R = 1000 1001 1010 1011 1100 1101 1110 1111

我们定义M的第一bit是0,最后一个bit是1(即M是从左至右的顺序排列的)

DES用一个56 bit的密钥对64 bit的数据块进行操作。该密钥表面上看是64 bit,但是由于每个第8个 bit(第8, 16, 24, 32, 40, 48, 56, 64个bit)没有被使用,实际上起作用的只有剩下的56 bit。但是在后面的叙述中,我们仍然将M的每一个bit从1到64进行编号,没有使用的8个 bit仅仅在生成子密钥时被去除了。

例如:令K = 133457799BBCDFF1(16进制),将其转换成二进制就是:

K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001

上述转换中,将1(16进制)转换成了0001(二进制),将3(16进制)转换成了0011(二进制),并且将相邻的8 bit设置成一组(每一组的最后一个bit将不会被使用)

然后,DES加密算法将按照以下步骤进行加密

 

步骤一:生成16个子密钥,每个密钥长度为48 bit

64 bit的密钥首先将按照下表(表1)进行重新排列,以打乱密钥的顺序,生成新的密钥K+例如表1中第一个数字是57,意味着将原密钥中的第57个bit放置到新密钥K+的第一个bit。同理,表1中第二个数字是49,意味着将原密钥中的第49 bit放置到新密钥K+的第二 bit。原密钥中的第四 bit将成为K+的最后一个bit。需要注意的是,表1中只有56个数字,意味着打乱顺序后新生成的密钥K+也变成了56 bit。

57

49

41

33

25

17

9

1

58

50

42

34

26

18

10

2

59

51

43

35

27

19

11

3

60

52

44

36

63

55

47

39

31

23

15

7

62

54

46

38

30

22

14

6

61

53

45

37

29

21

13

5

28

20

12

4

表1:密钥变换规则表

 

例如:从64 bit的原始密钥

K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001

得到重新排序后的新密钥

K+ = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111

然后将新密钥K+均分成两部分,左侧的28 bit记为C0,右侧的28 bit记为D0

例如:根据K+,可以得到

C0 = 1111000 0110011 0010101 0101111

D0 = 0101010 1011001 1001111 0001111

得到和D0后,就以生成16个CnDn,其中1<=n<=16,每个CnDnCn-1Dn-1经过变换而来。具体变换方法是,每个CnDn(1<=n<=16)都由Cn-1Dn-1向左移动特定次数得到。进行一次向左移动操作时,后一bit都取代前一bit的位置,第一个bit将会被移动到最后一个位置。对于标号为n的CnDn需要向左移动的位置个数由表2确定。

n

左移的次数

1

1

2

1

3

2

4

2

5

2

6

2

7

2

8

2

9

1

10

2

11

2

12

2

13

2

14

2

15

2

16

1

表2:CnDn左移次数对照表

 

 

例如,要从C2生成C3,需要经过2次左移操作;从D2生成D3也需要经过2次左移操作。通过C15生成C16需要经过1次左移操作;通过D15生成D16需要经过1次左移操作。总之,一个标号由1到28的字符串经过一次左移变换后将会变成2, 3, …, 28, 1。

于是,从上面的C0D0,可以得到:

C1 = 1110000 1100110 0101010 1011111

D1 = 1010101 0110011 0011110 0011110

C2 = 1100001 1001100 1010101 0111111

D2 = 0101010 1100110 0111100 0111101

C3 = 0000110 0110010 1010101 1111111

D3 = 0101011 0011001 1110001 1110101

C4 = 0011001 1001010 1010111 1111100

D4 = 0101100 1100111 1000111 1010101

C5 = 1100110 0101010 1011111 1110000

D5 = 0110011 0011110 0011110 1010101

C6 = 0011001 0101010 1111111 1000011

D6 = 1001100 1111000 1111010 1010101

C7 = 1100101 0101011 1111110 0001100

D7 = 0110011 1100011 1101010 1010110

C8 = 0010101 0101111 1111000 0110011

D8 = 1001111 0001111 0101010 1011001

C9 = 0101010 1011111 1110000 1100110

D9 = 0011110 0011110 1010101 0110011

C10 = 0101010 1111111 1000011 0011001

D10 = 1111000 1111010 1010101 1001100

C11 = 0101011 1111110 0001100 1100101

D11 = 1100011 1101010 1010110 0110011

C12 = 0101111 1111000 0110011 0010101

D12 = 0001111 0101010 1011001 1001111

C13 = 0111111 1100001 1001100 1010101

D13 = 0111101 0101010 1100110 0111100

C14 = 1111111 0000110 0110010 1010101

D14 = 1110101 0101011 0011001 1110001

C15 = 1111100 0011001 1001010 1010111

D15 = 1010101 0101100 1100111 1000111

C16 = 1111000 0110011 0010101 0101111

D16 = 0101010 1011001 1001111 0001111

现在可以根据CnDn生成Kn(1<=n<=16)。将CnDn相连(56 bit)后根据表3进行重新排序。对于每个56 bit的CnDn,只有其中的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

表3:密钥生成对照表

 

因此,第n个密钥Kn的第1个bit是CnDn的第14个bit,同理Kn的第2个bit是CnDn的第17个bit,而且Kn的第48个bit是CnDn的第32个bit。

例如:对于C1D1 = 1110000 1100110 0101010 1011111 1010101 0110011 0011110 0011110

经过表3重新排序后,得到

K1 = 000110 110000 001011 101111 111111 000111 000001 110010

因此我们可以得到其他的密钥

K2 = 011110 011010 111011 011001 110110 111100 100111 100101

K3 = 01101 011111 110010 001010 010000 101100 111110 011001

K4 = 011100 101010 110111 010110 110110 110011 010100 011101

K5 = 011111 001110 110000 000111 111010 110101 001110 101000

K6 = 011000 111010 010100 111110 010100 000111 101100 101111

K7 = 111011 001000 010010 110111 111101 100001 100010 111100

K8 = 111101 111000 101000 111010 110000 010011 101111 111011

K9 = 111000 001101 101111 101011 111011 011110 011110 000001

K10 = 101100 011111 001101 000111 101110 100100 011001 001111

K11 =001000 010101 111111 010011 110111 101101 001110 000110

K12 =011101 010111 000111 110101 100101 000110 011111 101001

K13 = 100101 111100 010111 010001 111110 101011 101001 000001

K14 = 010111 110100 001110 110111 111100 101110 011100 111010

K15 =101111 111001 000110 001101 001111 010011 111100 001010

K16 = 110010 110011 110110 001011 000011 100001 011111 110101

密钥的相关生产操作到此已经完成。

 

第二步 编码一个64-bit数据块

对于一个数据块M,首先根据以下的表4打乱顺序,生成一个新的序列N。根据表4,N的第1个bit是数据块M的第58个bit;N的第2个bit是数据块M的第50个bit;N的第64个bit是数据块M的第7个bit。

58

50

42

34

26

18

10

2

60

52

44

36

28

20

12

4

62

54

46

38

30

22

14

6

64

56

48

40

32

24

16

8

57

49

41

33

25

17

9

1

59

51

43

35

27

19

11

3

61

53

45

37

29

21

13

5

63

55

47

39

31

23

15

 

表4:输入数据的初始处理规则表

 

例如:对于上文中的数据块M,根据IP表得到

M = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

N = 1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000 1010 1010

因为M的第58个位置是”1”,所以N的第一个位置是”1”,因为M的第50个位置是“0”,所以N的第二个位置是“0”。

 

接下来将N分成两个32 bit的块,令L0为左侧的32 bit,令R0为右侧的32 bit。

例如:根据N,得到L0R0

L0 = 1100 1100 0000 0000 1100 1100 1111 1111

R0 = 1111 0000 1010 1010 1111 0000 1010 1010

 

接下来使用一个输入为32bit的数据块和48bit的密钥的函数f进行16次计算,每一次计算都得到一个32bit的输出。对于1<=n<=16,通过以下规则处理

Ln = Rn-1

Rn = Ln-1 + f(Rn-1, Kn)

 

通过以上规则,当n=16时得到最后一个数据块L16R16。在每一次计算时,将上一个数据块的右侧32bit作为下一个数据块的左侧32bit,然后将上一个数据块右侧的32bit和密钥经过函数f处理后与上一个数据块左侧的32bit进行异或操作得到下一个数据块的右侧32bit。

 

例如:当n=1时,有

K1 = 000110 110000 001011 101111 111111 000111 000001 110010

L1 = R0 =1111 0000 1010 1010 1111 0000 1010 1010

R1 = L0 + f(R0, K1)

接下来介绍函数f是如何工作的。

首先将32bit的Rn-1 扩张成48bit以便与密钥进行操作。该扩张操作E通过下表5进行。

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

表5:密钥扩张规则表

 

 

这意味着E(Rn-1)的前三个bit分别是Rn-1的第32、1、2个bit。同理E(Rn-1)的最后一个bit是Rn-1的1个bit。

例如:从R0计算E(R0)

R0 = 1111 0000 1010 1010 1111 0000 1010 1010

E(R0) =011110 100001 010101 010101 0111110 100001 010101 010101

 

然后f函数中将得到的E(Rn-1)与密钥Kn进行异或操作:

Kn + E(Rn-1)

例如:对于K1E(R0),有

K1 = 000110 110000 001011 101111 111111 000111 000001 110010

E(R0) =011110 100001 010101 010101 011110 100001 010101 010101

K1+E(R0) = 011000 010001 011110 111010 100001 100110 010100 100111

 

到目前为止,Rn-1经过扩展,变成48bit后与Kn进行异或操作后得到了48bit的Kn + E(Rn-1),然而f的操作还没有完成。现在将48bit的Kn + E(Rn-1)分为8组(B1-B8),每组6个bit。对于每一组中的6个bit,经过对应的“S盒”处理后生成一个4bit的输出。即

Kn + E(Rn-1) = B1B2B3B4B5B6B7B8

其中Bi(1<=n<=8)的长度为6bit,现在计算

S1(B1)S2(B2) S3(B3) S4(B4)S5(B5)S6(B6)S7(B7)S8(B8)

其中Si(Bi)表示第i个“S盒”的输出。

 

下面给出决定S1(B)的表格6:

列号

行号

0

1

2

3

0

14

0

4

15

1

4

15

1

12

2

13

7

14

8

3

1

4

8

2

4

2

14

13

4

5

15

2

6

9

6

11

13

2

1

7

8

1

11

7

8

3

10

15

5

9

10

6

12

11

10

6

12

9

3

11

12

11

7

14

12

5

9

3

10

13

9

5

10

0

14

0

3

5

6

15

7

8

0

13

表6:第一个“S盒”参数

 

S1(B)中的B表示一个6bit的数据块。将B中的第一个bit和最后一个bit取出组合成一个范围为0-3的数字(如00代表数字0,而11代表数字3),令这个数字为i。然后将中间的4个bit组合成一个范围为0-15的数字(如0010代表数字2,而1110代表数字14),令这个数字为j。然后根据表格,寻找到行号为i、列号为j的单元格中的数字,其二进制的4个bit作为该S盒的输出。

例如:B = 011011时,将第一个bit(“0”)和最后一个bit(“1”)组合成“01”,则i = 1。中间的四个bit(“1101”)表示数字13,则j = 13。然后从表格中行号为1,列号为13的单元格,其中的数字为5,其二进制0101就是输出。即S1(011011)=0101。

八个“S盒”(S1 - S8)的定义如下:

S1

列号

行号

0

1

2

3

0

14

0

4

15

1

4

15

1

12

2

13

7

14

8

3

1

4

8

2

4

2

14

13

4

5

15

2

6

9

6

11

13

2

1

7

8

1

11

7

8

3

10

15

5

9

10

6

12

11

10

6

12

9

3

11

12

11

7

14

12

5

9

3

10

13

9

5

10

0

14

0

3

5

6

15

7

8

0

13

表7:第一个“S盒”参数

 

S2

列号

行号

0

1

2

3

0

15

3

0

13

1

1

13

14

8

2

8

4

7

10

3

14

7

11

1

4

6

15

10

3

5

11

2

4

15

6

3

8

13

4

7

4

14

1

2

8

9

12

5

11

9

7

0

8

6

10

2

1

12

7

11

13

10

6

12

12

12

6

9

0

13

0

9

3

5

14

5

11

2

14

15

10

5

15

9

表8:第二个“S盒”参数

 

S3

列号

行号

0

1

2

3

0

10

13

13

1

1

0

7

6

10

2

9

0

4

13

3

14

9

9

0

4

6

3

8

6

5

3

4

15

9

6

15

6

3

8

7

5

10

0

7

8

1

2

11

4

9

13

8

1

15

10

12

5

2

14

11

7

14

12

3

12

11

12

5

11

13

4

11

10

5

14

2

15

14

2

15

8

1

7

12

表9:第三个“S盒”参数

 

S4

列号

行号

0

1

2

3

0

7

13

13

1

1

13

8

6

15

2

14

11

9

0

3

3

5

0

6

4

0

6

12

10

5

6

15

11

1

6

9

0

7

13

7

10

3

13

8

8

1

4

15

9

9

2

7

1

4

10

8

2

3

5

11

5

12

14

11

12

11

1

5

12

13

12

10

2

7

14

4

14

8

2

15

15

9

4

14

表10:第四个“S盒”参数

 

S5

列号

行号

0

1

2

3

0

2

14

4

11

1

12

11

2

8

2

4

2

1

12

3

1

12

11

7

4

7

4

10

1

5

10

7

13

14

6

11

13

7

2

7

6

1

8

13

8

8

5

15

6

9

5

0

9

15

10

3

15

12

0

11

15

10

5

9

12

13

3

6

10

13

0

9

3

4

14

14

8

0

5

15

9

6

14

3

表11:第五个“S盒”参数

 

S6

列号

行号

0

1

2

3

0

12

10

9

1

1

1

15

14

3

2

10

4

15

2

3

15

2

5

12

4

9

7

2

9

5

2

12

8

5

6

6

9

12

15

7

8

5

3

10

8

0

6

7

11

9

13

1

0

14

10

3

13

4

1

11

4

14

10

7

12

14

0

1

6

13

7

11

13

0

14

5

3

11

8

15

11

8

6

13

表12:第六个“S盒”参数

 

S7

列号

行号

0

1

2

3

0

4

13

1

6

1

11

0

4

11

2

2

11

11

13

3

14

7

13

8

4

15

4

12

1

5

0

9

3

4

6

8

1

7

10

7

13

10

14

7

8

3

14

10

9

9

12

3

15

5

10

9

5

6

0

11

7

12

8

15

12

5

2

0

14

13

10

15

5

2

14

10

15

5

2

15

6

8

9

3

表13:第七个“S盒”参数

 

S8

列号

行号

0

1

2

3

0

13

1

7

2

1

2

15

11

1

2

8

13

4

14

3

4

8

1

7

4

6

10

9

4

5

15

3

12

10

6

11

7

14

8

7

1

4

2

13

8

10

12

0

15

9

9

5

6

12

10

3

6

10

9

11

14

11

13

0

12

5

0

15

3

13

0

14

3

5

14

12

9

5

6

15

7

2

8

11

表14:第八个“S盒”参数

 

例如:

K1+E(R0) = 011000 010001 011110 111010 100001 100110 010100 100111

通过上述8个“S盒”,得到

S1(B1)S2(B2) S3(B3) S4(B4)S5(B5)S6(B6)S7(B7)S8(B8) = 0101 1100 1000 0010 1011 0101 1001 0111

 

f函数的最后一个操作P是对“S盒”的输出结果进行重新排列。

F = P(S1(B1)S2(B2)…S8(B8))

P的排列规则由表15规定。P操作的输入和输出都是32bit的数据块。

 

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

表15:“S盒”输出结果变换规则表

 

 

例如:“S盒”的输出经过P操作后得到

f = 0010 0011 0100 1010 1010 1001 1011 1011

R1 = L0 + f(R0, K1)

=1100 1100 0000 0000 1100 1100 1111 1111

+ 0010 0011 0100 1010 1010 1001 1011 1011

= 1110 1111 0100 1010 0110 0101 0100 0100

 

同理,通过L1R1继而可以得到L2R2…L16R16。

最后,将得到的L16R16按照R16L16的顺序排列后根据下表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

表16:输出重排列规则表

 

 

例如:经过“S盒”后得到的输出

L16 = 0100 0011 0100 0010 0011 0010 0011 0100

R16 = 0000 1010 0100 1100 1101 1001 1001 0101

 

然后将L16R16排列成R16L16

R16L16 = 00001010 01001100 11011001 10010101 01000011 01000010 00110010 00110100

 

然后经过IP表排列后得到

IP = 10000101 11101000 00010011 01010100 00001111 00001010 10110100 00000101

 

转换成16进制就是

85E813540F0AB405

 

M = 0123456789加密后得到的字符串是C = 85E813540F0AB405。

 

解密过程与加密过程的步骤相同,只不过是倒置密钥的使用顺序即可。

 

 

参考文献

Grabbe J O. The DES algorithm illustrated[J]. 2010.

Jalal Feghhi, Jalil Feghhi, Peter Willians . Digital Certmcates[M].Canada.1998:51.

 

  • 2
    点赞
  • 1
    评论
  • 13
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

鹄望潇湘I

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值