DES加密解密算法.docx
- 文档编号:8936945
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:17
- 大小:19.98KB
DES加密解密算法.docx
《DES加密解密算法.docx》由会员分享,可在线阅读,更多相关《DES加密解密算法.docx(17页珍藏版)》请在冰点文库上搜索。
DES加密解密算法
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换(输入的第58位换到第一位,第50位换到第2位,依此类推,最后一位是原来的第7位),最终由L0输出左32位,R0输出右32位,根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。
DES算法的入口参数有三个:
Key、Data、Mode。
其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:
加密或解密,如果Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式作为DES的输出结果。
在使用DES时,双方预先约定使用的”密码”即Key,然后用Key去加密数据;接收方得到密文后使用同样的Key解密得到原数据,这样便实现了安全性较高的数据传输。
DES加密算法的过程:
1.对输入的密钥进行变换。
用户的64bit密钥,其中第8,16,24,32,40,48,56,64位是校验位,使得每个密钥都有奇数个1。
所以密钥事实上是56位。
对这56位密钥进行如下表的换位。
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,
表的意思是第57位移到第1位,第49位移到第2位,......以此类推。
变换后得到56bit数据,将它分成两部分,C[0][28],D[0][28]。
2.计算16个子密钥,计算方法C[i][28]D[i][28]为对前一个C[i-1][28],D[i-1][28]做循环左移操作。
16次的左移位数如下表:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16(第i次)
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1(左移位数)
3.串联计算出来的C[i][28]D[i][28]得到56位,然后对它进行如下变换得到48位子密钥K[i][48]
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,
表的意思是第14位移到第1位,第17位移到第2位,以此类推。
在此过程中,发现第9,18,22,25,35,38,43,54位丢弃。
4.对64bit的明文输入进行换位变换。
换位表如下:
58,50,12,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
表的意思就是第一次变换时,第58位移到第1位,第50位移到第2位,......依此类推。
得到64位数据,将这数据前后分成两块L[0][32],R[0][32]。
5.加密过程,对R[i][32]进行扩展变换成48位数,方法如下,记为E(R[i][32])
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,
6.将E(R[i][32])与K[i][48]作异或运算,得到48位数,将48位数顺序分成8份,6位一份,B[8][6]。
7.使用S[i]替换B[i][6]。
过程如下:
取出B[i][6]的第1位和第6位连成一个2位数m,m就是S[i]中对应的行数(0-3),取出B[i][6]的第2到第5位连成一个4位数n(0-15),n就是S[i]中对应的列数,用S[i][m][n]代替B[i][6]。
S是4行16列的对应表,里面是4位的数,一共有8个S,定义如下:
S[1]:
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,
S[2]:
15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,
S[3]:
10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,
S[4]:
7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,
S[5]:
2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,
S[6]:
12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,
S[7]:
4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,
S[8]:
13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,
8.将从B[i][6]经过S得到的8个4位数连起来得到32位数。
对这个数进行如下变换:
16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,
2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25,
得到的结果与L[i][32]作异或运算,把结果赋给R[i][32]。
9.把R[i-1][32]的值赋给L[i],从5开始循环。
直到K[16][48]结束。
10.将最后的L,R合并成64位,然后进行如下转化得到最后的结果。
这是对第4步的一个逆变化。
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
解密过程同样,只需要把16个子密钥K[i][48]的顺序颠倒过来就可以了。
#include
#include
#include
#include
#defineDecode0
#defineEncode1
boolSub_Key[16][48];
//明文初始置换
unsignedcharInitial[]=
{
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
};
//最终置换
unsignedcharFinal[]=
{
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
};
//S-盒置换
unsignedcharS_Box[8][64]=
{
/*S1*/
/*S2*/
/*S3*/
/*S4*/
/*S5*/
/*S6*/
/*S7*/
/*S8*/
};
unsignedcharKey_Exchange[56]=
{
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
};
//压缩变换
unsignedcharCompression[]=
{
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
};
//扩展变换
unsignedcharExpansion[]=
{
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
};
//P_盒置换
unsignedcharP_Box[]=
{
16,7,20,21,29,12,28,17,
1,15,23,26,5,18,31,10,
2,8,24,14,32,27,3,9,
19,13,30,6,22,11,4,25
};
//密钥置换
unsignedcharKey[]=
{
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
};
//
unsignedcharKey_Move[]=
{
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
voidKey_Process(char*);
voidDES(char*,char*,int);
voidGenerate_SubKey(bool*,bool*);
voidRotate_Key(bool*,int);
voidInitial_Exchange(char*,bool*,bool*);
voidExchange_Key(char*,bool*);
voidExpand_Right(bool*,bool*);
voidS_function(bool*,bool*);
voidP_function(bool*);
voidFinal_Exchange(bool*,bool*,char*);
voidBitToByte(char*Out,constbool*In,intbits);
//主函数
intmain(intargc,char**argv)
{
unsignedlongstart,end;
//timewhenexecutionbegins
start=clock();
charFinal_Result[12]=;
charMessage[12]=;
charS_Key[8]=;//64bits
//打开文件用于输入
FILE*input=fopen(argv[1],"r");
if(ferror(input))
return0;
//创建文件用于输出密文
FILE*encyption=fopen(argv[2],"w");
if(ferror(encyption))
return0;
//创建文件用于输出解密后的明文
FILE*decyption=fopen(argv[3],"w");
if(ferror(decyption))
return0;
while(!
feof(input))
{
inti=0;
while(!
feof(input)&&i<8)
{
Message[i]=fgetc(input);
i++;
}
if(i==0)
break;
elseif(i<8)
{
for(;i<8;i++)
Message[i]='\0';
}
Key_Process(S_Key);
DES(Message,Final_Result,Encode);
Final_Result[8]=0;
fputs(Final_Result,encyption);
memset(Message,0,8);
DES(Final_Result,Message,Decode);
Message[8]=0;
fputs(Message,decyption);
}
//timewhenexecutionends
end=clock();
printf("Theexecutiontimeis%ldms\n",end-start);
return0;
}
voidKey_Process(char*S_Key)
{
intround;
boolBit_Key[56];//56bits
Exchange_Key(S_Key,Bit_Key);
for(round=0;round<16;round++)
{
//KL->消息左28位,KR->消息右28位
bool*KL=&Bit_Key[0],*KR=&Bit_Key[28];
//循环左移
Rotate_Key(KL,Key_Move[round]);
Rotate_Key(KR,Key_Move[round]);
//产生子密钥
Generate_SubKey(Bit_Key,Sub_Key[round]);
}
}
voidExchange_Key(char*Key,bool*New_Key)
{
inti,j;
boolBit_Key[64];
//Transformtheinitialkeytobooltype
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
Bit_Key[i*8+j]=(Key[i]>>j)&0x01;
}
for(i=0;i<56;i++)
New_Key[i]=Bit_Key[Key_Exchange[i]-1];
}
voidRotate_Key(bool*Key,intround)
{
booltemp[64];
//void*memcpy(void*to,constvoid*from,size_tcount);
//函数从from中复制count个字符到to中,并返回to指针
memcpy(temp,Key,round);
memcpy(Key,Key+round,28-round);
memcpy(Key+28-round,temp,round);
}
voidGenerate_SubKey(bool*Input,bool*Output)
{
for(inti=0;i<48;i++)
{
Output[i]=Input[Compression[i]-1];
}
}
//DES函数
voidDES(char*Message,char*Final_Result,inttype)
{
boolRight[32];//32bits
boolLeft[32];//32bits
boolExpanded_Right[48];//扩展后的右消息
boolflag[32];//用于左右消息交换
boolResult1[48];//48bits
boolResult2[32];//32bits
intround,i;
Initial_Exchange(Message,Left,Right);
//加密算法
if(type==Encode)
{
for(round=0;round<16;round++)
{
memcpy(flag,Right,32);
Expand_Right(Right,Expanded_Right);
for(i=0;i<48;i++)
Result1[i]=Expanded_Right[i]^Sub_Key[round][i];
S_function(Result1,Result2);
P_function(Result2);
for(i=0;i<32;i++)
Right[i]=Result2[i]^Left[i];
memcpy(Left,flag,32);
}
}
//解密算法
elseif(type==Decode)
{
for(round=15;round>=0;round--)
{
memcpy(flag,Left,32);
Expand_Right(Left,Expanded_Right);
for(i=0;i<48;i++)
Result1[i]=Expanded_Right[i]^Sub_Key[round][i];
S_function(Result1,Result2);
P_function(Result2);
for(i=0;i<32;i++)
Left[i]=Result2[i]^Right[i];
memcpy(Right,flag,32);
}
}
Final_Exchange(Left,Right,Final_Result);
}
voidInitial_Exchange(c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DES 加密 解密 算法