详解DES加密算法在单片机中的实现源码.docx

上传人:b****5 文档编号:28814980 上传时间:2023-07-19 格式:DOCX 页数:28 大小:20.08KB
下载 相关 举报
详解DES加密算法在单片机中的实现源码.docx_第1页
第1页 / 共28页
详解DES加密算法在单片机中的实现源码.docx_第2页
第2页 / 共28页
详解DES加密算法在单片机中的实现源码.docx_第3页
第3页 / 共28页
详解DES加密算法在单片机中的实现源码.docx_第4页
第4页 / 共28页
详解DES加密算法在单片机中的实现源码.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

详解DES加密算法在单片机中的实现源码.docx

《详解DES加密算法在单片机中的实现源码.docx》由会员分享,可在线阅读,更多相关《详解DES加密算法在单片机中的实现源码.docx(28页珍藏版)》请在冰豆网上搜索。

详解DES加密算法在单片机中的实现源码.docx

详解DES加密算法在单片机中的实现源码

/*D3DES(V5.09)-

*

*Aportable,publicdomain,versionoftheDataEncryptionStandard.

*

*WrittenwithSymantec'sTHINK(Lightspeed)CbyRichardOuterbridge.*Thanksto:

DanHoeyforhisexcellentInitialandInversepermutation

*code;JimGillogly&PhilKarnfortheDESkeyschedulecode;Dennis*Ferguson,EricYoungandDanaHowforcomparingnotes;andRayLau,*forhumouringmeon.

*

*Copyright(c)1988,1989,1990,1991,1992byRichardOuterbridge.

*(GEnie:

OUTER;CIS:

[71755,204])GravenImagery,1992.

*/

#include"d3des.h"

staticvoidscrunch(unsignedchar*,unsignedlong*);

staticvoidunscrun(unsignedlong*,unsignedchar*);

staticvoiddesfunc(unsignedlong*,unsignedlong*);

staticvoidcookey(unsignedlong*);

staticunsignedlongKnL[32]={0L};

staticunsignedlongKnR[32]={0L};

staticunsignedlongKn3[32]={0L};

staticunsignedcharDf_Key[24]={

0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,

0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,

0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67};

staticunsignedshortbytebit[8]={

0200,0100,040,020,010,04,02,01};

staticunsignedlongbigbyte[24]={

0x800000L,0x400000L,0x200000L,0x100000L,

0x80000L,0x40000L,0x20000L,0x10000L,

0x8000L,0x4000L,0x2000L,0x1000L,

0x800L,0x400L,0x200L,0x100L,

0x80L,0x40L,0x20L,0x10L,

0x8L,0x4L,0x2L,0x1L};

/*UsethekeyschedulespecifiedintheStandard(ANSIX3.92-1981).*/

staticunsignedcharpc1[56]={

56,48,40,32,24,16,8,0,57,49,41,33,25,17,

9,1,58,50,42,34,26,18,10,2,59,51,43,35,

62,54,46,38,30,22,14,6,61,53,45,37,29,21,

13,5,60,52,44,36,28,20,12,4,27,19,11,3};

staticunsignedchartotrot[16]={

1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28};

staticunsignedcharpc2[48]={

13,16,10,23,0,4,2,27,14,5,20,9,

22,18,11,3,25,7,15,6,26,19,12,1,

40,51,30,36,46,54,29,39,50,44,32,47,

43,48,38,55,33,52,45,41,49,35,28,31};

voiddeskey(key,edf)/*ThankstoJamesGillogly&PhilKarn!

*/unsignedchar*key;

shortedf;

{

registerinti,j,l,m,n;

unsignedcharpc1m[56],pcr[56];

unsignedlongkn[32];

for(j=0;j<56;j++){

l=pc1[j];

m=l&07;

pc1m[j]=(key[l>>3]&bytebit[m])?

1:

0;

}

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

if(edf==DE1)m=(15-i)<<1;

elsem=i<<1;

n=m+1;

kn[m]=kn[n]=0L;

for(j=0;j<28;j++){

l=j+totrot[i];

if(l<28)pcr[j]=pc1m[l];

elsepcr[j]=pc1m[l-28];

}

for(j=28;j<56;j++){

l=j+totrot[i];

if(l<56)pcr[j]=pc1m[l];

elsepcr[j]=pc1m[l-28];

}

for(j=0;j<24;j++){

if(pcr[pc2[j]])kn[m]|=bigbyte[j];

if(pcr[pc2[j+24]])kn[n]|=bigbyte[j];

}

}

cookey(kn);

return;

}

staticvoidcookey(raw1)

registerunsignedlong*raw1;

{

registerunsignedlong*cook,*raw0;

unsignedlongdough[32];

registerinti;

cook=dough;

for(i=0;i<16;i++,raw1++){

raw0=raw1++;

*cook=(*raw0&0x00fc0000L)<<6;

*cook|=(*raw0&0x00000fc0L)<<10;

*cook|=(*raw1&0x00fc0000L)>>10;

*cook++|=(*raw1&0x00000fc0L)>>6;

*cook=(*raw0&0x0003f000L)<<12;

*cook|=(*raw0&0x0000003fL)<<16;

*cook|=(*raw1&0x0003f000L)>>4;

*cook++|=(*raw1&0x0000003fL);

}

usekey(dough);

return;

}

voidcpkey(into)

registerunsignedlong*into;

{

registerunsignedlong*from,*endp;

from=KnL,endp=&KnL[32];

while(from

return;

}

voidusekey(from)

registerunsignedlong*from;

{

registerunsignedlong*to,*endp;

to=KnL,endp=&KnL[32];

while(to

return;

}

voiddes(inblock,outblock)

unsignedchar*inblock,*outblock;

{

unsignedlongwork[2];

scrunch(inblock,work);

desfunc(work,KnL);

unscrun(work,outblock);

return;

}

staticvoidscrunch(outof,into)

registerunsignedchar*outof;

registerunsignedlong*into;

{

*into=(*outof++&0xffL)<<24;

*into|=(*outof++&0xffL)<<16;

*into|=(*outof++&0xffL)<<8;

*into++|=(*outof++&0xffL);

*into=(*outof++&0xffL)<<24;

*into|=(*outof++&0xffL)<<16;

*into|=(*outof++&0xffL)<<8;

*into|=(*outof&0xffL);

return;

}

staticvoidunscrun(outof,into)

registerunsignedlong*outof;

registerunsignedchar*into;

{

*into++=(*outof>>24)&0xffL;

*into++=(*outof>>16)&0xffL;

*into++=(*outof>>8)&0xffL;

*into++=*outof++&0xffL;

*into++=(*outof>>24)&0xffL;

*into++=(*outof>>16)&0xffL;

*into++=(*outof>>8)&0xffL;

*into=*outof&0xffL;

return;

}

staticunsignedlongSP1[64]={

0x01010400L,0x00000000L,0x00010000L,0x01010404L,

0x01010004L,0x00010404L,0x00000004L,0x00010000L,

0x00000400L,0x01010400L,0x01010404L,0x00000400L,

0x01000404L,0x01010004L,0x01000000L,0x00000004L,

0x00000404L,0x01000400L,0x01000400L,0x00010400L,

0x00010400L,0x01010000L,0x01010000L,0x01000404L,

0x00010004L,0x01000004L,0x01000004L,0x00010004L,

0x00000000L,0x00000404L,0x00010404L,0x01000000L,

0x00010000L,0x01010404L,0x00000004L,0x01010000L,

0x01010400L,0x01000000L,0x01000000L,0x00000400L,

0x01010004L,0x00010000L,0x00010400L,0x01000004L,

0x00000400L,0x00000004L,0x01000404L,0x00010404L,

0x01010404L,0x00010004L,0x01010000L,0x01000404L,

0x01000004L,0x00000404L,0x00010404L,0x01010400L,

0x00000404L,0x01000400L,0x01000400L,0x00000000L,

0x00010004L,0x00010400L,0x00000000L,0x01010004L};

staticunsignedlongSP2[64]={

0x80108020L,0x80008000L,0x00008000L,0x00108020L,

0x00100000L,0x00000020L,0x80100020L,0x80008020L,

0x80000020L,0x80108020L,0x80108000L,0x80000000L,

0x80008000L,0x00100000L,0x00000020L,0x80100020L,

0x00108000L,0x00100020L,0x80008020L,0x00000000L,

0x80000000L,0x00008000L,0x00108020L,0x80100000L,

0x00100020L,0x80000020L,0x00000000L,0x00108000L,

0x00008020L,0x80108000L,0x80100000L,0x00008020L,

0x00000000L,0x00108020L,0x80100020L,0x00100000L,

0x80008020L,0x80100000L,0x80108000L,0x00008000L,

0x80100000L,0x80008000L,0x00000020L,0x80108020L,

0x00108020L,0x00000020L,0x00008000L,0x80000000L,

0x00008020L,0x80108000L,0x00100000L,0x80000020L,

0x00100020L,0x80008020L,0x80000020L,0x00100020L,

0x00108000L,0x00000000L,0x80008000L,0x00008020L,

0x80000000L,0x80100020L,0x80108020L,0x00108000L};

staticunsignedlongSP3[64]={

0x00000208L,0x08020200L,0x00000000L,0x08020008L,

0x08000200L,0x00000000L,0x00020208L,0x08000200L,

0x00020008L,0x08000008L,0x08000008L,0x00020000L,

0x08020208L,0x00020008L,0x08020000L,0x00000208L,

0x08000000L,0x00000008L,0x08020200L,0x00000200L,

0x00020200L,0x08020000L,0x08020008L,0x00020208L,

0x08000208L,0x00020200L,0x00020000L,0x08000208L,

0x00000008L,0x08020208L,0x00000200L,0x08000000L,

0x08020200L,0x08000000L,0x00020008L,0x00000208L,

0x00020000L,0x08020200L,0x08000200L,0x00000000L,

0x00000200L,0x00020008L,0x08020208L,0x08000200L,

0x08000008L,0x00000200L,0x00000000L,0x08020008L,

0x08000208L,0x00020000L,0x08000000L,0x08020208L,

0x00000008L,0x00020208L,0x00020200L,0x08000008L,

0x08020000L,0x08000208L,0x00000208L,0x08020000L,

0x00020208L,0x00000008L,0x08020008L,0x00020200L};

staticunsignedlongSP4[64]={

0x00802001L,0x00002081L,0x00002081L,0x00000080L,

0x00802080L,0x00800081L,0x00800001L,0x00002001L,

0x00000000L,0x00802000L,0x00802000L,0x00802081L,

0x00000081L,0x00000000L,0x00800080L,0x00800001L,

0x00000001L,0x00002000L,0x00800000L,0x00802001L,

0x00000080L,0x00800000L,0x00002001L,0x00002080L,

0x00800081L,0x00000001L,0x00002080L,0x00800080L,

0x00002000L,0x00802080L,0x00802081L,0x00000081L,

0x00800080L,0x00800001L,0x00802000L,0x00802081L,

0x00000081L,0x00000000L,0x00000000L,0x00802000L,

0x00002080L,0x00800080L,0x00800081L,0x00000001L,

0x00802001L,0x00002081L,0x00002081L,0x00000080L,

0x00802081L,0x00000081L,0x00000001L,0x00002000L,

0x00800001L,0x00002001L,0x00802080L,0x00800081L,

0x00002001L,0x00002080L,0x00800000L,0x00802001L,

0x00000080L,0x00800000L,0x00002000L,0x00802080L};

staticunsignedlongSP5[64]={

0x00000100L,0x02080100L,0x02080000L,0x42000100L,

0x00080000L,0x00000100L,0x40000000L,0x02080000L,

0x40080100L,0x00080000L,0x02000100L,0x40080100L,

0x42000100L,0x42080000L,0x00080100L,0x40000000L,

0x02000000L,0x40080000L,0x40080000L,0x00000000L,

0x40000100L,0x42080100L,0x42080100L,0x02000100L,

0x42080000L,0x40000100L,0x00000000L,0x42000000L,

0x02080100L,0x02000000L,0x42000000L,0x00080100L,

0x00080000L,0x42000100L,0x00000100L,0x02000000L,

0x40000000L,0x02080000L,0x42000100L,0x40080100L,

0x02000100L,0x40000000L,0x42080000L,0x02080100L,

0x40080100L,0x00000100L,0x02000000L,0x42080000L,

0x42080100L,0x00080100L,0x42000000L,0x42080100L,

0x02080000L,0x00000000L,0x40080000L,0x42000000L,

0x00080100L,0x02000100L,0x40000100L,0x00080000L,

0x00000000L,0x40080000L,0x02080100L,0x40000100L};

staticunsignedlongSP6[64]={

0x20000010L,0x20400000L,0x00004000L,0x20404010L,

0x20400000L,0x00000010L,0x20404010L,0x00400000L,

0x20004000L,0x00404010L,0x00400000L,0x20000010L,

0x00400010L,0x20004000L,0x20000000L,0x00004010L,

0x00000000L,0x00400010L,0x20004010L,0x00004000L,

0x00404000L,0x20004010L,0x00000010L,0x20400010L,

0x20400010L,0x00000000L,0x00404010L,0x20404000L,

0x00004010L,0x00404000L,0x20404000L,0x20000000L,

0x20004000L,0x00000010L,0x20400010L,0x00404000L,

0x20404010L,0x00400000L,0x00004010L,0x20000010L,

0x00400000L,0x20004000L,0x20000000L,0x00004010L,

0x20000010L,0x20404010L,0x00404000L,0x20400000L,

0x00404010L,0x20404000L,

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

当前位置:首页 > 医药卫生 > 基础医学

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

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