1、公开征集密码算法标准的主要要求
- 算法必须是安全的:具有加密保护信息安全的能力
- 算法必须是公开的:有完整的算法说明、容易理解、能为所有用户使用
- 能够经济、有效的硬件实现:性能好
- 能够得到批准:合法
- 可出口:大众化
2、DES概述
- 分组加密算法:明文和密文为64位分组长度
- 对称算法:加密和解密除密钥编排不同之外,使用的是同一算法
- 密钥长度:56位,但存在弱密钥,容易避开
- 混乱(S盒)和扩散(P盒)组合,每个组合先代换后置换,共16轮
- 只使用标准的算数和逻辑运算,易于实现。
- 商业密码、现代密码学的标志。
3、DES的实现
(1)、DES算法的整体结构----Feistel结构
*细节流程图
- Feistel提出利用乘积密码可获得简单的代换密码
- Feistel还提出了实现代换和置换的方法
- 很多分组密码的结构从本质上说都是基于一个称
为Feistel网络的结构
(2)、第一步:密钥的编排 (为加密做准备)
- 密钥生成:
- 从用户处取得一个64位(本文均指二进制位))长的密码口令key ,key=k1k2k3…k63k64。
- 去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥。
-
等分密钥:
-
输入密钥位序/ A位序对照表
输入密钥位序/ B位序对照表
这样 key=k1k2k3…k55k56 形成了A、B两部分:
A = k57k49k41…k44k36
B=k65k55k47…k12k4 -
密钥移位
DES算法的密钥是经过16次迭代(循环左移)得到一组密钥的
Ps:生成的A、B视为迭代的起始密钥,上表显示每一次迭代时密钥循环左移的位数。 比如在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位…第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位。 -
迭代并乘积合并得到密钥C
-
第一次迭代:
A(1) =(1) A -
第i次迭代:
A(i) =(i) A(i-1)
B(i) =(i) B(i-1) -
第i次迭代生成的两个28位长的密钥并乘积得到56位密钥C(i)=A(i)B(i)=A(i)1…A(i)28B(i)1…B(i)28
- 对密钥C进行加密,故产生加密密钥K
- 56位密钥C的位序与加密密钥K的位序对照表
Ps:k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,依此类推,k的最后一位第48位是56位密钥的第32位。 这样,就生成了一个48位使用密钥:K=k(i)1k(i)2…k(i)48
- DES算法密钥生成需要进行16次迭代,在完成16次迭代前,循环执行上述第4步和第5步,最终形成16套加密密钥:key[0],key[1],key[2],…。key[14],key[15]。即以下第二步
(3)、第二步:16轮迭代
按下述规则进行16次迭代:
Ps1:这里的 “+” 是对应比特的模加2,f 是一个函数(轮函数)。
Ps2:16个长度为48比特的子密钥ki(1≤i≤16)是由密钥k经密钥编排函数计算出来的。
Ps3:第16轮迭代左右数值不做交换
(4)、第三步:IP置换(加密)
给定明文,通过一个固定的初始置换IP来重排输入明文块P中的比特,得到比特串P0=IP(P)=L0R0,这 里L0和R0分别是P0的前32比特和后32比特
Ps:利用乘积密码可获得简单的代换密码
(5)、第四步:IP逆置(解密)
对比特串R16L16使用逆置换IP-1得到密文C,即
C=IP-1 (R16L16)。
***以上为含图简介,为了更好理解这个过程,避免看很多头疼的流程图,我们用文字叙述的方式来简述加密解密的详细过程,即以上(4)、(5)为数据加密解密的简介,以下为具体过程:
1.总体过程
DES对64位明文分组进行操作。通过一个初始置换,将明文分组分成左半部分和右半部分,各32位长。
然后进行16轮完全相同的运算,这些运算被称为函数 f,在运算过程中数据与密钥结合。经过16轮
后,左、右半部分合在一起经过一个末置换(初始置换的逆置换),算法就完成了。
在每一轮中,密钥位移位,然后再从密钥的56位中选出48位。通过一个扩展置换将数据的右半部分
扩展成48位,并通过一个异或操作与48位密钥结合,通过 8个S盒将这48位替代成新的32位数据,再
将其置换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,
其结果即成 为新的左半部分。将该操作重复16次,便实现了DES的16轮运算。
假设Bi是第i次迭代的结果,Li和Ri是Bi的左半部分和右半部分,Ki是第i轮的48位密钥,且f是实现
代替、置换及密钥异或等运算的函数,那么每一轮就是:
Li=Ri-1
Ri=Li-1⊕f(Ri-1,Ki)
2、初始置换
初始置换在第一轮运算之前进行,对输入分组实施如下表所示的变换。初始置换把明文的第58位换到第1位的位置,把第50位换到第2位的位置,把第42位换到第3位的位置,以此类推。
58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
初始置换和对应的末置换并不影响DES的安全性,它们的主要目的是为了更容易地将明文和密文数据以字节大小放入DES芯片中。
3、密钥置换
由于不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节第8位作为奇偶校验以确保密钥不发生错误。如下表所示:
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
在DES的每一轮中,从56位密钥产生出不同的48位子密钥(subkey),这些子密钥是这样确定的:
首先,56位密钥被分成两部分,每部分28位。
然后,根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
轮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
位数 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
移动后,就从56位中选出48位。这个运算既置换了每位的顺序,也选择了子密钥,被称为压缩置换(compression permutation)。下表即定义了压缩置换:
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
可以看出,第33位的那一位在输出时移到了第35位,而处于第18位的那一位被忽略了。
4、扩展置换 (轮函数f的一部分)
这个运算将数据的右半部分从32位扩展到48位。这个操作两方面的目的:它产生了与密钥同长度的数据以进行异或运算;它提供了更长的结果,使得在替代运算中能进行压缩。
对每个4位输入分组,第1位和第4位分别表示输出分组中的两位,而第2位和第3位分别表示输出分组中的一位,下表给出了哪一输出位对应哪一输入位:
32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9
8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17
16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25
24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1
处于输入分组中第3位的位置移到了输出分组中的第4位,而输入分组的第21位则移到了输出分组的第30位和第32位。尽管输出分组大于输入分组,但每一个输入分组产生唯一的输出分组。
5、S盒代替 (轮函数f的一部分)
压 缩后的密钥与扩展分组异或以后,将48位的结果送入,进行代替运算。替代由8个S盒完成,每一个S盒都由6位输入,4位输出,且这8个S盒是不同的。48 位的输入被分为8个6位的分组,