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

📄 desimprovement2.cpp

📁 DES加密解密算法的C实现
💻 CPP
字号:


/*===========================================================================================================
								DES(Data Encryption Standard) Programming (C语言)

    Author: 			tsp语音芯片 

 	The openning date:	2006.12.02日 

 	The closing date:	2006.12.07日 
 	
 	Compiler:			microsoft visual c++ 6.0 
============================================================================================================*/

//**********************************************************************************************************//
//			                                 the Area of Header                                             //
//**********************************************************************************************************//
#include "stdio.h"
#include "defhead.h"

//**********************************************************************************************************//
//			                             the Definition of Constant                                         //
//**********************************************************************************************************//
/*initial permutation IP of the DATA*/
static ULONG8 DES_IP[] = 
{
	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
};

/*final permutation IP^-1 of the combined DATA and KEY*/
static ULONG8 IP_[] = 
{
	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
};

/*expansion operation matrix*/
static ULONG8 E[] = 
{
	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 
};

/* Initial Permutation of Key */
static ULONG8 PC1[] = 
{
	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
};

/* Table - Shift */
static ULONG8 shift[16] = 
{
	1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 
};

/* Initial Permutation of Key */
static ULONG8 PC2[] = 
{
	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
};

/*32-bit permutation function P used on the output of the S-boxes*/
static ULONG8 P32i[] = 
{
	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
};

/*The (in) famous s-boxes*/
static ULONG8 si[8][4][16] = 
{
	/* Table - s1 */	
		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, 
	
	/* Table - s2 */	
		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, 
	
	/* Table - s3 */	
		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, 
	
	/* Table - s4 */	
		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, 
	
	/* Table - s5 */	
		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, 
	
	/* Table - s6 */	
		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, 	

	/* Table - s7 */	
		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, 	

	/* Table - s8 */	
		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 	
};

//**********************************************************************************************************//
//			                           the Definition of Globality                                          //
//**********************************************************************************************************//
ULONG8 	source_left_buf[32],	source_right_buf[32],	temp_buf[64];
ULONG8 	key_left_buf[28],	key_right_buf[28],	key_tmp[64],	key[48];
ULONG8	function_result[32];
ULONG8	DATAout[64];
	
//*********************************************************************************************************//
//			                            the Program of DES_Encode                                          //
//*********************************************************************************************************//
void DES_encode(ULONG8 *source, ULONG8 *inkey)
{
	ULONG8 	count,i,j,tmp1,tmp2;

	//begin/* Convert from 8-byte data into 64-bit data  */===================================================	
	for (i = 0; i < 8; i++) 
	{
		temp_buf[8*i] = ((j = *(source + i)) / 128) % 2;
		temp_buf[8*i+1] = (j / 64) % 2;
		temp_buf[8*i+2] = (j / 32) % 2;
		temp_buf[8*i+3] = (j / 16) % 2;
		temp_buf[8*i+4] = (j / 8) % 2;
		temp_buf[8*i+5] = (j / 4) % 2;
		temp_buf[8*i+6] = (j / 2) % 2;
		temp_buf[8*i+7] = j % 2;
	}
	//end/* Convert from 8-byte data into 64-bit data  */=====================================================

	/* Initial Permutation of Data */
	for (i=0; i<32; i++)
	{
		source_left_buf[i] = temp_buf[DES_IP[i]-1];
		source_right_buf[i] = temp_buf[DES_IP[i+32]-1];
	}

	//begin/* Convert from 8-byte data into 64-bit data  */===================================================		
	for (i = 0; i < 8; i++) 
	{
		temp_buf[8*i] = ((j = *(inkey + i)) / 128) % 2;
		temp_buf[8*i+1] = (j / 64) % 2;
		temp_buf[8*i+2] = (j / 32) % 2;
		temp_buf[8*i+3] = (j / 16) % 2;
		temp_buf[8*i+4] = (j / 8) % 2;
		temp_buf[8*i+5] = (j / 4) % 2;
		temp_buf[8*i+6] = (j / 2) % 2;
		temp_buf[8*i+7] = j % 2;
	}
	//end/* Convert from 8-byte data into 64-bit data  */=====================================================
	
	/* Initial Permutation of Key */
	for (i=0; i<28;	i++)
	{
		key_left_buf[i] = temp_buf[PC1[i]-1];
		key_right_buf[i] = temp_buf[PC1[i+28]-1];
	} 
		
	for(count=1; count<17; count++)
	{
		//key begin========================================================================================//
		for(j=0; j<shift[count-1]; j++)
		{
			tmp1  = key_left_buf[0];
			tmp2  = key_right_buf[0];			
			for (i=0; i<27; i++)	//循环左移
			{
				key_left_buf[i] = key_left_buf[i+1];
				key_right_buf[i] = key_right_buf[i+1];
			}
			key_left_buf[27] = tmp1;
			key_right_buf[27] = tmp2;						
		}
		
		for(i=0; i<28; i++)//combine the key_left and key_right together
		{
			temp_buf[i] = key_left_buf[i];
			temp_buf[i+28] = key_right_buf[i];			 			
		}
		
		for(i=0; i<48; i++)//pc2置换
		{
			key[i] = temp_buf[PC2[i]-1];
		}		
		//key end==========================================================================================//
		
		for(i=0; i<48; i++)//Permute-E convert 32bits source_right into 48bits 
		{
			temp_buf[i] =source_right_buf[E[i]-1];
		}
			
		/* temp_buf XOR key */
		for (i=0; i<48; i++)
		{
			temp_buf[i] = temp_buf[i] ^ key[i];
		}
			
		for (i=0; i<8; i++)
		{
			tmp1 = 	si[i]
					[temp_buf[i*6]*2+temp_buf[i*6+5]]
					[temp_buf[i*6+1]*8+temp_buf[i*6+2]*4+temp_buf[i*6+3]*2+temp_buf[i*6+4]];
							 
			temp_buf[i*4]=(j = tmp1/8)%2;
			temp_buf[i*4+1]=(j / 4)%2;
			temp_buf[i*4+2]=(j / 2)%2;
			temp_buf[i*4+3]=j % 2;
		}
			
		for (i=0; i<32; i++)
		{
			function_result[i] = temp_buf[P32i[i]-1] ^ source_left_buf[i];
			if(count <= 15)
			{
				source_left_buf[i] = source_right_buf[i];
				source_right_buf[i] = function_result[i];
			}
		}			
	}
	
	for(i=0; i<32; i++)
	{
		temp_buf[i] = function_result[i];
		temp_buf[i+32] = source_right_buf[i];
	}
	
	/* Inverse Initial Permutation */
	for(i=0; i<64; i++)
	{
		DATAout[i] = temp_buf[IP_[i]-1];
	}

	for(i=0; i<8; i++)
	{
		for(j=0; j<8; j++)
		{
			DATAout[i] = 2*DATAout[i] +  DATAout[i*8+j];
		}
	}		
}

//*********************************************************************************************************//
//			                            the Program of DES_Decode                                          //
//*********************************************************************************************************//
void DES_decode(ULONG8 *source, ULONG8 *inkey)
{	
	ULONG8 	count,i,j,tmp1,tmp2,tmp3;

	//begin/* Convert from 8-byte data into 64-bit data  */===================================================	
	for (i = 0; i < 8; i++) 
	{
		temp_buf[8*i] = ((j = *(source + i)) / 128) % 2;
		temp_buf[8*i+1] = (j / 64) % 2;
		temp_buf[8*i+2] = (j / 32) % 2;
		temp_buf[8*i+3] = (j / 16) % 2;
		temp_buf[8*i+4] = (j / 8) % 2;
		temp_buf[8*i+5] = (j / 4) % 2;
		temp_buf[8*i+6] = (j / 2) % 2;
		temp_buf[8*i+7] = j % 2;
	}
	//end/* Convert from 8-byte data into 64-bit data  */=====================================================

	/* Initial Permutation of Data */
	for (i=0; i<32; i++)
	{
		source_left_buf[i] = temp_buf[DES_IP[i]-1];
		source_right_buf[i] = temp_buf[DES_IP[i+32]-1];
	}

	//begin/* Convert from 8-byte data into 64-bit data  */===================================================		
	for (i = 0; i < 8; i++) 
	{
		key_tmp[8*i] = ((j = *(inkey + i)) / 128) % 2;
		key_tmp[8*i+1] = (j / 64) % 2;
		key_tmp[8*i+2] = (j / 32) % 2;
		key_tmp[8*i+3] = (j / 16) % 2;
		key_tmp[8*i+4] = (j / 8) % 2;
		key_tmp[8*i+5] = (j / 4) % 2;
		key_tmp[8*i+6] = (j / 2) % 2;
		key_tmp[8*i+7] = j % 2;
	}
	//end/* Convert from 8-byte data into 64-bit data  */=====================================================
			
	for(count=1; count<17; count++)
	{
		/* Initial Permutation of Key */
		for (i=0; i<28;	i++)
		{
			key_left_buf[i] = key_tmp[PC1[i]-1];
			key_right_buf[i] = key_tmp[PC1[i+28]-1];
		} 

		for(tmp3=0; tmp3<(17-count); tmp3++)
		{
			//key begin========================================================================================//
			for(j=0; j<shift[tmp3]; j++)
			{
				tmp1  = key_left_buf[0];
				tmp2  = key_right_buf[0];			
				for (i=0; i<27; i++)	//循环左移
				{
					key_left_buf[i] = key_left_buf[i+1];
					key_right_buf[i] = key_right_buf[i+1];
				}
				key_left_buf[27] = tmp1;//如果27改写成i+1将会出错!
				key_right_buf[27] = tmp2;						
			}
			
			for(i=0; i<28; i++)//combine the key_left and key_right together
			{
				temp_buf[i] = key_left_buf[i];
				temp_buf[i+28] = key_right_buf[i];			 			
			}
			
			for(i=0; i<48; i++)//pc2置换
			{
				key[i] = temp_buf[PC2[i]-1];
			}
			//key end==========================================================================================//
		}
		
		
		for(i=0; i<48; i++)//Permute-E convert 32bits source_right into 48bits 
		{
			temp_buf[i] =source_right_buf[E[i]-1];
		}
			
		/* temp_buf XOR key */
		for (i=0; i<48; i++)
		{
			temp_buf[i] = temp_buf[i] ^ key[i];
		}
			
		for (i=0; i<8; i++)
		{
			tmp3 = si[i]
						[temp_buf[i*6]*2+temp_buf[i*6+5]]
						[temp_buf[i*6+1]*8+temp_buf[i*6+2]*4+temp_buf[i*6+3]*2+temp_buf[i*6+4]];
							 
			temp_buf[i*4]=(j = tmp3/8)%2;
			temp_buf[i*4+1]=(j / 4)%2;
			temp_buf[i*4+2]=(j / 2)%2;
			temp_buf[i*4+3]=j % 2;
		}
			
		for (i = 0; i < 32; i++)
		{
			function_result[i] = temp_buf[P32i[i]-1] ^ source_left_buf[i];
			if(count <= 15)
			{
				source_left_buf[i] = source_right_buf[i];
				source_right_buf[i] = function_result[i];
			}
		}			
	}
	
	for(i=0; i<32; i++)
	{
		temp_buf[i] = function_result[i];
		temp_buf[i+32] = source_right_buf[i];
	}
	
	/* Inverse Initial Permutation */
	for(i=0; i<64; i++)
	{
		DATAout[i] = temp_buf[IP_[i]-1];
	}

	for(i=0; i<8; i++)
	{
		for(j=0; j<8; j++)
		{
			DATAout[i] = 2*DATAout[i] +  DATAout[i*8+j];
		}
	}		
}

//*********************************************************************************************************//
//			                                the Program of MAIN                                            //
//*********************************************************************************************************//
void main(void)
{
	ULONG16 i,j;
	ULONG8 *cp; 
	ULONG8 keyinput[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
	//ULONG8 plaintext[8] = {0x6e, 0x21, 0xe2, 0x66, 0xa2, 0x6a, 0x23, 0x52};
	ULONG8 plaintext[8] = {0x55, 0x55, 0x55, 0x21, 0x21, 0x21, 0x21, 0x55};

	cp=plaintext;

	printf("\nplaintext:\n");
	for(i=0; i<8; i++)
	{
		printf("0x%02x ",((ULONG16) cp[i])&0x00ff);
	}
	printf("\n");

	DES_encode(plaintext, keyinput);

	printf("\nDES Encode out:\n");

	for(i=0; i<8; i++)
	{
		printf("0x%02x ",((ULONG16) DATAout[i])&0x00ff);
	}	
	
	DES_decode(DATAout, keyinput);

	printf("\n");

	printf("\nDES Decode out:\n");

	for(i=0; i<64; i++)
	{
		if(i%8==0)
		{
			printf("0x%02x ",((ULONG16) DATAout[i/8])&0x00ff);
		}
	}

	for(j=0; j<4; j++)
	{
		printf("\n");
	}
}

⌨️ 快捷键说明

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