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

117 阅读9分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情 目录

前言

 什么是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盒

0123456789101112131415
01441312151183106125907
10157414213110612119538
24114813621115129731050
31512824917511314100613

S2盒

0123456789101112131415
01518146113497213120510
13134715281412011069115
20147111041315812693215
31381013154211671205149

S3盒

0123456789101112131415
01009146315511312711428
11370934610285141211151
21364981530111212510147
31101306987415143115212

S4盒

0123456789101112131415
07131430691012851112415
11381156150347212110149
21069012117131513145284
33150610113894511127214

S5盒

0123456789101112131415
02124171011685315130149
11411212471315015103986
24211110137815912563014
31181271142136150910453

S6盒

0123456789101112131415
01211015926801334147511
11015427129561131401138
29141552812370410113116
34321295151011141760813

S7盒

0123456789101112131415
04112141508133129751061
11301174911014351221586
21411131237141015680592
36111381410795015142312

S8盒

0123456789101112131415
01328461511110931450127
11151381037412561101492
27114191214206101315358
32114741081315129035611

 将得到的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位的数据。

最后进行末置换

末置换

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

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