您的当前位置:首页正文

实验报告 DES加密算法的实现

来源:好兔宠物网
实验报告 DES加密算法的实现

班级自动化学号:姓名: 2016年11月13日星期日 一、DES加密简述:

DES算法是一种对称密码体制,由美国IBM公司在1972年研发。其明文按64位进行分组,密钥长64位(包含8位校验位),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 二、DES的实现过程

首先通过初始置换表IP对明文进行置换

intIP_Table[64] = { 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, 56,48,40,32,24,16,8,0,

58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6};

第一个57就是将明文中的第57个元素,放到第1的位置,然后把明文中第49个元素放到第2的位置,以此类推。之后将换位后的输出分为两部分L0和R0,L0是输出的左32位,R0 是右32位。

intDES_IP_Transform(char data[64]){

}

intcnt;

char temp[64];

for(cnt = 0; cnt< 64; cnt++){ temp[cnt] = data[IP_Table[cnt]]; }

memcpy(data,temp,64); return 0;

之后加密函数,将R0通过位选择函数E置换,把本身是32位的R0扩充成48位,与生成的48位子密钥对应,按位运算。

intE_Table[48] = {31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8,9,10,11,12, 11,12,13,14,15,16, 15,16,17,18,19,20, 19,20,21,22,23,24, 23,24,25,26,27,28, 27,28,29,30,31, 0};

intDES_E_Transform(char data[48]){ intcnt; char temp[48]; for(cnt = 0; cnt< 48; cnt++){ temp[cnt] = data[E_Table[cnt]]; } memcpy(data,temp,48); return 0; }

然后,将扩充完的R0和子密钥K1进行模2加运算,得到48位的一个串,把这个串从左到右分为8组,每组6个字符。这里设8组分别为B1,B2,B3,B4,B5,B6,B7,B8。其中Bj=b1b2b3b4b5b6。之后,通过S盒来收缩,然后通过S盒输出的就是32位的一个串。

int DES_SBOX(char data[48]){ intcnt; intline,row,output; int cur1,cur2; for(cnt = 0; cnt< 8; cnt++){ cur1 = cnt*6; cur2 = cnt<<2; line = (data[cur1]<<1) + data[cur1+5]; row = (data[cur1+1]<<3) + (data[cur1+2]<<2) + (data[cur1+3]<<1) + data[cur1+4]; output = S[cnt][line][row]; data[cur2] = (output&0X08)>>3; data[cur2+1] = (output&0X04)>>2;

}

data[cur2+2] = (output&0X02)>>1; data[cur2+3] = output&0x01; }

return 0;

最后,经过16次迭代运算后。得到L16、R16,

for(cnt = 0; cnt < 16; cnt++){

memcpy(copyRight,plainBits+32,32); DES_E_Transform(copyRight);

DES_XOR(copyRight,subKeys[cnt],48); DES_SBOX(copyRight);

DES_P_Transform(copyRight); DES_XOR(plainBits,copyRight,32); if(cnt != 15){

DES_Swap(plainBits,plainBits+32); } }

将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置换的逆运算。

int IP_1_Table[64] = {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, 32,0,40,8,48,16,56,24}; int DES_IP_1_Transform(char data[64]){

intcnt; char temp[64]; for(cnt = 0; cnt< 64; cnt++){ temp[cnt] = data[IP_1_Table[cnt]]; } memcpy(data,temp,64); return 0; }

子密钥的生成过程

首先,先去掉密钥中的奇偶校验位,然后根据选择置换PC-1讲剩下的密钥分成两块C0和D0;

int DES_PC1_Transform(char key[64], char tempbts[56]){ intcnt; for(cnt = 0; cnt< 56; cnt++){ tempbts[cnt] = key[PC_1[cnt]]; }

return 0;

}

第二步,将C0和D0进行循环左移变换,生成C1和D1,然后C1和D1合并,通过选择置换PC-2生成子密钥K1; 循环左移:

int DES_ROL(char data[56], int time){ char temp[56]; memcpy(temp,data,time); memcpy(temp+time,data+28,time); memcpy(data,data+time,28-time); memcpy(data+28-time,temp,time); memcpy(data+28,data+28+time,28-time); memcpy(data+56-time,temp+time,time); return 0; }

选择置换PC2:

int DES_PC2_Transform(char key[56], char tempbts[48]){ intcnt; for(cnt = 0; cnt< 48; cnt++){ tempbts[cnt] = key[PC_2[cnt]]; } return 0; }

第三步,C1和D1再次经过循环左移变换,生成C2和D2,C2和D2合并,通过选择置换PC-2生成子密钥K2;

第四步,以此类推,需要注意其中循环左移的位数,一共是循环左移十六次,其中LS1(第一次),LS2(第二次),LS9,LS16是循环左移一位,其他的都是左移两位。 int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

以上为DES加密算法的实现思路。数据解密的算法与加密算法相同,区别在于第B-3步中和数据进行按位异或的密钥的使用顺序不同,密钥的次序相反。如果各轮加密密钥分别是K1,K2,K3…K16,那么解密密钥就是K16,K15,K14…K1。 编程实现:

语言:C++ 使用工具:Code::Blocks 12.11环境:Windows 10 Version 1607 实现完整代码另附。

因篇幅问题不能全部显示,请点此查看更多更全内容