DES采用了64位的分组长度和56位的密钥长度,是对称加密的一种。
DES的理论进化主线是 1945年Shannon大神提出的交替使用混淆(使密文与密钥的统计关系变复杂)和扩散(使明文与密文的统计关系变复杂)的乘积密码(DES加密的核心思想)-->1960s的Feistel结构-->DES。实践主线是 1971年基于Feistel结构的LUCIFER算法-->Tuchman-Mayer方案(将LUCIFER的128位密钥简化为56位)-->1977年被采纳的DES(增加S盒,产生非线性)。
下图为DES加密的整个机制。
DES加密操作分两块,明文加密以及生成子密钥两部分。
上图左半部分描述了明文加密成密文的三个阶段。
1、64位的明文经初始置换(IP)而重新排列。
2、进行16轮的置换和转换(基于Feistel结构)。
3、再做一次置换(IP-1,与初始置换互逆)。
可逆验证 M=IP-1{F[IP(P)]}
IP-1{F[IP(M)]}= IP-1{F[IPIP-1{F[IP(P)]}]}=IP-1{FF[IP(P)]}=IP-1IP(P)=P
结论,加密和解密的过程基本一致(F函数代表16轮转换的整体效果,实际上子密钥在加密和解密中顺序是相反的)
上图右半部分是56位密钥的操作过程。
1、密钥先做一个置换。
2、再做16次包含循环左移和置换的操作组合,每次都产生一个子密钥Ki。每一轮的置换操作都完全相同,但由于循环左移而使得每个子密钥不同。
下面介绍初始置换及其逆置换。
如上表,分别代表初始置换和初始置换的逆置换。表中数字包含1-64,代表输入的64位分组的每一比特在置换输出后的位置。
很显然,以上两个置换确实是可逆的,如明文分组的第1位经初始置换后出现在第58位,而逆置换的第58位将输出到第1位。
这个置换的原理实际上是对置换群的可逆操作。
Feistel结构的加密与解密
Feistel结构的加密算法将明文分组分成等长的左右两部分,这两半经过n轮迭代后组成密文分组。每一轮的迭代操作都完全相同,解密过程本质上与加密过程操作是一致的,只是子密钥的使用顺序与加密过程完全相反。因此,为了研究加密与解密过程的可逆性,可将问题简化为只有一轮的迭代,如下图。
feistel结构的可逆性,其运用的数学原理是异或的几个基本性质
[A⊕B]⊕C=A⊕[B⊕C]
A⊕A=0
A⊕0=A
以 i 轮为例
加密时有 解密时有
Li=Ri-1 Li’=Ri-1‘ ==> Li’=Li=Ri-1
Ri=Li-1⊕F(Ri-1,Ki) Ri’=Li-1‘⊕F(Ri-1’,Ki) ==> Ri’=Ri⊕F(Li,Ki)=Li-1⊕F(Ri-1,Ki)⊕F(Ri-1,Ki)=Li-1
结论:每轮加密和解密的中间结果都完全一样,且与F函数无关。而F函数越复杂,Ri与Li-1的关系越复杂,因而越难被破解。
DES第二阶段每轮变换的详细过程
由于轮密钥长48位,R是32位,首先要将R进行置换扩展为48位,其中有16位是重复的,如用下表进行置换扩展。
然后将扩展后的48位与轮密钥进行异或,所得结果再用一个替代函数作用(S盒)并输出32位。下图解释了S盒在函数F中的作用。
代替函数由8个S盒组成,S盒的变换参见下表。
每个S盒都输入6位,输出4位。盒Si输入的第1位和最后1位组成一个2位的二进制数,用来选择S盒4行代替值中的一行,中间4位用来选择16列中的某一列。行列交叉处的十进制转换为二进制之后可得到输出的4位二进制数。
S盒实现了非线性的特性。通过S盒,不同的输入可以有相同的输出,进一步增加了明文与密文之间的映射关系的复杂度,使得破解更加艰难。
最后再做一次置换后输出,该置换例子如下表。
密钥产生
1、首先输入64位密钥,密钥各位分别标记为1-64。从64位中选择56位作为有效密钥,如选择下表阴影部分。
2、将所得56位有效密钥进行置换并划分成等长的两部分C0和D0,如下表。
3、每轮进行迭代时,Ci-1和Di-1分别循环左移一位或者两位,具体移位数见下表。
4、对移位后的值再做一次置换,如下表。