赞
踩
数据加密标准(Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,它基于使用56位密钥的对称算法。
然而DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。
DES是一种分组加密算法,每次都处理固定的64位大小的明文,返回64位的密文,对于长度为n的,可以分成若干个64位的,剩余的小于64位的可以按照某种具体的规则来填充位。
流程大概这样是
这个过程中有三个重要的框架:
这个过程中用到了许多的置换表,主要作用有两个:(不是所有的置换表都有这两个作用)
根据下面的表我们来理解一下置换表的工作方法
现在有一个64位的串s,那从表a[65]的第一个a[1]开始,a[1]=57
表示将s[57]
放到t
串的第一位,a[2] = 49
表示将s[49]
放到 t
串的第2位…知道放完最后一个,就会得到一个t
串,这个t
串就是 s
串经过置换表后的结果
很多分组密码的结构本质上来说是基于Feistel网络的结构,通过交换、异或等操作得到密文,大体结构如下所示:
就是进行16轮的代换-置换
轮函数:
L
i
=
R
i
−
1
L_i=R_{i-1}
Li=Ri−1
R i = L i − 1 ⨁ F ( R i − 1 , K i ) R_i=L_{i-1}\bigoplus F(R_{i-1},K_i) Ri=Li−1⨁F(Ri−1,Ki)
这是Feistel最基本的函数,下一个的L是上一个的R,下一个的R是上一个的L⨁F(上一个的R, K)
这里我们分析一下DES的Feistel框架:
64bit
的明文,先通过一个IP置换表,进行一次置换64bit
的东西从中间劈开,分成
L
0
,
R
0
L_0,R_0
L0,R0,作为初始的值进行第一次的轮函数,
L
1
=
R
0
L_1=R_0
L1=R0,
R
1
=
L
0
⨁
F
(
R
0
,
K
1
)
R_1=L_0\bigoplus F(R_0,K1)
R1=L0⨁F(R0,K1),这个函数和密钥的产生我们一会再讲64bit
的
R
16
L
16
R_{16}L_{16}
R16L1664bit
的密文DES只需要一个初始的56bit
的密钥,那怎么产生16个轮函数所需的
K
i
K_i
Ki呢
首先,提一个小的点,DES使用一个56位的初始密钥,但提供的其实是一个64位的值,这是因为在硬件实现中每8位可以用于奇偶校验,在软件实现中多出的位只是简单的忽略掉。
所以第8位、16位、32位、40位、48位、56位、64位都是奇偶校验位,
而忽略掉他们的方法就是我上次讲的置换函数的第一个作用:去位
64bit
的初始密钥,经过置换盒子——PC-1盒,去掉奇偶校验位,得到56bit
,分成左右两部分
C
0
,
D
0
C_0,D_0
C0,D0,各28bit
,经过密钥位移表,得到
C
1
,
D
1
C_1,D_1
C1,D1,一方面合成56bit
的一个串经过置换盒子——PC-2盒压缩得到48bit
的
K
1
K_1
K1,另一方面作为
C
i
−
1
,
D
i
−
1
C_{i-1},D_{i-1}
Ci−1,Di−1去产生下一个C和D…
PC-1盒是56位的置换盒,PC-2盒是一个48位的置换盒,密钥移位表是一个2行16列的表,表示第 i
次
C
i
−
1
,
D
i
−
1
C_{i-1},D_{i-1}
Ci−1,Di−1的左移的次数,如下:
假如一个串是100010101,左移2位就是:001010110
首先是对于32bit
的
R
i
−
1
R_{i-1}
Ri−1进入一个E盒,进行位数的扩展,扩展成48bit
再与
K
i
K_{i}
Ki进行异或后进入S盒进行压缩,得到32bit
的串,再进入P盒进行置换
该置换盒的主要目的是在加密数据的过程中制造一些雪崩效应,使用数据块中的1位将在下一步操作中影响更多位,从而产生扩散效果。
这是一个扩展盒,扩展的方法是:将32位的数分成8个4位的,对于第 i
个的组成是
S
i
+
1
S
i
+
2
S
i
+
3
S
i
+
4
S_{i+1}S_{i+2}S_{i+3}S_{i+4}
Si+1Si+2Si+3Si+4,根据E盒找到前一个对应的数和后一个对应的数插进去就行
比如 S 1 S 2 S 3 S 4 − > S 32 S 1 S 2 S 3 S 4 S 5 S_{1}S_{2}S_{3}S_{4}->S_{32}S_{1}S_{2}S_{3}S_{4}S_{5} S1S2S3S4−>S32S1S2S3S4S5
其实就是把原来的前一个拿过来,后一个拿过来
进行压缩的盒子,可以将48bit
压缩成32bit
方法是:将48bit
分成8份,每份6个数,用第一个和最后一个组成二进制转换成十进制对应行i
,中间的四个数构成的二进制转换成十进制,作为列j
,查表得到一个十进制,再转换成二进制即可
根据框架图硬算就行了,这里就不放代码了
最后就是能得到64位的密文
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。