信息安全技术DES加密算法.docx

上传人:b****6 文档编号:4650489 上传时间:2022-12-07 格式:DOCX 页数:18 大小:18.23KB
下载 相关 举报
信息安全技术DES加密算法.docx_第1页
第1页 / 共18页
信息安全技术DES加密算法.docx_第2页
第2页 / 共18页
信息安全技术DES加密算法.docx_第3页
第3页 / 共18页
信息安全技术DES加密算法.docx_第4页
第4页 / 共18页
信息安全技术DES加密算法.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

信息安全技术DES加密算法.docx

《信息安全技术DES加密算法.docx》由会员分享,可在线阅读,更多相关《信息安全技术DES加密算法.docx(18页珍藏版)》请在冰豆网上搜索。

信息安全技术DES加密算法.docx

信息安全技术DES加密算法

#ifndef_DES_H

#define_DES_H

#include

#defineSUCCESS0

#defineFAIL1

#defineDESENCRY0

#defineDESDECRY1

#ifdef__cplusplus

extern"C"

{

#endif

INT32des(BYTE*data,BYTE*key,INT32readlen);

INT32Ddes(BYTE*data,BYTE*key,INT32readlen);

INT32des3(BYTE*data,BYTE*key,ULONG32n,ULONG32readlen);

INT32Ddes3(BYTE*data,BYTE*key,ULONG32n,ULONG32readlen);

INT32DdesN(BYTE*data,BYTE**key,ULONG32n_key,ULONG32readlen);

INT32desN(BYTE*data,BYTE**key,ULONG32n_key,ULONG32readlen);

INT32handle_data(ULONG32*left,INTchoice);

INT32makedata(ULONG32*left,ULONG32*right,ULONG32number);

INT32makefirstkey(ULONG32*keyP);

INT32makekey(ULONG32*keyleft,ULONG32*keyright,ULONG32number);

#ifdef__cplusplus

};

#endif

#endif

第二个文件main.c

#include

#include"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);

printf("Pleaseinputakey:

\n");

gets(key);

printf("Originaldata:

%s\n",data);

des(data,key,len);

printf("Encrypteddata:

");

for(i=0;i

printf("%02X",data[i]);

printf("\n");

Ddes(data,key,len);

printf("Decrypteddata:

%s\n",data);

printf("\nPressEntertoexit...\n");

getchar();

return0;

system("PAUSE");

}

第三个文件des.c

/*DES加密解密函数库

*

*本算法根据以下文章内容整理:

*DES算法的介绍和实现(上)

*DES算法的介绍和实现(下)

*

*EricWei,2007-4-5

*/

#include"des.h"

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,

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,

};

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;i

{

des(data,key[i],readlen);

}

returnSUCCESS;

}

INT32des3(BYTE*data,BYTE*key,ULONG32n,ULONG32readlen)

{

ULONG32i=0,j=0;

makefirstkey((ULONG32*)key);/*产生密钥*/

for(i=0;i

{

for(j=0;j

{

handle_data((ULONG32*)&data[j],DESENCRY);

}

}

returnSUCCESS;

}

INT32Ddes3(BYTE*data,BYTE*key,ULONG32n,ULONG32readlen)

{

ULONG32i=0,j=0;

makefirstkey((ULONG32*)key);/*产生密钥*/

for(i=0;i

{

for(j=0;j

{

handle_data((ULONG32*)&data[j],DESDECRY);

}

}

returnSUCCESS;

}

INT32des(BYTE*data,BYTE*key,INT32readlen)

{

INT32i=0;

makefirstkey((ULONG32*)key);/*产生密钥*/

for(i=0;i

{

handle_data((ULONG32*)&data[i],DESENCRY);

}

returnSUCCESS;

}

INT32Ddes(BYTE*data,BYTE*key,INT32readlen)

{

INT32i=0;

makefirstkey((ULONG32*)key);

for(i=0;i

{

handle_data((ULONG32*)&data[i],DESDECRY);

}

returnSUCCESS;

}

INT32handle_data(ULONG32*left,INTchoice)

{

INT32number=0,j=0;

ULONG32*right=&left[1];

ULONG32tmp=0;

ULONG32tmpbuf[2]={0};

/*第一次调整wz_pc1[64]*/

for(j=0;j<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&wz_pc2[wz_pc1[j]-1])

{

tmpbuf[0]|=wz_pc2[j];

}

}

}

else

{

if(wz_pc1[j]>32)/*属于right*/

{

if(*right&wz_pc2[wz_pc1[j]-1])

{

tmpbuf[1]|=wz_pc2[j];

}

}

else

{

if(*left&wz_pc2[wz_pc1[j]-1])

{

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);

}

break;

default:

break;

}

/*最后一轮操作不交换左右值*/

tmp=*left;

*left=*right;

*right=tmp;

/*最后一次调整wz_pc4[64]*/

for(j=0;j<64;j++)

{

if(j<32)

{

if(wz_pc4[j]>32)/*属于right*/

{

if(*right&wz_pc2[wz_pc4[j]-1])

{

tmpbuf[0]|=wz_pc2[j];

}

}

else

{

if(*left&wz_pc2[wz_pc4[j]-1])

{

tmpbuf[0]|=wz_pc2[j];

}

}

}

else

{

if(wz_pc4[j]>32)/*属于right*/

{

if(*right&wz_pc2[wz_pc4[j]-1])

{

tmpbuf[1]|=wz_pc2[j];

}

}

else

{

if(*left&wz_pc2[wz_pc4[j]-1])

{

tmpbuf[1]|=wz_pc2[j];

}

}

}

}

*left=tmpbuf[0];

*right=tmpbuf[1];

returnSUCCESS;

}

INT32makedata(ULONG32*left,ULONG32*right,ULONG32number)

{

INT32j;

ULONG32oldright=*right;

BYTErexpbuf[8]={0};

ULONG32datatmp=0;

ULONG32exp[2]={0};

//由32扩充至48位

for(j=0;j<48;j++)

{

/*两个32位,每个存放24位*/

if(j<24)

{

if(*right&wz_pc2[exptab3[j]-1])

{

exp[0]|=wz_pc2[j];

}

}

else

{

if(*right&wz_pc2[exptab3[j]-1])

{

exp[1]|=wz_pc2[j-24];

}

}

}

for(j=0;j<2;j++)

{

exp[j]^=g_outkey[number][j];

}

/*由48->32*/

exp[1]>>=8;

rexpbuf[7]=(BYTE)(exp[1]&0x0000003fL);

exp[1]>>=6;

rexpbuf[6]=(BYTE)(exp[1]&0x0000003fL);

exp[1]>>=6;

rexpbuf[5]=(BYTE)(exp[1]&0x0000003fL);

exp[1]>>=6;

rexpbuf[4]=(BYTE)(exp[1]&0x0000003fL);

exp[0]>>=8;

rexpbuf[3]=(BYTE)(exp[0]&0x0000003fL);

exp[0]>>=6;

rexpbuf[2]=(BYTE)(exp[0]&0x0000003fL);

exp[0]>>=6;

rexpbuf[1]=(BYTE)(exp[0]&0x0000003fL);

exp[0]>>=6;

rexpbuf[0]

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1