des加密算法最简单的解释(更简单,大白话,读完就理解)

        

目录

1、几个基本概念

第一个置换是:初始置换-终止置换-IP置换-初始置换IP

第二个置换:扩展置换(32位到48位)

第三个置换:压缩置换(S盒48位到32位)

第四个运算:循环左移(位数不变)

第五个置换:置换选择pc-1(64位到56位)

第六个置换:压缩置换pc-2(56位到48位)

第七个运算:F变换

第八个置换:P-盒置换(48bit到32bit)

第九个置换:逆置换

2、子密钥生成过程

3、des加密过程(迭代)

4、子密钥算法的流程图

5、加密算法流程图


        CSDN上看了很多文章,但是我感觉写的太过专业化,很多时候读起来很费力气,明明是简单的过程,但是经过复杂的说法,很难使人一读就懂。经过深入的思考,以及算法报告是对学生理解能力的考核,我认为加密算法这么写更易懂,同样体现了对这个知识点的学习和思考:那么开始吧,首先我们要明白几个置换过程,这个和加密算法无关,你只需要明白这个置换即可。

1、几个基本概念

第一个置换是:初始置换-终止置换-IP置换-初始置换IP

虽然我写了四个置换,是因为很多专业的人用了不同的称呼,但他们的方法都是一样的原来是64位的,置换后依然是64位的,所以看到这三个,你就想着这是把原数据打乱了,怎么置换呢,首先按照需要加密双方的约定指定一张表,这张表写着64位数字,代表着咱们要加密的64位原文,比如我和另一个要给他发消息的人约定了如下表格:

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,7,

我们有64位数据,此时将输入的64位明文的第1位置换到第40位,第2位置换到第8位,第3位置换到第48位。以此类推,最后一位是原来的第7位。置换规则是规定的。

此时我将得到经过置换的64位数据。

第二个置换:扩展置换(32位到48位)

这个32位怎么来的不用管,先理解怎么置换的,我把这32位数据分为8组,每组我就有4个,如下:

每组的4位,我们规定让他用一种方法变成6位,怎么变呢?

把每组的最后一个数字补到前一组的开头,像拉火车一样,车尾接车头,形成如下的48位数据:

第三个置换:压缩置换(S盒48位到32位)

同样48位怎么来的,先不管,看看置换方法:

我和那个人收我消息的人规定的另一张表是用在这的,这表我俩称之为S盒,而且我俩一起做了8张,每张有4行16列,共64个方框。

我们将要压缩的48位分为8组,每组6位,这6位二进制数,掐头去尾,将拿出来的这两个数组成一个新的数字,转为十进制,作为我和那个人规定的S盒这张表的行数。中间的四个数字转为十进制,作为列数。行列确定了表中的一个加密数字。当然四个二进制数最大的是1111,就是十进制15,所以我俩规定的这张表有重复数字,但是最大数字是15。这样6位数字,变成了表中的一个数字,且它最大是1111,共计8组,6*8变成了4*8。

第四个运算:循环左移(位数不变)

左移比较简单,就是循环左移,头尾相接,进行移动,但我俩规定第一次左移要移动一个位置,其中第一次、第二次、第九次、第十六次是循环左移一位,其他都是左移两位。

第五个置换:置换选择pc-1(64位到56位)

置换选择就是置换后,选择一种方式读取。我俩还有张表,叫这个名字--缩小选择换位表1(置换选择表1)。

将64位数据,分为8组,每组8个,是不是这样的:

表里有64个数据,但是最后一位我们不要,前七位留着,但不是按照正常的方式读取,现在我们从下到上读取,读取的过程中,我们给他分为两组,C0和D0,C0是左边蓝色的部分,拿走28位,D0不仅从下往上,还要从右往左,再拿走28位。

第六个置换:压缩置换pc-2(56位到48位)

这次的表你猜对了,还是我们规定的,同样的压缩,但这是表2。位数不同,所以方法不同,因为这部分会用在子密钥上,所以加了个pc。

这次我们规定上图表中的56位数据,第9182225353843548位被剔除了,这样就压缩到了48位。

第七个运算:F变换

F变换是一个运算流程的统称,这是过程是将32位数据扩展置换到48位,这48位与pc-2置换后的48位进行异或运算(异或运算两个数相同结果为0,不同为1),经过F变换后,还是48位数据。

第八个置换:P-盒置换(48bit到32bit)

S-盒代替运算,每一盒得到4位,8盒共得到32位输出。这32位输出作为P盒置换的输入块。P盒置换将每一位输入位映射到输出位。任何一位都不能被映射两次,也不能被略去。经过P-盒置换的结果与最初64位分组的左半部分异或,然后左右两部分交换,开始下一轮迭代。

P-盒置换表(表示数据的位置)共32位。将32位的输入的第16位放在第一位,第七位放在第二位,第二十位放在第三位,以此类推。如下:

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

第九个置换:逆置换

将初始置换进行16次的迭代,即进行16层的加密变换,这个运算过程我们暂时称为函数f。得到L16和R16,将此作为输入块,进行逆置换得到最终的密文输出块。逆置换是初始置换的逆运算。从初始置换规则中可以看到,原始数据的第1位置换到了第40位,第2位置换到了第8位。则逆置换就是将第40位置换到第1位,第8位置换到第2位。以此类推,逆置换规则如下。

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

注:DES算法的加密密钥是根据用户输入的秘钥生成的,该算法把64位密码中的第8位、第16位、第24位、第32位、第40位、第48位、第56位、第64位作为奇偶校验位,在计算密钥时要忽略这8位.所以实际中使用的秘钥有效位是56位。秘钥共64位,每次置换都不考虑每字节的第8位,因为这一位是奇偶校验位,所以64位秘钥的第8、16、24、32、40、48、56、64位在计算秘钥时均忽略。

2、子密钥生成过程

明文64-> 初始置换 -> pc-1置换选择(56bit -> 分组C0D0(每组28bit->两组都循环左移 ->  pc-2压缩置换(48bit),生成了子密钥key148bit

由于我们需要16轮变换,也称之为“轮操作”。这个k1要和R0做异或运算,即F变换。得到的48位结果进入S1盒压缩处理,为32位,和L0交换顺序后的64位密文,是我们下一次循环pc-1置换选择的初始值。

根据轮数,将Cn和Dn分别循环左移1位或2位。

循环左移每轮移动的位数如下:

3、des加密过程(迭代)

明文64->初始置换-> 分组 ->  S盒压缩处理(16) ->  逆初始置换IP-1-> 密文

比如我有一句话要传送给收件人 I love youyy

首先使用ascii(电脑编码系统),进入计算机后为二进制,如图:

存入计算机为:0110 1001i     0010 0001(空格)     0110 1100l    0110 1111o   0111 0110v    0110 0101e     0010 1100(逗号)     0111 1001y    0111 1001y

(这里没有考虑数据类型,比如一般int4个字节,以及物理层传输时的比特流的编码)

共计9个字符。每个1字节,即8位,共计72位,此时,我们将数据分为多组,每组64位,即我们只要前64位来演示des加密后的密文。目前我们有64bit的明文。

         64bit的明文首先要按照表3-2进行IP置换,即原始数据的58位放在新数据的第1位,原始数据的第50位放在新数据第2位,以此类推。得到新的64bit数据分成L0 R0 左右两部分,每部分为32bit

首先对原始数据整理一下

序号 1

0110  1001i                          

2

0010  0001(空格)

3

0110  1100l

4

0110  1111o

5

0111  0110v

6

0110  0101e

7

0010  1100(逗号)

8

0111 1001y

(好多啊,好麻烦吖,开始考虑这项任务有没有必要了)

这里只置换两行举例:

序号 1

1011  1101            

2

1001  0000

由此我们得到置换后的64bit数据。

将此分为L032bit)和R032bit),R0与秘钥结合(异或运算)后,进行S1盒压缩处理,处理后的数据为32位继续作为R0,与秘钥结合,而原来的R0赋值给L0,即:原来的右半部分成为新的左半部分。用式子表示如下:

Ln = R(n - 1);(不存在R负1)

Rn = L(n - 1)⊕f(Rn-1,kn-1)

[⊕:异或运算  Kn是向第N层输入的48位的秘钥,f是以Rn-1和Kn为变量的输出32位的函数]

如此16轮后,数据依然是64bit,而右半部分的R0由几步运算构成:扩展置换(32bit->48bit);秘钥置换(Kn的生成,n=0~16);S-盒压缩处理替代;P-盒置换,最后还有交换和逆置换,完成输入密文的任务。

4、子密钥算法的流程图

5、加密算法流程图

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程图一乐

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值