软考信息安全工程师必会--3000+字文章浅析DES加密算法

举报
_nojava 发表于 2022/12/01 14:05:53 2022/12/01
【摘要】 目录前言 什么是DES加密算法整体流程IP置换子密钥K压缩置换1循环左移拓展置换2拓展置换E S盒代替S1盒S2盒S3盒S4盒S5盒S6盒S7盒S8盒P盒置换末置换前几天背软考资料的时候,密码学那部分有个东西叫DES加密算法,书上讲得不太清楚,搜了很多博客也没看到完全讲解清楚的,今天我就出一篇,希望能让各位清楚明白 什么是DES加密算法DES全称为Data Encryption Standa...

目录

前言

 什么是DES加密算法

整体流程

IP置换

子密钥K

压缩置换1

循环左移

拓展置换2

拓展置换E

 S盒代替

S1盒

S2盒

S3盒

S4盒

S5盒

S6盒

S7盒

S8盒

P盒置换

末置换


前几天背软考资料的时候,密码学那部分有个东西叫DES加密算法,书上讲得不太清楚,搜了很多博客也没看到完全讲解清楚的,今天我就出一篇,希望能让各位清楚明白

什么是DES加密算法

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。---------------------------------------------------------------------------------------------引自百度百科

那简单来叭叭两句,DES算法实际上就是

把64位明文输入块进行加密,输出64位密文输出块的算法

它使用的密钥也是64位的,其中56位为工作密钥,剩余8位为奇偶校验位。

DES算法整体来说用到了三个东西

分别是:

  1. Data
  2. Key
  3. Mode

各自对应着啥玩意呢:

  1. 数据:即输入的明文/密文64位数据,再说简单点,就是你想加密/解密的数据。
  2. 密钥:为7个字节共56位,如果像我前头说“密钥为64位”,那也是剩余8位为奇偶校验位。分别是第8,16,24,32,40,48,56,64位
  3. 模式:就是工作模式,总共就两种–加密/解密

至于DES加密算法的特点:

分组较短、密钥太短、密码生命周期短、运算速度较慢。

整体流程

图片引自夏冰加密软件技术博客

首先如果是不了解密码学的哥们姐们,可能都会一脸懵(比如我

那么咱从上到下依次把每个步骤分析一下哈

IP置换

其实IP置换的原理很简单,只需要照着下面的表,把数填进去就行。

没明白?那我举个栗子

假设我们要加密abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+=

就依次把数填进去

全部填完之后,按照从左到右,从上到下的顺序整理即可

那我们仔细看看这个表,发没发现点规律

最右边那一列

依次是

2、4、6、8、1、3、5、7

然后是

10、12、14、16、9、11、13、15

那是不是可以这样看

其实不用太在意这个规律 

置换之后的数据为

5XPHzrjb7ZRJBtld91TLDvnf=3VNFxph4WOGyqia6YQI(i)Askc80SKCume+2UMEwog

在初始置换完成后,我们需要把数据一分为二

分别叫做L0,R0

L0 = “5XPHzrjb7ZRJBtld91TLDvnf=3VNFxph”

R0 = “4WOGyqia6YQI(i)Askc80SKCume+2UMEwog”

再看看这个图,生成L0、R0之后,R0直接成为新一轮的L1,同时对R0通过函数f、子密钥K进行处理,而后将处理得到的数据与L0进行异或运算,结果即为新的R1

接着往下走,就到了最复杂的地方

子密钥K

图片来自博客园

从流程图我们要思考一下,这个K是怎么从64位到56位的呢?

这就涉及到了压缩置换1。

压缩置换1

首先前面提过,有八位是奇偶校验位,按64位分成8个字节一组,共八组,取出每一组的最后一位,变成56位

然后类似于初始置换,根据下面的子密钥交换规则表,将数据填到对应的位置即可

填完之后

将56位数据一分为二,分别称为C0、D0

循环左移

然后我们需要通过循环左移,但是左移的时候,位数还不能变,所以就要把左移出去的头部数据接回尾部,类似于一个闭环。

但是左移的位数也不是不变的,需要根据循环的轮数相应移位

左移之后C0、D0变为C1、D1

然后将C1、C2合并回56位的数据

当然,还没完,还有个压缩置换2

拓展置换2

由图表可知,这次要去除位数为9的倍数的数字,填进去输出来,得到K1

拓展置换E

拓展置换E主要用于在输入数据刚刚进行van♂初始置换后,将数据分为L0、R0后,对R0进行操作。

按照下表先将数据填写完毕,然后聊聊这个红色字体该怎么处理

对于红色字体的处理,即将对应标号的一整行拼接到相应位置,例如下图

拿上面的R0 = “4WOGyqia6YQI(i)Askc80SKCume+2UMEwog”举例(别忘了R0是由64位的R分出来的,正好32位

首先填写下面的这部分

填完之后,在左右两侧补上,类似于下图

稍微画一下,不然全画太乱了,相信你们会理解我的

拓展后便得到了48位的R0

然后进行K1与R0的异或运算

S盒代替

S盒的作用就是把上面的48位数据压缩为32位

S1盒

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
1 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8
2 4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0
3 15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13

S2盒

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10
1 3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5
2 0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15
3 13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9

S3盒

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8
1 13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1
2 13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7
3 1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12

S4盒

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15
1 13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9
2 10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4
3 3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14

S5盒

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9
1 14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6
2 4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14
3 11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3

S6盒

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11
1 10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8
2 9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6
3 4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13

S7盒

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1
1 13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6
2 1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2
3 6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12

S8盒

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7
1 1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2
2 7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8
3 2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11

将得到的R0平均分为8组,每组对应一个S盒, 每一组的数据长度为6位

假设第一组的二进制数据为:“101010”
 那么,我们取第一位与最后一位,组成十进制行数:“10”=2
 然后取中间四位,组成十进制列数:“0101”=5
 那么,在对应的S1盒中,取2行5列的数据:6
 再将取得的数字转换为2进制:“0110”
 将这个得到的4位二进制数据,代替原来第一组的6位数据,这样一来,等8个S盒全部代替完毕,我们就得到32位的数据。

S盒置换完成后,就要进行P盒置换。

P盒置换

输入32位,输出32位(图源百度百科

填完之后,我们终于得到了f(R0,K1)

再与L0进行异或运算,得到了第一轮运算最终的R1,然后再将R0的值赋给L1,就完成了第一轮的运算,得到了L1,R1。

经过16轮的运算,我们终于得到了最终的L16、R16

最后将二者合并起来,但是合并时需要将两数据调换位置

也就是R16L16,合并之后就得到了64位的数据。

最后进行末置换

末置换

按图表位置填写对应数据即可

最后吐个槽,我想上热榜。。。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。