⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 desoper.c

📁 在51单片机中实现des算法
💻 C
📖 第 1 页 / 共 2 页
字号:
	DesOutBit42=DesInBit27;DesOutBit43=DesInBit30;\
	DesOutBit44=DesInBit27;DesOutBit45=DesInBit30;\
	DesOutBit46=DesInBit31;DesOutBit47=DesInBit32;\
	DesOutBit50=DesInBit33;DesOutBit51=DesInBit34;\
	DesOutBit52=DesInBit33;DesOutBit53=DesInBit34;\
	DesOutBit54=DesInBit35;DesOutBit55=DesInBit36;\
	DesOutBit56=DesInBit37;DesOutBit57=DesInBit00;\
}
/*---*/
#define DesDatBitSwap() {\
\
	DesOutBit02=DesInBit00;DesOutBit03=DesInBit05;\
	DesOutBit04=DesInBit01;DesOutBit05=DesInBit02;\
	DesOutBit06=DesInBit03;DesOutBit07=DesInBit04;\
\
	DesOutBit12=DesInBit06;DesOutBit13=DesInBit13;\
	DesOutBit14=DesInBit07;DesOutBit15=DesInBit10;\
	DesOutBit16=DesInBit11;DesOutBit17=DesInBit12;\
\
	DesOutBit22=DesInBit14;DesOutBit23=DesInBit21;\
	DesOutBit24=DesInBit15;DesOutBit25=DesInBit16;\
	DesOutBit26=DesInBit17;DesOutBit27=DesInBit20;\
\
	DesOutBit32=DesInBit22;DesOutBit33=DesInBit27;\
	DesOutBit34=DesInBit23;DesOutBit35=DesInBit24;\
	DesOutBit36=DesInBit25;DesOutBit37=DesInBit26;\
\
	DesOutBit42=DesInBit30;DesOutBit43=DesInBit35;\
	DesOutBit44=DesInBit31;DesOutBit45=DesInBit32;\
	DesOutBit46=DesInBit33;DesOutBit47=DesInBit34;\
\
	DesOutBit52=DesInBit36;DesOutBit53=DesInBit43;\
	DesOutBit54=DesInBit37;DesOutBit55=DesInBit40;\
	DesOutBit56=DesInBit41;DesOutBit57=DesInBit42;\
\
	DesOutBit62=DesInBit44;DesOutBit63=DesInBit51;\
	DesOutBit64=DesInBit45;DesOutBit65=DesInBit46;\
	DesOutBit66=DesInBit47;DesOutBit67=DesInBit50;\
\
	DesOutBit72=DesInBit52;DesOutBit73=DesInBit57;\
	DesOutBit74=DesInBit53;DesOutBit75=DesInBit54;\
	DesOutBit76=DesInBit55;DesOutBit77=DesInBit56;\
}
/*{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};*/
/*1-8	9-16	17-24	25-32*/
#define DesDat32To32() {\
	DesOutBit00=DesInBit17;DesOutBit01=DesInBit06;\
	DesOutBit02=DesInBit23;DesOutBit03=DesInBit24;\
	DesOutBit04=DesInBit34;DesOutBit05=DesInBit13;\
	DesOutBit06=DesInBit33;DesOutBit07=DesInBit20;\
	DesOutBit10=DesInBit00;DesOutBit11=DesInBit16;\
	DesOutBit12=DesInBit26;DesOutBit13=DesInBit31;\
	DesOutBit14=DesInBit04;DesOutBit15=DesInBit21;\
	DesOutBit16=DesInBit36;DesOutBit17=DesInBit11;\
	DesOutBit20=DesInBit01;DesOutBit21=DesInBit07;\
	DesOutBit22=DesInBit27;DesOutBit23=DesInBit15;\
	DesOutBit24=DesInBit37;DesOutBit25=DesInBit32;\
	DesOutBit26=DesInBit02;DesOutBit27=DesInBit10;\
	DesOutBit30=DesInBit22;DesOutBit31=DesInBit14;\
	DesOutBit32=DesInBit35;DesOutBit33=DesInBit05;\
	DesOutBit34=DesInBit25;DesOutBit35=DesInBit12;\
	DesOutBit36=DesInBit03;DesOutBit37=DesInBit30;\
}
/************************************************************/
void DesKeyGroup(unsigned char *pDesKeyIn,unsigned char *pDesKeyOut){
	unsigned char i,j,k;
	unsigned long t1,t2;
	
	for(i=0;i<8;i++)
		DesChangeAreaIn[i]=*(pDesKeyIn+i);

	DesKey64To56();/*L 4 bytes=28bits//R 4 bytes=28bit//右对齐*/

	DesChangeAreaOut[0]&=0xf;t1=DesChangeAreaOut[0];
	t1<<=8;t1+=DesChangeAreaOut[1];
	t1<<=8;t1+=DesChangeAreaOut[2];
	t1<<=8;t1+=DesChangeAreaOut[3];

	DesChangeAreaOut[4]&=0xf;t2=DesChangeAreaOut[4];
	t2<<=8;t2+=DesChangeAreaOut[5];
	t2<<=8;t2+=DesChangeAreaOut[6];
	t2<<=8;t2+=DesChangeAreaOut[7];

	for(i=0;i<16;i++){
		
		for(j=0;j<DesKeyMoveBit[i];j++){/*循环左移位数*/
			t1<<=1;
			if(t1&0x10000000)
				t1++;
			t2<<=1;
			if(t2&0x10000000)
				t2++;			
		}
		
		DesChangeAreaIn[0]=(unsigned char)(t1>>24);
		DesChangeAreaIn[1]=(unsigned char)(t1>>16);
		DesChangeAreaIn[2]=(unsigned char)(t1>>8);
		DesChangeAreaIn[3]=(unsigned char)t1;
		DesChangeAreaIn[4]=(unsigned char)(t2>>24);
		DesChangeAreaIn[5]=(unsigned char)(t2>>16);
		DesChangeAreaIn[6]=(unsigned char)(t2>>8);
		DesChangeAreaIn[7]=(unsigned char)t2;

		DesKey56To48();/*L 6 bytes*/

		for(k=0;k<6;k++)
			*(pDesKeyOut+i*6+k)=DesChangeAreaOut[k];
	}
}
/************************************************************/
void DesDatReplace(unsigned char *pReplaceDat,unsigned char *pReturnDat){
	unsigned char replaceDat[8];
	unsigned char i;

	for(i=0;i<6;i++) DesChangeAreaIn[i]=*(pReplaceDat+i);
	/*6bits * 8*/
	DesDatBitSwap();
	for(i=0;i<8;i++){
		replaceDat[i]=DesChangeAreaOut[i];
		replaceDat[i]&=0x3f;
	}
	/*6bits--->4bits*/
	replaceDat[0]=DesReplaceT1[replaceDat[0]>>4][replaceDat[0]&0xf];
	replaceDat[1]=DesReplaceT2[replaceDat[1]>>4][replaceDat[1]&0xf];
	replaceDat[2]=DesReplaceT3[replaceDat[2]>>4][replaceDat[2]&0xf];
	replaceDat[3]=DesReplaceT4[replaceDat[3]>>4][replaceDat[3]&0xf];
	replaceDat[4]=DesReplaceT5[replaceDat[4]>>4][replaceDat[4]&0xf];
	replaceDat[5]=DesReplaceT6[replaceDat[5]>>4][replaceDat[5]&0xf];
	replaceDat[6]=DesReplaceT7[replaceDat[6]>>4][replaceDat[6]&0xf];
	replaceDat[7]=DesReplaceT8[replaceDat[7]>>4][replaceDat[7]&0xf];
	/*4 bytes*/
	replaceDat[0]=(replaceDat[0]<<4)+replaceDat[1];
	replaceDat[1]=(replaceDat[2]<<4)+replaceDat[3];
	replaceDat[2]=(replaceDat[4]<<4)+replaceDat[5];
	replaceDat[3]=(replaceDat[6]<<4)+replaceDat[7];
	
	for(i=0;i<4;i++) DesChangeAreaIn[i]=replaceDat[i];

	DesDat32To32();

	for(i=0;i<4;i++) *(pReturnDat+i)=DesChangeAreaOut[i];
}
/************************************************************/
void DesExeEncrypt(unsigned char *pDesDatIn,unsigned char *pDesKey,unsigned char *pDesDatOut){
	unsigned char pdata desNewKey[16][6];
	unsigned char i,t;
	unsigned char desDatL[4],desDatR[4];
	unsigned char desDatLn[4],desDatRn[4];
	unsigned char desDatTmp[6];

	DesKeyGroup(pDesKey,&desNewKey[0][0]);

	for(i=0;i<8;i++)
		DesChangeAreaIn[i]=*(pDesDatIn+i);

	DesDat64IP();/*初始置换*/

	for(i=0;i<4;i++)/*左半部分*/
		desDatL[i]=DesChangeAreaOut[i];
	for(i=0;i<4;i++)/*右半部分*/
		desDatR[i]=DesChangeAreaOut[4+i];

	/////
	for(i=0;i<16;i++){
		for(t=0;t<4;t++){
			desDatLn[t]=desDatR[t];
			DesChangeAreaIn[t]=desDatR[t];
		}
		/*32-->48 bits*/
		DesDat32To48();
		for(t=0;t<6;t++) desDatTmp[t]=DesChangeAreaOut[t];
		/*xor Key*/
		for(t=0;t<6;t++){
			/*加密*/desDatTmp[t]^=desNewKey[i][t];
		}
		/*replace 48-->32 bits*/
		DesDatReplace(desDatTmp,desDatR);
		
		for(t=0;t<4;t++){
			desDatRn[t]=desDatR[t]^desDatL[t];
		}
		/*ready for next*/
		for(t=0;t<4;t++){
			desDatR[t]=desDatRn[t];
			desDatL[t]=desDatLn[t];
		}
	}
	/////
	for(i=0;i<4;i++) DesChangeAreaIn[i]=desDatR[i];
	for(i=0;i<4;i++) DesChangeAreaIn[4+i]=desDatL[i];

	DesDat64IP_R();/*重新换位*/

	for(i=0;i<8;i++)
		*(pDesDatOut+i)=DesChangeAreaOut[i];
}
void DesExeDecrypt(unsigned char *pDesDatIn,unsigned char *pDesKey,unsigned char *pDesDatOut){
	unsigned char pdata desNewKey[16][6];
	unsigned char i,t;
	unsigned char desDatL[4],desDatR[4];
	unsigned char desDatLn[4],desDatRn[4];
	unsigned char desDatTmp[6];

	DesKeyGroup(pDesKey,&desNewKey[0][0]);

	for(i=0;i<8;i++)
		DesChangeAreaIn[i]=*(pDesDatIn+i);

	DesDat64IP();/*初始置换*/

	for(i=0;i<4;i++)/*左半部分*/
		desDatL[i]=DesChangeAreaOut[i];
	for(i=0;i<4;i++)/*右半部分*/
		desDatR[i]=DesChangeAreaOut[4+i];

	/////
	for(i=0;i<16;i++){
		for(t=0;t<4;t++){
			desDatLn[t]=desDatR[t];
			DesChangeAreaIn[t]=desDatR[t];
		}
		/*32-->48 bits*/
		DesDat32To48();
		for(t=0;t<6;t++) desDatTmp[t]=DesChangeAreaOut[t];
		/*xor Key*/
		for(t=0;t<6;t++){
			/*解密*/desDatTmp[t]^=desNewKey[15-i][t];
		}
		/*replace 48-->32 bits*/
		DesDatReplace(desDatTmp,desDatR);
		
		for(t=0;t<4;t++){
			desDatRn[t]=desDatR[t]^desDatL[t];
		}
		/*ready for next*/
		for(t=0;t<4;t++){
			desDatR[t]=desDatRn[t];
			desDatL[t]=desDatLn[t];
		}
	}
	/////
	for(i=0;i<4;i++) DesChangeAreaIn[i]=desDatR[i];
	for(i=0;i<4;i++) DesChangeAreaIn[4+i]=desDatL[i];

	DesDat64IP_R();/*重新换位*/

	for(i=0;i<8;i++)
		*(pDesDatOut+i)=DesChangeAreaOut[i];
}
/************************************************************//************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -