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

📄 mac.c

📁 基于GPRS无线网络和IP协议的数据传输系统 通信模块C51单片机程序
💻 C
字号:
/*******************************************************************************
*	(des & 3des) 加脱密 & MAC X9.8 程序				       *
*	编程人员: 齐传兵						       *
*******************************************************************************/

/*******************************************************************************
* void des(int flag, unsigned char *text ,unsigned char *key ,unsigned char *result);  *
* flag==1 is encrypte, 0 is decrypte					   *
* text, key, result: 64 bits buffer					   *
********************************************************************************

********************************************************************************
* void des3(int flag, unsigned char *text, unsigned char *key, unsigned char *result); *
* flag==1 is encrypte, 0 is decrypte					   *
* text, result: 64 bits buffer						   *
* key: 128 bits buffer							   *
********************************************************************************

********************************************************************************
* void mac(unsigned int macdatalength, unsigned char *text, unsigned char *key, unsigned char *result ); *
* macdatalength : bytes of text						 *
* key: 64 bits buffer							 *
* text: n bits buffer							 *
* result : 64s bit buffer						 *
*******************************************************************************/


 unsigned char code pc_1[56]={
			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,
			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};

 unsigned char code  pc_2[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};

 unsigned char code shift[16]={1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};

 unsigned char code ip_tab[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};

 unsigned char code ip_1_tab[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};

 unsigned char code  e3248[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};

 unsigned char code p_tab[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};

 unsigned char code  sbox[8][64]={
			{14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
			  0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
			  4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
			 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13},
			{15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
			  3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
			  0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
			 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9},
			{10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
			 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
			 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
			  1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12},
			{ 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
			 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
			 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
			  3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14},
			{ 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
			 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
			  4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
			 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3},
			{12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
			 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
			  9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
			  4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13},
			{ 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
			 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
			  1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
			  6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12},
			{13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
			  1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
			  7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
			  2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11}};

 unsigned char code table[64]={
					0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,
					0,1,0,0,0,1,0,1,0,1,1,0,0,1,1,1,
					1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,
					1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1};

 unsigned char code qcb[64]={
					 0, 16,  1, 17,  2, 18,  3, 19, 
					 4, 20,  5, 21,  6, 22,  7, 23, 
					 8, 24,  9, 25, 10, 26, 11, 27, 
					12, 28, 13, 29, 14, 30, 15, 31, 
					32, 48, 33, 49, 34, 50, 35, 51, 
					36, 52, 37, 53, 38, 54, 39, 55, 
					40, 56, 41, 57, 42, 58, 43, 59,
					44, 60, 45, 61, 46, 62, 47, 63};



void des(int flag, unsigned char *text ,unsigned char *key ,unsigned char *result)
{
//flag==1 is encrypte, 0 is decrypte

	int  xdata i,j,k;
	unsigned char xdata *p,*q;
	unsigned char  xdata ch1,ch2;

	unsigned char xdata  text64[64],key64[64],key56[56],c0[28],d0[28],keypc11[56],key48[16][48];

	unsigned char xdata iptext[64],l0[32],r0[32],temp[32],sboxinput[48];

	unsigned char xdata boxout[32], entext[64],tempresult[64];

	int xdata box[8];

	 p=text64;

	 for(i=0;i<8;i++)
	 {
		 for(k=0;k<8;k++)
			 if(*(text+i)&(1<<(7-k)))
				 *p++=1;
			 else
				 *p++=0;

	 }


	 p=key64;

	 for(i=0;i<8;i++)
	 {
		 for(k=0;k<8;k++)
			 if(*(key+i)&(1<<(7-k)))
				 *p++=1;
			 else
				 *p++=0;

	 }

	for (i=0;i<56;i++)
		key56[i]=key64[pc_1[i]-1];

	for (i=0;i<28;i++)
	{
		c0[i]=key56[i];
		d0[i]=key56[i+28];
	}

	
	for (k=0;k<16;k++)
	 {
		for(i=0;i<shift[k];i++)
		{
			ch1=c0[0];
			ch2=d0[0];
			for(j=0;j<27;j++)
			{
				c0[j]=c0[j+1];
				d0[j]=d0[j+1];
			}
			c0[27]=ch1;
			d0[27]=ch2;

		}

		 for(i=0,p=c0,q=keypc11;i<28;i++)
			 *q++=*p++;

		 for(i=0,p=d0;i<28;i++)
		 	 *q++=*p++;		 
		 
		 for (i=0;i<48;i++)
		 {
			 if(flag==1)
				key48[k][i]=keypc11[pc_2[i]-1];
			 else
				key48[15-k][i]=keypc11[pc_2[i]-1];  
		 }
	 }

	for (i=0;i<64;i++)
		iptext[i]=text64[ip_tab[i]-1];

	for (i=0;i<32;i++)
	{
		l0[i]=iptext[i];
		r0[i]=iptext[i+32];
	}

	for (k=0;k<16;k++)
	 {
		for (i=0;i<48;i++)
			 sboxinput[i]=key48[k][i]^r0[e3248[i]-1];

		box[0]=(sboxinput[ 0]<<5)+(sboxinput[ 1]<<4)+(sboxinput[ 2]<<3)+(sboxinput[ 3]<<2)+(sboxinput[ 4]<<1)+sboxinput[5];
		box[1]=(sboxinput[ 6]<<5)+(sboxinput[ 7]<<4)+(sboxinput[ 8]<<3)+(sboxinput[ 9]<<2)+(sboxinput[10]<<1)+sboxinput[11];
		box[2]=(sboxinput[12]<<5)+(sboxinput[13]<<4)+(sboxinput[14]<<3)+(sboxinput[15]<<2)+(sboxinput[16]<<1)+sboxinput[17];
		box[3]=(sboxinput[18]<<5)+(sboxinput[19]<<4)+(sboxinput[20]<<3)+(sboxinput[21]<<2)+(sboxinput[22]<<1)+sboxinput[23];
		box[4]=(sboxinput[24]<<5)+(sboxinput[25]<<4)+(sboxinput[26]<<3)+(sboxinput[27]<<2)+(sboxinput[28]<<1)+sboxinput[29];
		box[5]=(sboxinput[30]<<5)+(sboxinput[31]<<4)+(sboxinput[32]<<3)+(sboxinput[33]<<2)+(sboxinput[34]<<1)+sboxinput[35];
		box[6]=(sboxinput[36]<<5)+(sboxinput[37]<<4)+(sboxinput[38]<<3)+(sboxinput[39]<<2)+(sboxinput[40]<<1)+sboxinput[41];
		box[7]=(sboxinput[42]<<5)+(sboxinput[43]<<4)+(sboxinput[44]<<3)+(sboxinput[45]<<2)+(sboxinput[46]<<1)+sboxinput[47];

		p=boxout;
		for (i=0;i<8;i++)
		 {
			q=&table[sbox[i][qcb[box[i]]]<<2];

			 *p++=*q++;
			 *p++=*q++;
			 *p++=*q++;
			 *p++=*q++;
		  }


		for (i=0;i<32;i++)
		{
			temp[i]=r0[i];
			r0[i]=boxout[p_tab[i]-1]^l0[i];
			l0[i]=temp[i];
			l0[i]=temp[i];
		}

	}

	p=entext;
	for(i=0;i<32;i++)
		*p++=r0[i];
	for(i=0;i<32;i++)
		*p++=l0[i];

	for (i=0;i<64;i++)
		tempresult[i]=entext[ip_1_tab[i]-1];

	p=tempresult;

	for(i=0;i<8;i++)
	{
		*(result+i)=0;
		for(j=0;j<7;j++)
			*(result+i)=(*(result+i)|*p++)<<1;
		*(result+i)=*(result+i)|*p++;
	}

}

des3(int flag, unsigned char *text, unsigned char *key, unsigned char *result)
{
//flag==1 is encrypte, 0 is decrypte
	des(flag, text, key, result);
	des(flag^1, result, key+8, result);
	des(flag, result, key, result);

}


void mac(unsigned int macdatalength, unsigned char *text, unsigned char *key, unsigned char *result )
{

	unsigned char xdata Data[8];
	unsigned char xdata mac[8]={0,0,0,0,0,0,0,0};

	int xdata i;
	unsigned int xdata len;


	if(macdatalength==0)
	{
		des(1, mac, key, result);   //用于产生密钥校验值
		return;
	}


	len=0;

	while(len<macdatalength)
	{
		for(i=0;i<8;i++)
			Data[i]=0;

		for(i=0;(i<8)&&(len<macdatalength);i++,len++)
			Data[i]=(*text++);

		for(i=0;i<8;i++)
			Data[i]^=mac[i];

		des(1, Data, key, mac);
	}

	for(i=0;i<8;i++)
		*(result+i)=mac[i];

	return;

}

// for example

/*{
	unsigned char key1[8]={0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};//{1,2,3,4,5,6,7,8};
	unsigned char key2[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
	unsigned char text[8]={2,3,4,5,6,7,8,9};
	unsigned char result[8];
	unsigned char data[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};//"0123456789ABCDEF0123456789ABCDE";

	unsigned char i;

	des(1,text,key1,result);
	des(0,result,key1,text);

//	des3(1,text,key2,result);
//	des3(0,text,key2,result);
//	mac(strlen(data), data, key1, result);
    mac(10, data, key1, result);
	for(i=0;i<8;i++) printf("%d  ",result[i]);
}*/


⌨️ 快捷键说明

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