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

📄 cipher.cpp

📁 DES算法的加解密实现,Visual C++实现
💻 CPP
字号:
#include <string.h>
#include <iostream.h>

#include "Cipher.h"
#ifndef SubKey
#include "GlobalData.h"
#endif

/**************************************/
void InitialPermu(int *TB);
void expanpermu(int *RPT,int *EXT);
void SBox(int *RPT,int *EXT);
void PBox(int *RPT);
void lastpermu(int *LPT,int *RPT);
void tochar(int *LPT,int *RPT);
/**************************************/

void cipher(char *text)         //text是8个字节的块
{
	/****把64比特位的块转换成64个整数****/
	int textblock[64];
	int index=63;
	for(int i=0;i<8;i++){
		for(int j=0;j<8;j++){
			textblock[index--]=(int)text[i]%2;
			text[i]>>1;
		}
	}

	/****初始置换****/
	InitialPermu(textblock);

	/****把块分成两半****/
	int LPT[32];
	int RPT[32];
	int temp[32];
	memcpy(LPT,textblock,64);
	memcpy(RPT,textblock+64,64);
	memcpy(temp,textblock+64,64);

	/*************16轮加密*************/
	int turn=1;          //第几轮
	while(turn<17){
		/****扩展置换****/
		int EXT[48];
		expanpermu(RPT,EXT);

		/****按位异或****/
		for(int m=0;m<48;m++)
			EXT[m]=EXT[m]^SubKey[turn-1][m];

		/****S盒替换****/
		SBox(RPT,EXT);

	    /****P盒替换****/
		PBox(RPT);

		/****异或与交换****/
		for(int n=0;n<32;n++)
			RPT[n]=RPT[n]^LPT[n];
		memcpy(LPT,temp,64);
		memcpy(temp,RPT,64);

		turn++;
	}

	/******************最终置换*******************/
	lastpermu(LPT,RPT);

	/******************转换为字符串*****************/
	tochar(LPT,RPT);
}

/*********************************函数实现****************************************/
void InitialPermu(int *TB)
{
	int IPTable[]={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,
				   56,48,40,32,24,16,8,0,58,50,42,34,26,18,10,2,
				   60,52,44,36,28,21,12,4,62,54,46,38,30,22,14,6};
	int tb[64];
	memcpy(tb,TB,128);
	for(int i=0;i<64;i++)
		TB[i]=tb[IPTable[i]];
}

void expanpermu(int *RPT,int *EXT)
{
	int EPTable[]={31,0,1,2,3,4,3,4,5,6,7,8,
		           7,8,9,10,11,12,11,12,13,14,15,16,
				   15,16,17,18,19,20,19,20,21,22,23,24,
				   23,24,25,26,27,28,27,28,29,30,31,0};

	for(int i=0;i<48;i++)
		EXT[i]=RPT[EPTable[i]];
}

void SBox(int *RPT,int *EXT)
{
	/****8个替换盒****/
	int 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}};
	int 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}};
	int 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}};
	int 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}};
	int 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}};
	int 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}};
	int 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}};
	int 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}};

	int bk=0;
	while(bk<8){
		int tem[6];
		memcpy(tem,EXT+bk*6,12);
		int row=tem[0]*2+tem[5];
		int column=tem[1]*8+tem[2]*4+tem[3]*2+tem[4];
		int num;

		switch(bk){
		case 0:
			num=S1[row][column];
			break;
		case 1:
			num=S2[row][column];
			break;
		case 2:
			num=S3[row][column];
			break;
		case 3:
			num=S4[row][column];
			break;
		case 4:
			num=S5[row][column];
			break;
		case 5:
			num=S6[row][column];
			break;
		case 6:
			num=S7[row][column];
			break;
		case 7:
			num=S8[row][column];
			break;
		}

        int loop=3;
		while(loop>=0){
			*(RPT+bk*4+loop)=num%2;
			loop--;
			num>>1;
		}

		bk++;
	}
}

void PBox(int *RPT)
{
	int tem[32];
	memcpy(tem,RPT,64);

	int PTable[]={15,6,19,20,28,11,27,16,0,14,22,25,4,17,30,9,1,7,23,13,31,26,2,8,18,12,29,5,21,10,3,24};
    
	for(int k=0;k<32;k++)
		RPT[k]=tem[PTable[k]];
}

void lastpermu(int *LPT,int *RPT)
{
	int LPTable[]={39,7,47,45,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,32,0,40,8,48,16,56,24};

	int LT[32],RT[32];
	memcpy(LT,LPT,64);
	memcpy(RT,RPT,64);

	for (int k=0;k<64;k++){
		if(LPTable[k]<32){
			if(k<32)LPT[k]=LT[LPTable[k]];
			else RPT[k-32]=LT[LPTable[k]];
		}
		else{
			if(k<32)LPT[k]=RT[LPTable[k]-32];
			else RPT[k-32]=RT[LPTable[k]-32];
		}
	}
}

void tochar(int *LPT,int *RPT)
{
	int t=0;
	char value;
	while(t<8){
		if(t<4){
			value=(char)(LPT[t*8]*128+LPT[t*8+1]*64+LPT[t*8+2]*32+LPT[t*8+3]*16+LPT[t*8+4]*8
				  +LPT[t*8+5]*4+LPT[t*8+6]*2+LPT[t*8+7]);
		}
		else{
			value=(char)(RPT[(t-4)*8]*128+RPT[(t-4)*8+1]*64+RPT[(t-4)*8+2]*32+RPT[(t-4)*8+3]*16
				  +RPT[(t-4)*8+4]*8+RPT[(t-4)*8+5]*4+RPT[(t-4)*8+6]*2+RPT[(t-4)*8+7]);
		}

		int k=strlen(text2);
//		strncpy(text2+k,value,1);            //转换了一个字节
		text2[k]=value;

		t++;
	}
}

⌨️ 快捷键说明

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