数据加密标准( Data Encryption Standard,DES)也称为数据加密算法,是由IBM公司研制,经美国政府加密标准选择后,在1977年被确定为联邦信息标准。
DES算法的意义在于它是第一个形成标准化的密码系统。在DES算法之前,保密通信双方使用的密码算法都是由双方秘密约定的,不能公开,因此不符合Kerckhoffs原则。在用DES标准化密码系统后,可以在更广的范围内满足保密通信的需要。
DES是分组密码算法,从算法一端输入明文,再把密文从另一端输出。由于采用的是对称密钥,因此加密和解密使用相同的算法和密钥,并且加、解密算法是公开的,系统的安全性靠密钥的保密。
1.DES的加密过程
DES对数据加密时,第一步先将数据切分成64位的分组(最后一组如果不足64位,可以在其后面添加n个0,使其凑足64位),它使用的密朝为64位,但有效密钥长度为56位(另有8位用于奇偶校验,检查数据在传输中是否出现了不可预料的错误改变)输出的密钥分组也是64位,解密时的过程和加密时的类似,但密钥的顺序正好相反。
(1)明文初始置换。首先对明文分组进行初始置换,以打乱原来的次序,DES有一个明文初始置换表,初始置换就是按照这个表将明文的第58位移到第1位,将第50位移动到第2位,将第42位移动到第3位……明文分组m1,m2,……,m64经过初始置换后变成了m56,m50,m8,m57,m49,……,m7。至于为什么要这么换位,那是算法设计者经过充分验证后得出的最有效的加密方法,并且设计细节是保密的,我们可以不必深究。
(2)密钥初始置换。密钥的初始值为64位,DES算法规定其中的第8、16、24、32、40、48、56、64位为奇偶校验位,用于检测传输途中数据是否发生了改变。因此先把这8位去掉,密钥由64位变成56位。DES中也有一个密钥初始置换表,密钥初始置换就是按照这个表将密钥的第57位移动到第1位,将第49位移动到第2位……这样密钥分组d1,d2,……,d64经过初始置换后变成了d57,d49,……,d36,d63,…,d4。
(3)生成16个48位的子密钥。第一步先把56位的密钥切分成左右两部分,每部分28位分别记为C0、D0。然后,分别将C0、D0左移一位,得到C1、D1;将C1、D1左移一位,得到C2、D2;将C2、D2左移两位,得到C3、D3……从而得到C1D1~C16D16。将移动后的Cn和Dn重新合并得到16个56位的密钥。再将这16个56位的密钥按照一个缩小换位表均缩小成48位的密钥。最后得到16个48位的子密钥K1~K16。
(4)明文扩展置换。将初始置换后的明文也切分成左右两部分,每部分32位,记为L0、R0。然后,根据一个扩展置换表(有时也叫E盒,如下表所示),将R0由32位扩展到48位,而L0则保持不变。接着根据L0和R0及下面的公式分别求L1~L16和R1~R16。
Li=Ri-1 i=1,2,……,16
Li=Ri-1 i=1,2,……,16
表 E盒(输入32位,输出48位)
(5)S盒替代。即L1就等于R0,而为了求R1,先将R0和密钥K1进行异或运算后得到48位的字符串,把这48位数分成8个6位数,1~6位为B[1],7~12位为B[2]……43~48位为B[8]。将这8个6位数分别输入到8个S盒(S1~S8盒)里。S盒再取出b1~b6中的b1和b6作为行数,b2~b5组成的二进制数表示列数。两位二进制数转换为十进制数作为行,4位二进制数转换为十进制数作为列,在S盒中选取该行和列对应的数字,将该数字转换为4位二进制数作为输出。例如,若S1盒的输入B[1]为101100,则它的首尾两位为10,对应的行数是2,中间四位是0110,对应的列数是6,查下表所示的S1盒,可发现第2行第6列的数字是2,则4位输出是0010。注意:S盒的行和列序号都是从0开始的。
表 S1盒
(6)P盒置换。将8个S盒输出的32位数进行P盒置换,把每个输入位移到输出位,例如,把第21位移到第4位处,第4位移到第31位处。最终将P盒置换的结果再与L0进行异或运算。所得结果即为R1。
(7)末置换。在对明文左右部分L0、R0进行完依赖于密钥的16轮处理后,得到R16和L16,在DES的最后一轮,左半部分和右半部分没有交换,而是将其合并为R16L16,形成分组作为末置换的输入,依据DES的末置换表打乱输入顺序,如将第40位移动到第1位,第8位移动到第2位……
(8)DES的解密。DES的解密和加密算法相同,只是首次迭代时用子密钥K16,第2次用K15……第16次用K1,也就是仍然按照加密的过程进行以上步骤的运算,只不过把子密钥的顺序倒过来而已。