信息安全技术DES加密算法Word文档格式.docx
《信息安全技术DES加密算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《信息安全技术DES加密算法Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
des.h"
intmain(intargc,char*argv[])
BYTEdata[64];
BYTEkey[64];
intlen;
inti;
memset(data,0,sizeof(data));
memset(key,0,sizeof(key));
printf("
Pleaseinputastring:
\n"
);
gets(data);
len=strlen(data);
Pleaseinputakey:
gets(key);
Originaldata:
%s\n"
data);
des(data,key,len);
Encrypteddata:
"
for(i=0;
i<
len;
i++)
printf("
%02X"
data[i]);
Ddes(data,key,len);
Decrypteddata:
\nPressEntertoexit...\n"
getchar();
return0;
system("
PAUSE"
}
第三个文件des.c
/*DES加密解密函数库
*
*本算法根据以下文章内容整理:
*DES算法的介绍和实现(上)
*DES算法的介绍和实现(下)
*EricWei,2007-4-5
*/
ULONG32g_outkey[16][2]={0};
/*输出的key*/
ULONG32g_bufkey[2]={0};
/*形成起始密钥*/
/*实现时多采用查表方式,下面是定义的供查找用的表*/
staticBYTEwz_lefttable[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
staticULONG32wz_leftandtab[3]={0x0,0x80000000,0xc0000000};
staticBYTEwz_keyleft[28]=//前28位
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
staticBYTEwz_keyright[28]={//后28位密钥
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
staticBYTEwz_keychoose[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
staticBYTEwz_pc4[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
staticBYTEwz_pc1[64]={/*第一次转换时用*/
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
};
staticBYTEwz_pc3[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
staticULONG32wz_pc2[64]={
0x80000000L,0x40000000L,0x20000000L,0x10000000L,0x8000000L,
0x4000000L,0x2000000L,0x1000000L,0x800000L,0x400000L,
0x200000L,0x100000L,0x80000L,0x40000L,0x20000L,0x10000L,
0x8000L,0x4000L,0x2000L,0x1000L,0x800L,0x400L,0x200L,
0x100L,0x80L,0x40L,0x20L,0x10L,0x8L,0x4L,0x2L,0x1L,
0x80000000L,0x40000000L,0x20000000L,0x10000000L,0x8000000L,
0x200000L,0x100000L,0x80000L,0x40000L,0x20000L,0x10000L,
0x8000L,0x4000L,0x2000L,0x1000L,0x800L,0x400L,0x200L,
0x100L,0x80L,0x40L,0x20L,0x10L,0x8L,0x4L,0x2L,0x1L,
staticBYTEexptab3[48]={
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
staticBYTESP[8][64]=
{
0xe,0x0,0x4,0xf,0xd,0x7,0x1,0x4,0x2,0xe,0xf,0x2,0xb,
0xd,0x8,0x1,0x3,0xa,0xa,0x6,0x6,0xc,0xc,0xb,0x5,0x9,
0x9,0x5,0x0,0x3,0x7,0x8,0x4,0xf,0x1,0xc,0xe,0x8,0x8,
0x2,0xd,0x4,0x6,0x9,0x2,0x1,0xb,0x7,0xf,0x5,0xc,0xb,
0x9,0x3,0x7,0xe,0x3,0xa,0xa,0x0,0x5,0x6,0x0,0xd
},
{
0xf,0x3,0x1,0xd,0x8,0x4,0xe,0x7,0x6,0xf,0xb,0x2,0x3,
0x8,0x4,0xf,0x9,0xc,0x7,0x0,0x2,0x1,0xd,0xa,0xc,0x6,
0x0,0x9,0x5,0xb,0xa,0x5,0x0,0xd,0xe,0x8,0x7,0xa,0xb,
0x1,0xa,0x3,0x4,0xf,0xd,0x4,0x1,0x2,0x5,0xb,0x8,0x6,
0xc,0x7,0x6,0xc,0x9,0x0,0x3,0x5,0x2,0xe,0xf,0x9
0xa,0xd,0x0,0x7,0x9,0x0,0xe,0x9,0x6,0x3,0x3,0x4,0xf,
0x6,0x5,0xa,0x1,0x2,0xd,0x8,0xc,0x5,0x7,0xe,0xb,0xc,
0x4,0xb,0x2,0xf,0x8,0x1,0xd,0x1,0x6,0xa,0x4,0xd,0x9,
0x0,0x8,0x6,0xf,0x9,0x3,0x8,0x0,0x7,0xb,0x4,0x1,0xf,
0x2,0xe,0xc,0x3,0x5,0xb,0xa,0x5,0xe,0x2,0x7,0xc
0x7,0xd,0xd,0x8,0xe,0xb,0x3,0x5,0x0,0x6,0x6,0xf,0x9,
0x0,0xa,0x3,0x1,0x4,0x2,0x7,0x8,0x2,0x5,0xc,0xb,0x1,
0xc,0xa,0x4,0xe,0xf,0x9,0xa,0x3,0x6,0xf,0x9,0x0,0x0,
0x6,0xc,0xa,0xb,0xa,0x7,0xd,0xd,0x8,0xf,0x9,0x1,0x4,
0x3,0x5,0xe,0xb,0x5,0xc,0x2,0x7,0x8,0x2,0x4,0xe
0x2,0xe,0xc,0xb,0x4,0x2,0x1,0xc,0x7,0x4,0xa,0x7,0xb,
0xd,0x6,0x1,0x8,0x5,0x5,0x0,0x3,0xf,0xf,0xa,0xd,0x3,
0x0,0x9,0xe,0x8,0x9,0x6,0x4,0xb,0x2,0x8,0x1,0xc,0xb,
0x7,0xa,0x1,0xd,0xe,0x7,0x2,0x8,0xd,0xf,0x6,0x9,0xf,
0xc,0x0,0x5,0x9,0x6,0xa,0x3,0x4,0x0,0x5,0xe,0x3
0xc,0xa,0x1,0xf,0xa,0x4,0xf,0x2,0x9,0x7,0x2,0xc,0x6,
0x9,0x8,0x5,0x0,0x6,0xd,0x1,0x3,0xd,0x4,0xe,0xe,0x0,
0x7,0xb,0x5,0x3,0xb,0x8,0x9,0x4,0xe,0x3,0xf,0x2,0x5,
0xc,0x2,0x9,0x8,0x5,0xc,0xf,0x3,0xa,0x7,0xb,0x0,0xe,
0x4,0x1,0xa,0x7,0x1,0x6,0xd,0x0,0xb,0x8,0x6,0xd
0x4,0xd,0xb,0x0,0x2,0xb,0xe,0x7,0xf,0x4,0x0,0x9,0x8,
0x1,0xd,0xa,0x3,0xe,0xc,0x3,0x9,0x5,0x7,0xc,0x5,0x2,
0xa,0xf,0x6,0x8,0x1,0x6,0x1,0x6,0x4,0xb,0xb,0xd,0xd,
0x8,0xc,0x1,0x3,0x4,0x7,0xa,0xe,0x7,0xa,0x9,0xf,0x5,
0x6,0x0,0x8,0xf,0x0,0xe,0x5,0x2,0x9,0x3,0x2,0xc
0xd,0x1,0x2,0xf,0x8,0xd,0x4,0x8,0x6,0xa,0xf,0x3,0xb,
0x7,0x1,0x4,0xa,0xc,0x9,0x5,0x3,0x6,0xe,0xb,0x5,0x0,
0x0,0xe,0xc,0x9,0x7,0x2,0x7,0x2,0xb,0x1,0x4,0xe,0x1,
0x7,0x9,0x4,0xc,0xa,0xe,0x8,0x2,0xd,0x0,0xf,0x6,0xc,
0xa,0x9,0xd,0x0,0xf,0x3,0x3,0x5,0x5,0x6,0x8,0xb
}
/*函数实现*/
INT32DdesN(BYTE*data,BYTE**key,ULONG32n_key,ULONG32readlen)
INT32i;
for(i=n_key;
i>
0;
i--)
Ddes(data,key[i-1],readlen);
returnSUCCESS;
INT32desN(BYTE*data,BYTE**key,ULONG32n_key,ULONG32readlen)
ULONG32i=0;
for(i=0;
n_key;
des(data,key[i],readlen);
INT32des3(BYTE*data,BYTE*key,ULONG32n,ULONG32readlen)
ULONG32i=0,j=0;
makefirstkey((ULONG32*)key);
/*产生密钥*/
n;
for(j=0;
j<
readlen;
j+=8)
handle_data((ULONG32*)&
data[j],DESENCRY);
}
INT32Ddes3(BYTE*data,BYTE*key,ULONG32n,ULONG32readlen)
data[j],DESDECRY);
INT32des(BYTE*data,BYTE*key,INT32readlen)
INT32i=0;
i+=8)
data[i],DESENCRY);
INT32Ddes(BYTE*data,BYTE*key,INT32readlen)
data[i],DESDECRY);
INT32handle_data(ULONG32*left,INTchoice)
INT32number=0,j=0;
ULONG32*right=&
left[1];
ULONG32tmp=0;
ULONG32tmpbuf[2]={0};
/*第一次调整wz_pc1[64]*/
for(j=0;
64;
j++)
if(j<
32)
if(wz_pc1[j]>
32)/*属于right*/
if(*right&
wz_pc2[wz_pc1[j]-1])
tmpbuf[0]|=wz_pc2[j];
else
if(*left&
tmpbuf[1]|=wz_pc2[j];
*left=tmpbuf[0];
*right=tmpbuf[1];
tmpbuf[0]=0;
tmpbuf[1]=0;
switch(choice)
caseDESENCRY:
for(number=0;
number<
16;
number++)
makedata(left,right,(ULONG32)number);
break;
caseDESDECRY:
for(number=15;
number>
=0;
number--)
makedata(left,right,(ULONG32)number);
default:
/*最后一轮操作不交换左右值*/
tmp=*left;
*left=*right;
*right=tmp;
/*最后一次调整wz_pc4[64]*/
if(wz_pc4[j]>
wz_pc2[wz_pc4[j]-1])
INT32makedata(ULONG32*left,ULONG32*right,ULONG32number)
INT32j;
ULONG32oldright=*right;
BYTErexpbuf[8]={0};
ULONG32datatmp=0;
ULONG32exp[2]={0};
//由32扩充至48位
48;
/*两个32位,每个存放24位*/
if(j<
24)
wz_pc2[exptab3[j]-1])
exp[0]|=wz_pc2[j];
exp[1]|=wz_pc2[j-24];
2;
{
exp[j]^=g_outkey[number][j];
}
/*由48->
32*/
exp[1]>
>
=8;
rexpbuf[7]=(BYTE)(exp[1]&
0x0000003fL);
=6;
rexpbuf[6]=(BYTE)(exp[1]&
rexpbuf[5]=(BYTE)(exp[1]&
rexpbuf[4]=(BYTE)(exp[1]&
exp[0]>
rexpbuf[3]=(BYTE)(exp[0]&
rexpbuf[2]=(BYTE)(exp[0]&
rexpbuf[1]=(BYTE)(exp[0]&
rexpbuf[0]