这学期开了密码学的课程,接触到了DES加密,因此在这里写下博客,记录自己的学习过程。
加密
DES是一种对称密码算法,其明文长度为64bit(若明文长度大于64bit,则需对明文进行分组;小于64bit的部分则要进行填充),密钥长度为56bit。对于输入的56bit密钥,会先进行密钥扩展(填充奇偶校验位,此时密钥为64bit),随后对64bit密钥进行PC-1置换将其变为56bit,随后进行16轮循环,根据循环次数分别对置换后所得的前28bit密钥和后28bit密钥左移循环一定的位数,且在每一轮循环后对两部分密钥合并后进行PC-2置换,每一轮循环后所得结果即为该轮生成的子密钥Ki(0<=i<=16),其中Ki为48bit.
对于输入的64bit明文,先经过初始IP置换后将所得的前32bit作为左部分L0,后32bit作为右部分R0,随后进行16轮循环。在第1-15轮循环中Li = R(i-1) ,Ri = Li-1^f(Ri-1,Ki);第16轮循环中比较特殊:L16 =L15^f(R15,K16),R16 = R15.。随后,将L16和R16(共64bit)合并,进行IP逆置换,即可得到DES加密后的密文。
其中函数f(Ri-1,Ki)描述如下:对每一个右密钥Ri-1进行扩展变换E,再将所得结果和每一轮生成的子密钥Ki进行异或运算;最后,进行S-盒代替和P-盒置换。
S-盒代替
将48bit数据分成6bit的八组,输入8个S-盒即可得到4bit*8的输出。
注:E表拓展,IP置换,IP逆置换,S-盒以及P-盒、PC-1、PC-2均有固定的置换方式,具体附后:
const static char IP_Table[64] = { //初始置换IP
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 };
const static char IPInv_Table[64] = {
40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25, };
static const char E_Table[48] = { //扩展变换E
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,