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

📄 main.cpp

📁 用c++实现des算法 整体思路 用key.cpp 文件来产生秘钥
💻 CPP
字号:
//////////////////////////////////////////
//
// FileName: main.cpp
// Creator: Du Feilong
// Date: 2007-10-11
// Comment: main文件实现加密和解密
//
////////////////////////////////////////// 
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<string>
#include <vector> 
#include <cstdlib>
#include<stdlib.h>
#include<time.h>
using namespace std;





int IV[64]={1,1};

int Key0[48],Key1[48],Key2[48],Key3[48],Key4[48];

int DesIPC[64]={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,20,12,4,62,54,46,38,30,22,14,6};
		
int DesIP2[64]={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,32,0,40,8,48,16,56,24};
		
int startdata[64];
int finaldata[64];
int l0[32],l1[32],l2[32],l3[32],l4[32],r0[32],r1[32],r2[32],r3[32],r4[32];


struct data
{
	int a[64];
	data()
	{
		for(int i=0;i<64;i++)
			a[i]=0;
	}
};

vector<data> datain;


void F(int *R1,int *L0,int *R0,int *Key1);
void createkey(int *Key1,int *Key2,int *Key3,int *Key4);

///////////////////////////////////////////////////////////////////////////////////////////////////////



void vectordisplayjiemi(vector<data> datain)
{
	cout<<"the datain is: "<<endl;
	for(int i=0;i<(int)datain.size();i++){
		for(int j=0;j<64;j++){
			if(j!=0&&j%8==0)
				cout<<endl;
			cout<<datain[i].a[j]<<" ";
		}
		cout<<"\n\n";
	}
}



void getdatajiemi(ifstream &fin)
{
	
	
	
	char n=0x00;
	data tempdata;
	int k=0;

	fin.read((char *)&n, sizeof(n));
	while(!fin.eof()){
	
		while(!fin.eof()&&k<8){
			for(int i=7;i>=0;i--){
				tempdata.a[k*8+i]=n&1;
				n=n>>1;
			}
			fin.read((char *)&n, sizeof(n));
			k++;
		}
		if(k==8){
			k=0;
			datain.push_back(tempdata);
			for(int i=0;i<64;i++)
				tempdata.a[i]=0;
		}
		if(fin.eof()){
			fin.close();
		}
		
	}
	fin.close();
	
}



	
void Desconversion1jiemi()
{	
	int i;
	int temp[64];
	for(i=0;i<64;i++)
		temp[i]=startdata[i];
	for(i=0;i<64;i++)
		startdata[i]=temp[DesIPC[i]];

}

void Desconversion2jiemi()
{	
	int i;
	int temp[64];
	for(i=0;i<64;i++)
		temp[i]=finaldata[i];
	for(i=0;i<64;i++)
		finaldata[i]=temp[DesIP2[i]];
}


void desdividejiemi()
{
	int i;
	for(i=0;i<32;i++)
		r0[i]=startdata[i];				
	for(i=0;i<32;i++)
		l0[i]=startdata[i+32];				

}


void Desjoinjiemi(int *a,int *b,int *c)
{
	int i;
	for(i=0;i<32;i++)
		c[i]=a[i];
	for(i=32;i<64;i++)
		c[i]=b[i-32];
		
	
}

void displayfinaljiemi()				//for test finaldata
{

	cout<<"the final data is :"<<endl;
	for(int i=0;i<64;i++){
		if(i%16==0&&i!=0)
			cout<<endl;
		cout<<finaldata[i]<<" ";
	}
	cout<<endl;
}

void vec_startdatajiemi(int k)
{
	if(k==0){
		for(int i=0;i<64;i++)
			startdata[i]=datain[k].a[i];
	}
	else{
		for(int i=0;i<64;i++)
			startdata[i]=datain[k].a[i];
	}
	
}


void final_huanyuan(int flag,ofstream &jiemiout)
{
	
	
	char n=0x00;
	int i;
	int e_or=0;
	if(flag==0){
		for(int i=0;i<64;i++)
			finaldata[i]=finaldata[i]^IV[i];
	}
	else{
		for(int i=0;i<64;i++)
			finaldata[i]=finaldata[i]^datain[flag-1].a[i];
	}

	if(flag==datain.size()-1){
		int lastnum=0;
		for(i=56;i<64;i++){
			lastnum=lastnum*2+finaldata[i];
		}

		for(i=0;i<64-8*lastnum;i++){
			n=n|(0x01&finaldata[i]);
			e_or++;
			if(e_or==8){
				jiemiout<<n;
				n=0x00;
				e_or=0;
			}
			n=n<<1;
		}
		
	}
	else{
		for(i=0;i<64;i++){
			n=n|(0x01&finaldata[i]);
			e_or++;
			if(e_or==8){
				jiemiout<<n;
				n=0x00;
				e_or=0;
			}
			n=n<<1;
		}
	}
}

	


void desjiemi(int flag,ofstream &jiemiout)
{
	int i;
	
	Desconversion1jiemi();
	
	desdividejiemi();
	
	
	for(i=0;i<32;i++)
		r1[i]=l0[i];
	F(l1,r0,l0,Key1);

	
	for(i=0;i<32;i++)
		r2[i]=l1[i];
	F(l2,r1,l1,Key2);

	
	
	for(i=0;i<32;i++)
		r3[i]=l2[i];
	F(l3,r2,l2,Key3);

	
	
	for(i=0;i<32;i++)
		r4[i]=l3[i];
	F(l4,r3,l3,Key4);
	
	
	Desjoinjiemi(l4,r4,finaldata);
	Desconversion2jiemi();
//	displayfinaljiemi();
	final_huanyuan(flag,jiemiout);
}

		
	
	



void jiemi()
{

	cout<<"输入要解密的文件"<<endl;
	string jiemi_name;
	cin>>jiemi_name;


	cout<<"输入解密后的文件"<<endl;
	string afterjiemi_name;
	cin>>afterjiemi_name;



	ofstream jiemiout(afterjiemi_name.c_str());
	ifstream fin(jiemi_name.c_str(), ios::binary);

	createkey(Key1,Key2,Key3,Key4);
	for(int i=0;i<48;i++){
		int temp=Key1[i];
		Key1[i]=Key4[i];
		Key4[i]=temp;
	}
	for(int i=0;i<48;i++){
		int temp=Key2[i];
		Key2[i]=Key3[i];
		Key3[i]=temp;
	}
	

	getdatajiemi(fin);
	for(int i=0;i<(int)datain.size();i++){
		vec_startdatajiemi(i);
		desjiemi(i,jiemiout);

	}
}


///////////////////////////////////////////////////////////////////////////////////////////////////////

void vec_startdata(int k)
{
	
	if(k==0){
		for(int i=0;i<64;i++)
			startdata[i]=datain[k].a[i]^IV[i];
	}
	else{
		for(int i=0;i<64;i++)
			startdata[i]=datain[k].a[i]^finaldata[i];
	}
	
}	


void Desconversion1()
{	
	int i;
	int temp[64];
	for(i=0;i<64;i++)
		temp[i]=startdata[i];
	for(i=0;i<64;i++)
		startdata[i]=temp[DesIPC[i]];

}

void Desconversion2()
{	
	int i;
	int temp[64];
	for(i=0;i<64;i++)
		temp[i]=finaldata[i];
	for(i=0;i<64;i++)
		finaldata[i]=temp[DesIP2[i]];
}




void Desjoin(int *a,int *b,int *c)
{
	int i;
	for(i=0;i<32;i++)
		c[i]=a[i];
	for(i=32;i<64;i++)
		c[i]=b[i-32];
		
	
}



void vectordisplay(vector<data> datain)
{
	cout<<"the vector number is: "<<datain.size()<<endl;
	for(int i=0;i<(int)datain.size();i++){
		for(int j=0;j<64;j++){
			if(j!=0&&j%16==0)
				cout<<endl;
			cout<<datain[i].a[j];
		}
		cout<<"\n\n\n";
	}
}


void getdatajiami(FILE *jiami)
{
	srand((unsigned int)time(NULL));
	data tempdata;
	int k=0;
	
	
	char n[8];
	int numin;

	
	while(1){
		for(int i=0;i<8;i++)
			n[i]=0x00;
		numin=(int)fread(n,1,8,jiami);

		if(numin<8){

			for(int k=0;k<numin;k++){
				for(int i=7;i>=0;i--){
					tempdata.a[k*8+i]=n[k]&(0x01);
					n[k]=n[k]>>1;
				}
			}
			for(int k=numin;k<7;k++){
				for(int i=7;i>=0;i--){
					tempdata.a[k*8+i]=rand()%2;
				}
			}
			char m=8-numin;
			for(int i=7;i>=0;i--){
				tempdata.a[7*8+i]=m&(0x01);
				m=m>>1;
			}
				
			fclose(jiami);
			datain.push_back(tempdata);
			return;
		}
		else if(numin==8){
			for(int k=0;k<8;k++){
				for(int i=7;i>=0;i--){
					tempdata.a[k*8+i]=n[k]&(0x01);
					n[k]=n[k]>>1;
				}
			}
			datain.push_back(tempdata);
		}
	}
	
}






void desdividejiami()
{
	int i;
	for(i=0;i<32;i++)
		l0[i]=startdata[i];				
	for(i=0;i<32;i++)
		r0[i]=startdata[i+32];				
}



void displayfinal()				//for test finaldata
{

	cout<<"after jiami the data is :"<<endl;
	for(int i=0;i<64;i++){
		if(i%8==0&&i!=0)
			cout<<endl;
		cout<<finaldata[i]<<" ";
	}
	cout<<endl;
}



void final_miwen(int flag, FILE *afterjiami)
{
	
	
	char n=0x00;
	int i;
	int e_or=0;
	for(i=0;i<64;i++){
		n=n|(0x01&finaldata[i]);
		e_or++;
		if(e_or==8){
			fwrite(&n,1,1,afterjiami);
			n=0x00;
			e_or=0;
		}
		n=n<<1;
	}
}



	
void desjiami(int flag, FILE *afterjiami)
{
	int i;
	
	Desconversion1();
	
	desdividejiami();
	
	
	for(i=0;i<32;i++)
		l1[i]=r0[i];
	F(r1,l0,r0,Key1);

	
	for(i=0;i<32;i++)
		l2[i]=r1[i];
	F(r2,l1,r1,Key2);

	
	
	for(i=0;i<32;i++)
		l3[i]=r2[i];
	F(r3,l2,r2,Key3);

	
	
	for(i=0;i<32;i++)
		l4[i]=r3[i];
	F(r4,l3,r3,Key4);
	
	
	Desjoin(r4,l4,finaldata);
	Desconversion2();
	final_miwen(flag, afterjiami);
}



		
	
	
void jiami()
{
	FILE *jiami;
	string jiami_name;
	cout<<"输入要加密的文件"<<endl;	
	while(1){
		cin>>jiami_name;
		jiami=fopen(jiami_name.c_str(), "rb");
		if(jiami==NULL){
			cout<<"请输入正确的文件名"<<endl;
		}
		else{
			break;
		}
	}
	
	FILE *afterjiami;
	string afterjiami_name;
	cout<<"输入要加密后的文件"<<endl;	
	while(1){
		cin>>afterjiami_name;
		afterjiami=fopen(afterjiami_name.c_str(), "rb");
		if(afterjiami==NULL){
			cout<<"请输入正确的文件名"<<endl;
		}
		else{
			break;
		}
	}

	createkey(Key1,Key2,Key3,Key4);
	getdatajiami(jiami);
	afterjiami=fopen(afterjiami_name.c_str(),"wb");
	for(int i=0;i<(int)datain.size();i++){
		vec_startdata(i);
		if(i==datain.size()-1)
			desjiami(1,afterjiami);		
		else
			desjiami(0,afterjiami);
	}
	fclose(afterjiami);
}



int main()
{
	int n;
	cout<<"加密请输入1,解密请输入2,退出请输入0"<<endl;
	while(1){
		cin>>n;
		if(n==1){
			jiami();
			cout<<"\n加密成功!\n"<<endl;
			cout<<"加密请输入1,解密请输入2,退出请输入0"<<endl;
		}
		if(n==2){
			jiemi();
			cout<<"\n解密成功\n"<<endl;
			cout<<"加密请输入1,解密请输入2,退出请输入0"<<endl;
		}
		if(n==0)
			return 0;
	}
}

⌨️ 快捷键说明

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