软考信息安全工程师必会--3000+字文章浅析DES加密算法
目录
前几天背软考资料的时候,密码学那部分有个东西叫DES加密算法,书上讲得不太清楚,搜了很多博客也没看到完全讲解清楚的,今天我就出一篇,希望能让各位清楚明白
什么是DES加密算法
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。---------------------------------------------------------------------------------------------引自百度百科
那简单来叭叭两句,DES算法实际上就是
把64位明文输入块进行加密,输出64位密文输出块的算法
它使用的密钥也是64位的,其中56位为工作密钥,剩余8位为奇偶校验位。
DES算法整体来说用到了三个东西
分别是:
- Data
- Key
- Mode
各自对应着啥玩意呢:
- 数据:即输入的明文/密文64位数据,再说简单点,就是你想加密/解密的数据。
- 密钥:为7个字节共56位,如果像我前头说“密钥为64位”,那也是剩余8位为奇偶校验位。分别是第8,16,24,32,40,48,56,64位
- 模式:就是工作模式,总共就两种–加密/解密
至于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位的数据。
最后进行末置换
末置换
按图表位置填写对应数据即可
最后吐个槽,我想上热榜。。。
- 点赞
- 收藏
- 关注作者
评论(0)