详解DES加密算法在单片机中的实现源码.docx
- 文档编号:28814980
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:28
- 大小:20.08KB
详解DES加密算法在单片机中的实现源码.docx
《详解DES加密算法在单片机中的实现源码.docx》由会员分享,可在线阅读,更多相关《详解DES加密算法在单片机中的实现源码.docx(28页珍藏版)》请在冰豆网上搜索。
详解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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详解 DES 加密算法 单片机 中的 实现 源码