DES加密算法详细过程

本文详细介绍了DES加密算法的过程,包括密钥生成、64-bit数据块编码、32-bit数据块的16次计算以及S盒和P操作。通过一系列变换,最终将明文数据加密成密文。
摘要由CSDN通过智能技术生成

 

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

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值