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

📄 des.c

📁 des加密解密原程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <string.h>

#include "des.h"

void Encode_Decode(UINT8 * pkey, UINT8 * pdata, UINT8 flag, UINT8 * psave, UINT32 len);

void Encode_Decode2(unsigned char *source,unsigned char * dest,unsigned char * inkey, int flg); 

void main(void)
{
	UINT8 * ptrkey, * ptrdata, * ptrsave;
	UINT32 Length,i;

	memset(inputdata,0,sizeof(inputdata));
	memset(outputdata,0,sizeof(outputdata));
	Length = sizeof(C_Data);
	memcpy(inputdata,C_Data,Length);
	Length = (Length % 8) ? (Length / 8 + 1) * 8 : Length;
	for(i=0;i<Length;i++)  printf("%02x ",inputdata[i]);
	printf("\n");printf("\n");

	ptrkey = (UINT8 *)C_Key;			//encode
	ptrdata = inputdata;
	ptrsave = outputdata;
	encode_decode = 1;
	Encode_Decode(ptrkey,ptrdata,encode_decode,ptrsave,Length);
//Encode_Decode2(ptrdata,ptrsave,ptrkey,encode_decode);
	for(i=0;i<Length;i++)  printf("%02x ",outputdata[i]);
	printf("\n");printf("\n");

	memset(inputdata,0,sizeof(inputdata));
	ptrkey = (UINT8 *)C_Key;			//decode
	ptrdata = outputdata;
	ptrsave = inputdata;
	encode_decode = 0;
	Encode_Decode(ptrkey,ptrdata,encode_decode,ptrsave,Length);
//Encode_Decode2(ptrdata,ptrsave,ptrkey,encode_decode);
	for(i=0;i<Length;i++)  printf("%02x ",inputdata[i]);
	printf("\n");printf("\n");
}

void Encode_Decode(UINT8 * pkey, UINT8 * pdata, UINT8 flag, UINT8 * psave, UINT32 len)
{
	UINT8 key1[64],key2[56],key3[16][48],i,j;
	UINT32 C[17],D[17];						//28 bits
	UINT32 L[17],R[17];						//32 bits
	UINT8 * ptrtmp;
	UINT32 k;
	UINT8 data1[64],R_tmp1[32],R_tmp2[48],B[8];
	
	memset(C,0,sizeof(C));
	memset(D,0,sizeof(D));
	ptrtmp = key1;
	for(i=0;i<8;i++)						//得到64位密钥
	{
		for(j=0;j<8;j++)
		{
			*ptrtmp++ = (pkey[i] >> (7-j)) & 0x01;
		}
	}
	for(i=0;i<56;i++)						//得到变化后的56位密钥和C[0],D[0]	
	{
		key2[i] = key1[key64_56[i]-1];	
		if(i < 28)
		{
			C[0] <<= 1;
			C[0] |= key2[i];
		}
		else
		{
			D[0] <<= 1;
			D[0] |= key2[i];
		}
	}
	for(i=1;i<=16;i++)						//计算出16个子密钥
	{
		C[i] = ((C[i-1] << rotate_left[i-1]) & 0x0fffffff) | (C[i-1] >> (28 - rotate_left[i-1]));
		D[i] = ((D[i-1] << rotate_left[i-1]) & 0x0fffffff) | (D[i-1] >> (28 - rotate_left[i-1]));
		for(j=0;j<56;j++)
		{
			if(j < 28)
			{
				key2[j] = (UINT8)((C[i] >> (27 - j)) & 0x01);
			}
			else
			{
				key2[j] = (UINT8)((D[i] >> (28 + 27 - j)) & 0x01);
			}
		}
		for(j=0;j<48;j++)
		{
			key3[i-1][j] = key2[key56_48[j]-1];
		}
	}
	
	//对64位数据块的处理
	k = 0;
	while(k < len)
	{
		memset(data1,0,sizeof(data1));
		ptrtmp = data1;
		for(i=0;i<8;i++)						//得到64位数据
		{
			for(j=0;j<8;j++)
			{
				*ptrtmp++ = (pdata[i] >> (7-j)) & 0x01;
			}
		}
		for(i=0;i<64;i++)						//得到变化后的64位数据和L[0],R[0]
		{
			UINT8 tempdata;
			tempdata = data1[data64_64[i]-1];	
			if(i < 32)
			{
				L[0] <<= 1;
				L[0] |= tempdata;
			}
			else
			{
				R[0] <<= 1;
				R[0] |= tempdata;
			}
		}
		
		for(i=1;i<=16;i++)						//用16个子密钥对数据加密
		{
			for(j=0;j<32;j++)
			{
				R_tmp1[j] = (UINT8)((R[i-1] >> (31-j)) & 0x01);
			}
			for(j=0;j<48;j++)
			{
				R_tmp2[j] = R_tmp1[extend32_48[j]-1]; //扩充到48位
				if(flag)
					R_tmp2[j] ^= key3[i-1][j];
				else
					R_tmp2[j] ^= key3[16-i][j];
			}
			memset(B,0,sizeof(B));
			for(j=0;j<8;j++)						//分成8个六位数
			{
				UINT8 m;
				for(m=0;m<6;m++)
				{
					B[j] <<= 1;
					B[j] |= R_tmp2[m + j * 6];
				}
			}
			for(j=0;j<8;j++)						//用S密箱里的值替换B
			{
				UINT8 row,column;
				row = ((B[j] >> 4) & 0x02) + (B[j] & 0x01);
				column = (B[j] >> 1) & 0x0f;
				B[j] = S4[j*64 + row*16 + column];
			}
			for(j=0;j<8;j++)						//把B[0]至B[7] 顺序串联起来得到一个32位数
			{
				R_tmp1[j*4] = (B[j] >> 3) & 0x01;
				R_tmp1[j*4+1] = (B[j] >> 2) & 0x01;
				R_tmp1[j*4+2] = (B[j] >> 1) & 0x01;
				R_tmp1[j*4+3] = (B[j] >> 0) & 0x01;
			}
			for(j=0;j<32;j++)						//对这个数做如下变换
			{
				R_tmp2[j] = R_tmp1[change32_32[j] - 1];
			}
			for(j=0;j<32;j++)						//计算L[i-1]
			{
				R_tmp1[j] = (UINT8)((L[i-1] >> (31-j)) & 0x01);
				R_tmp2[j] ^= R_tmp1[j];
				R[i] <<= 1;
				R[i] |= R_tmp2[j];					//把计算结果賦给R[i]
			}
			L[i] = R[i-1];							//把R[i-1]的值賦给L[i]
		}
		
		//把R[16]和L[16] 顺序串联起来得到一个64位数
		for(i=0;i<64;i++)
		{
			if(i < 32)
			{
				data1[i] = (UINT8)((R[16] >> (31-i)) & 0x01);
			}
			else
			{
				data1[i] = (UINT8)((L[16] >> (32+31-i)) & 0x01);
			}
		}
		//对这个64位数实施逆变换,然后存储
		for(i=0;i<8;i++)
		{
			UINT8 tempdata;
			for(j=0;j<8;j++)
			{
				tempdata = data1[invert64[i*8+j] - 1];
				psave[i] <<= 1;
				psave[i] |= tempdata;
			}
		}
		pdata += 8;
		psave += 8;
		k += 8;
	}
}

void Encode_Decode2(unsigned char *source,unsigned char * dest,unsigned char * inkey, int flg) 
{ 
unsigned char bufout[64], 
kwork[56], worka[48], kn[48], buffer[64], key[64], 
nbrofshift, temp1, temp2; 
int valindex; 
register i, j, k, iter; 

/* INITIALIZE THE TABLES */ 
/* Table - s1 */ 
static unsigned char s1[4][16] = { 
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 */ 
static unsigned char s2[4][16] = { 
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 */ 
static unsigned char s3[4][16] = { 
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 */ 
static unsigned char s4[4][16] = { 
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 */ 
static unsigned char s5[4][16] = { 
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 */ 
static unsigned char s6[4][16] = { 
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 */ 
static unsigned char s7[4][16] = { 
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 */ 
static unsigned char s8[4][16] = { 
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 }; 


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


/* Table - Binary */ 
static unsigned char binary[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 }; 

/* MAIN PROCESS */ 
/* Convert from 64-bit key into 64-byte key */ 
for (i = 0; i < 8; i++) { 
key[8*i] = ((j = *(inkey + i)) / 128) % 2; 
key[8*i+1] = (j / 64) % 2; 
key[8*i+2] = (j / 32) % 2; 
key[8*i+3] = (j / 16) % 2; 
key[8*i+4] = (j / 8) % 2; 
key[8*i+5] = (j / 4) % 2; 
key[8*i+6] = (j / 2) % 2; 
key[8*i+7] = j % 2; 
} 

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

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

/* Initial Permutation of Key */ 
kwork[ 0] = key[56]; 
kwork[ 1] = key[48]; 
kwork[ 2] = key[40]; 
kwork[ 3] = key[32]; 

⌨️ 快捷键说明

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