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

📄 des.cpp

📁 包涵了密码学教程里面的大部分加密算法
💻 CPP
字号:
/////////////////////

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "stdafx.h"
#include "DES.h"


//对64位明文的初始置换
void desIP1(char PlainText1[64], char PlainText2[64])
{
	int i;
	int pos;

	for(i=0; i<64; i++)
	{
		pos = IP_1[i];
		PlainText2[i] = PlainText1[pos];
	}
    
	PlainText2[64] = '\0';
}


//对64位密文的逆置换
void desIP2(char PlainText1[64], char PlainText2[64])
{
	int i;
	int pos;

	for(i=0; i<64; i++)
	{
		pos = IP_2[i];
		PlainText2[i] = PlainText1[pos];
	}
	
	PlainText2[64] = '\0';
}


//将64位明文分成两部分
void divide(char PlainText1[64], char PlainText2[32], char PlainText3[32])
{
	int i;

	for(i=0; i<32; i++)
	{
		PlainText2[i] = PlainText1[i];
		PlainText3[i] = PlainText1[32+i];
	}

//	PlainText2[32] = '\0';
//	PlainText3[32] = '\0';
}


//将运算后的两部分密文合成为64位密文
void compose(char Cipher1[64], char Cipher2[32], char Cipher3[32])
{
	int i;

	for(i=0; i<32; i++)
	{
		Cipher1[i] = Cipher2[i];
		Cipher1[32+i] = Cipher3[i];
	}

	Cipher1[64] = '\0';
}


//产生密钥过程中的初始置换
void desPC1(char Key1[64], char Key2[56])
{
	int i;
	int pos;

	for(i=0; i<56; i++)
	{
		pos = PC_1[i];
		Key2[i] = Key1[pos];
	}

	Key2[56] = '\0';
}


//将56位密钥分成两部分
void C0D0(char Key1[56], char Key2[28], char Key3[28])
{
	int i;

	for(i=0; i<28; i++)
	{
		Key2[i] = Key1[i];
		Key3[i] = Key1[28+i];
	}

	Key1[56] = '\0';
}


//左循环一位或两位运算
void LS(char Key1[28], int n, char Key2[28])
{
	int i;

	/*
	if(n == 1)
	{
		char ch =  Key1[0];

		for(i=0; i<27; i++)
			Key2[i] = Key1[i+1];
		Key[27] = ch;
	}
	else if(n == 2)
	{
		char ch1 = Key1[0];
		char ch2 = Key1[1];

		for(i=0; i<26; i++)
		{
			Key2[i] = Key1[i+2];
		}
		Key2[26] = Key1[0];
		Key2[27] = Key1[1];
	}
	*/

	//下面的这种方法比较易读,但效率不高
	for(i=0; i<28; i++)
		Key2[i] = Key1[(i+n) % 28];

	Key2[28] = '\0';
}

//密钥产生过程中的合成运算
void CD(char Key1[56], char Key2[28], char Key3[28])
{
	int i;

	for(i=0; i<28; i++)
	{
		Key1[i] = Key2[i];
		Key1[28+i] = Key3[i];
	}

	Key1[56] = '\0';
}


//产生密钥过程中的第二次置换
void desPC2(char Key1[56], char Key2[48])
{
	int i;
	int pos;

	for(i=0; i<48; i++)
	{
		pos = PC_2[i];
		Key2[i] = Key1[pos];
	}

	Key2[48] = '\0';
}


//扩展运算,32->48
void desE(char PlainText1[32], char PlainText2[48])
{
	int i;
	int pos;
	
	for(i=0; i<48; i++)
	{
		pos = E[i];
		PlainText2[i] = PlainText1[pos];
	}

	PlainText2[48] = '\0';
}


//f函数中异或运算
void EJB(char EE[48], char JJ[48], char BB[48])
{
	int i;

	for(i=0; i<48; i++)
		BB[i] = EE[i] ^ JJ[i];

	BB[48] = '\0';
}


//f函数中的P置换
void desP(char C1[32], char C2[32])
{
	int i;
	int pos;

	for(i=0; i<32; i++)
	{
		pos = P[i];
		C2[i] = C1[pos];
	}

	C2[32] = '\0';
}


//f函数中的S盒变换
void desS(char BB[48], char CC[32])
{
	int col, row;
	int val;

	//第一个S盒运算
	row = BB[0]*2 + BB[5];
	col = BB[1]*8 + BB[2]*4 + BB[3]*2 + BB[4];		
	//将int型val转换为二进制字符(4 bit)
	val = SP_1[row][col];
	if(val >= 8)
		CC[0] = '1';
	else
		CC[0] = '0';
		
	if((val-8) >= 4)
		CC[1] = '1';
	else
		CC[1] = '0';
	
	if((val-12) >= 2)
		CC[2] = '1';
	else
		CC[2] = '0';

	if((val-14) >= 1)
		CC[3] = '1';
	else
		CC[3] = '0';

	//第二个S盒运算
	row = BB[6]*2 + BB[11];
	col = BB[7]*8 + BB[8]*4 + BB[9]*2 + BB[10];
	val = SP_2[row][col];
	//将int型val转换为二进制字符(4 bit)
	if(val >= 8)
		CC[4] = '1';
	else
		CC[4] = '0';

	if((val-8) >= 4)
		CC[5] = '1';
	else
		CC[5] = '0';

	if((val-12) >= 2)
		CC[6] = '1';
	else
		CC[6] = '0';

	if((val-14) >= 1)
		CC[7] = '1';
	else
		CC[7] = '0';

	//第三个S盒运算
	row = BB[12]*2 + BB[17];
	col = BB[13]*8 + BB[14]*4 + BB[15]*2 + BB[16];
	//将int型val转换为二进制字符(4 bit)
	val = SP_3[row][col];
	if(val >= 8)
		CC[8] = '1';
	else
		CC[8] = '0';

	if((val-8) >= 4)
		CC[9] = '1';
	else
		CC[9] = '0';

	if((val-12) >= 2)
		CC[10] = '1';
	else
		CC[10] = '0';

	if((val-14) >= 1)
		CC[11] = '1';
	else
		CC[11] = '0';

	//第四个S盒运算
	row = BB[18]*2 + BB[23];
	col = BB[19]*8 + BB[20]*4 + BB[21]*2 + BB[22];
	val = SP_4[row][col];
	//将int型val转换为二进制字符(4 bit)
	if(val >= 8)
		CC[12] = '1';
	else
		CC[12] = '0';

	if((val-8) >= 4)
		CC[13] = '1';
	else
		CC[13] = '0';

	if((val-12) >= 2)
		CC[14] = '1';
	else
		CC[14] = '0';

	if((val-14) >= 1)
		CC[15] = '1';
	else
		CC[15] = '0';

	//第五个S盒运算
	row = BB[24]*2 + BB[29];
	col = BB[25]*8 + BB[26]*4 + BB[27]*2 + BB[28];
	val = SP_5[row][col];
	//将int型val转换为二进制字符(4 bit)
	if(val >= 8)
		CC[16] = '1';
	else
		CC[16] = '0';

	if((val-8) >= 4)
		CC[17] = '1';
	else
		CC[17] = '0';

	if((val-12) >= 2)
		CC[18] = '1';
	else
		CC[18] = '0';

	if((val-14) >= 1)
		CC[19] = '1';
	else
		CC[19] = '0';

	//第六个S盒运算
	row = BB[30]*2 + BB[35];
	col = BB[31]*8 + BB[32]*4 + BB[33]*2 + BB[34];
	val = SP_6[row][col];
	//将int型val转换为二进制字符(4 bit)
	if(val >= 8)
		CC[20] = '1';
	else
		CC[20] = '0';

	if((val-8) >= 4)
		CC[21] = '1';
	else
		CC[21] = '0';
	
	if((val-12) >= 2)
		CC[22] = '1';
	else
		CC[22] = '0';

	if((val-14) >= 1)
		CC[23] = '1';
	else
		CC[23] = '0';
		
	//第七个S盒运算
	row = BB[36]*2 + BB[41];
	col = BB[37]*8 + BB[38]*4 + BB[39]*2 + BB[40];
	val = SP_7[row][col];
	//将int型val转换为二进制字符(4 bit)
	if(val >= 8)
		CC[24] = '1';
	else
		CC[24] = '0';

	if((val-8) >= 4)
		CC[25] = '1';
	else
		CC[25] = '0';

	if((val-12) >= 2)
		CC[26] = '1';
	else
		CC[26] = '0';

	if((val-14) >= 1)
		CC[27] = '1';
	else
		CC[27] = '0';

	//第八个S盒运算
	row = BB[42]*2 + BB[47];
	col = BB[43]*8 + BB[44]*4 + BB[45]*2 + BB[46];
	//将int型val转换为二进制字符(4 bit)
	val = SP_8[row][col];
	if(val >= 8)
		CC[28] = '1';
	else
		CC[28] = '0';

	if((val-8) >= 4)
		CC[29] = '1';
	else
		CC[29] = '0';

	if((val-12) >= 2)
		CC[30] = '1';
	else
		CC[30] = '0';

	if((val-14) >= 1)
		CC[31] = '1';
	else
		CC[31] = '0';

	CC[32] = '\0';
}


//产生明文右半部分时的异或运算
void createR(char LL[32], char ff[32], char RR[32])
{
	int i;

	for(i=0; i<32; i++)
		RR[i] = LL[i] ^ ff[i];

	RR[32] = '\0';
}


//生成子密钥的过程
void des_key(char Key1[64], char Key[48])
{
	char Key2[56], Key3[28], Key4[28];

	desPC1(Key1, Key2);
	C0D0(Key2, Key3, Key4);
}

⌨️ 快捷键说明

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