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

📄 des.cpp

📁 开发环境:Visual C++ .net2003 功能介绍:实现DES的加密和解密。
💻 CPP
字号:
#include "StdAfx.h"
#include ".\des.h"

//块信息
unsigned char IP[ BLOCK_SIZE ]=
	{
		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 REV_IP[ BLOCK_SIZE ]=
	{
		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 E[ BLOCK_SIZE1 ]=
	{
		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 P[ BLOCK_SIZE1 ]=
	{
		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 S[8][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}
		},

		{
			{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 PC_1[ BLOCK_SIZE1 ]=
	{
		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 PC_2[ BLOCK_SIZE2 ]=
	{
        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 LS[16]=
	{
		1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28
	};


// 初始化操作
CDES::CDES(void)
{
}

CDES::~CDES(void)
{
}


void CDES::DES_Compute(unsigned char  _message[], unsigned char  _key[], bool isEncode)
{
	unsigned char *message = new unsigned char [BLOCK_SIZE];
	unsigned char *key = new unsigned char [BLOCK_SIZE];

	for(int i = 0; i < 8; ++i)
	{
		ConvertByteToBit(&message[8*i], _message[i]);		
		ConvertByteToBit(&key[8*i], _key[i]);		

	}

	if(!(_key[7]))
	{
		unsigned char temp;
		int j = 7;
		for(int i = 62; i > 7 ; i--)
		{
			key[i] = key[i - j];
			if( (i%8)== 7 )
			{				
				key[i-1] = key[i - j];
				i--;
				j--;
			}
		}
	}

	//IP变换
	InitialProcess(IP, message);
	m_leftBlock = &message[0];
	m_rightBlock = &message[BLOCK_SIZE/2];//初始化 m_rightBlock 和 m_leftBlock 
	
	if(isEncode == DECODE)
	{
		Exchange_HalfBlock();
	}

	//16轮变换
	//先对密钥作变换PC_1处理
	InitialProcess(PC_1, key, BLOCK_SIZE1);
	for(int i = 0; i < 16; ++i)
	{
		if(isEncode == ENCODE)
		{
			TurnConvert(key, i, ENCODE);
			//
			cout<<"第"<<i<<"轮:"<<endl;
			ShowBlock();
		}
		else
		{			
			TurnConvert(key, i, DECODE);
			//
			cout<<"第"<<i<<"轮:"<<endl;
			ShowBlock();
		}
	}

	//IP逆变换
	//其中作了15次交换,即将结果的message左边和右边块做交换即可
    
	unsigned char swap_char;
	for(int i = 0; i < BLOCK_SIZE/2; ++i )
	{
		swap_char = message[i];
		message[i] = message[ (i+BLOCK_SIZE/2) ];
		message[ (i+BLOCK_SIZE/2) ] = swap_char;
	}

	InitialProcess(REV_IP, message);

	//再将Bit串转成Byte格式
	for(int i = 0; i < 8; ++i)
	{
		ConvertBitToByte(_message[i], &message[8*i]);
	}

	delete [] message;
	delete [] key;


}
//作IP变换或反变换,以达混乱的目的
void CDES::InitialProcess(unsigned char  IP_RIP[], unsigned char  message[], int IP_RIP_size, int msg_size)
{
	unsigned char *temp_msg = new unsigned char [ msg_size ];

	memcpy( temp_msg, message, msg_size );

	for(int i = 0; i < IP_RIP_size; ++i)
	{
		message[i] = temp_msg[ (IP_RIP[i] - 1) ];
	}
}


//块交换
void CDES::Exchange_HalfBlock(void)
{
	unsigned char * ptr = m_leftBlock;
	m_leftBlock = m_rightBlock;
	m_rightBlock = ptr;
}

// 轮变换
void CDES::TurnConvert(unsigned char  key[], int turn_num, bool isEncode)
{
	//产生子密钥
	unsigned char sub_key[BLOCK_SIZE1];

	if(isEncode == ENCODE)
	{
		GenSubKey(key, sub_key, turn_num);
	}
	else
	{
		GenSubKey(key, sub_key, 15-turn_num);
	}

	//信息之右半块作E盒变换
	unsigned char *newBlock = new unsigned char[ BLOCK_SIZE2 ];

	if(isEncode == ENCODE)
	{
		memcpy(newBlock, m_rightBlock, BLOCK_SIZE/2);
	}
	else
	{
		memcpy(newBlock, m_leftBlock, BLOCK_SIZE/2);
	}

	InitialProcess(E, newBlock, BLOCK_SIZE2, BLOCK_SIZE/2);

	//与子密钥作异或运算
	Array_XOR(newBlock, sub_key, BLOCK_SIZE2);

	//作S盒变换
	SBoxConvert(newBlock, BLOCK_SIZE2);

	//作P盒变换
	InitialProcess(P, newBlock, BLOCK_SIZE/2, BLOCK_SIZE/2);

	if(isEncode == ENCODE)
	{
		//与左块做异或运算
		Array_XOR(newBlock, m_leftBlock, BLOCK_SIZE/2);

		//将新块交给右块
		memcpy(m_leftBlock, newBlock, BLOCK_SIZE/2);
	}
	else
	{
		Array_XOR(newBlock, m_rightBlock, BLOCK_SIZE/2);
	
		//将新块交给右块
		memcpy(m_rightBlock, newBlock, BLOCK_SIZE/2);
	}

	//交换左右块标志
	Exchange_HalfBlock();

	//释放newBlock
	delete [] newBlock;
}

// 块之间作异或运算
void CDES::Array_XOR(unsigned char  blockdest[], unsigned char  blocksource[], int block_size)
{
	for(int i = 0; i < block_size; ++i)
	{
		blockdest[i] ^= blocksource[i];
	}
}

//子密钥生成
void CDES::GenSubKey(unsigned char  key[], unsigned char  sub_key[], int order, int keyLen, bool isEncode)
{
	memcpy(sub_key, key, keyLen);
	
	ShiftKey(&sub_key[0], keyLen/2, LS[order]);
	ShiftKey(&sub_key[(int)(keyLen/2)], keyLen/2, LS[order]);

	InitialProcess(PC_2, sub_key, BLOCK_SIZE2, BLOCK_SIZE1);
//	ShowSubKey(sub_key);

	//sub_key的前48位即位子密钥
}

// 对子密钥等作循环移位操作
void CDES::ShiftKey(unsigned char  key[], int keyLen, int shiftTimes, int isLShift)
{

	if(isLShift == RIGHTSHIFT)
	{
		shiftTimes = keyLen - shiftTimes;//将循环右移转化为循环左移
	}

	//-------Point---Point---
	int *prokey = new int [shiftTimes];//prokey指密钥的前面部分
	for(int i=0; i<shiftTimes; i++)
	{
		prokey[i] = key[i];
	}

	for(int i=shiftTimes; i<keyLen; i++)
	{
		key[i-shiftTimes] = key[i];
	}

	for(int i = keyLen-shiftTimes, int j=0; j<shiftTimes; j++, i++)
	{
		key[i] = prokey[j];
	}

	delete [] prokey;
}

// 用于计算S盒
//当message(48bit)返回时,应为32bit长
void CDES::SBoxConvert(unsigned char  message[], int msgLen)
{
	unsigned char firstPart, secondPart, result;
	for(int i = 0; i < msgLen/6; ++i)//作8次S变化
	{
		firstPart = 0;
		secondPart = 0;

		//firstPart...
		firstPart |= message[i*6 + 0];
		firstPart <<= 1;
		firstPart |= message[i*6 + 5];

		//secondPart...
		for(int j = 1; j <=4; ++j)
		{
			secondPart <<= 1;
			secondPart |= message[i*6 + j];			
		}

		//result...
		result = S[i][firstPart][secondPart];
        
		for(int j = 3; j >= 0; --j)
		{
			message[4*i + j] = result & 0x01;
			result >>= 1;
		}
	}
}

// 将Byte流转化成Bit流
void CDES::ConvertByteToBit(unsigned char  destBitValue[], unsigned char sourceByteValue)
{
	for(int i = 0;i < 8; ++i)
	{
		destBitValue[7 - i] = sourceByteValue & 0x01;
		sourceByteValue >>= 1;
	}
}

// 将Bit流转化成Byte
void CDES::ConvertBitToByte(unsigned char &destByte, unsigned char  sourceBits[])
{
	destByte = 0;
	for(int i = 0; i < 8; ++i)
	{
		destByte <<= 1;
		destByte |= sourceBits[i];
	}
}

void CDES::ShowBlock(void)
{
	cout<<"Left :";
	for(int i = 0; i < 32; ++i)cout<<(int)m_leftBlock[i];
	cout<<endl<<"Right:";
	for(int i = 0; i < 32; ++i)cout<<(int)m_rightBlock[i];
	cout<<endl;

}


void CDES::ShowSubKey(unsigned char sub_key[], int size)
{
	cout<<"Sub_key[Left]:";
	for(int i = 0; i < size;++i)
	{
		cout<<(int)sub_key[i];

		if(i == (size/2)-1 )
		{
			cout<<endl<<"Sub_key[Right]:";
		}		
	}
	cout<<endl;
}

⌨️ 快捷键说明

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