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

📄 main.cpp

📁 试验DES对称密钥加密算法 可加密文件或终端的字符 密钥为7为的英文字母
💻 CPP
字号:
#include "des.h"
#include "Table.h"

void jiemi()//(char mingwen2[])
{
	
	char soc[8];
	
	int k[64],key[16][48],ke[64],lbit[28],rbit[28],key_temp[56];
	//密钥处理
	char fming[20],fmi[20];
	cout<<"请输入密钥(7位)"<<endl;
		cin>>soc;
	cout<<"请输入你要解密的文件名(加上后缀)"<<endl;
	cin>>fmi;
	cout<<"请输入你要存放明文的文件名(加上后缀)"<<endl;
	cin>>fming;

	ofstream f_ming;
	f_ming.open(fming,ios::binary);
	ifstream f_mi;
	f_mi.open(fmi,ios::binary);
	
	Char_Binint(k,soc);
	Add_Check(k);
	Mutation(PC1_Table,k,ke,56);
	Average(lbit,rbit,ke,56);
	for(int i=0;i<16;i++)
	{
		L_Shift(lbit,rbit,LOOP_Table[i]);
		Unite(lbit,rbit,key_temp,56);
		Mutation(PC2_Table,key_temp,key[i],48);
	}
	
	// 解密过程
	do{
	
	
	char mi_ming[9];
	int lp[32],rp[32],mingp[64],mingf[64],res[64];
	char mingwen[9];
	f_mi.read(mingwen,8*sizeof(char));
	mingwen[8]='\0';
	if(f_mi.eof())
		break;
	//Char_Binint(ming,mingwen);
	int x,k1,m,len;
	int ming[64];
	int bit_temp[100];
	int biaozhi[8]={0,0,0,0,0,0,0,0};
	
	for(int j=0;j<8;j++)
	{
		k1=(int)mingwen[j];
		if(k1<0)
		{
			k1=-k1;
			biaozhi[j]=1;
		}
			
		for(x=0;x<8;x++)
			{
				bit_temp[j*8+x]=k1%2;
				if(k1==0)
					break;
				
				k1=k1/2;
				
			}
					
	if(x!=7)//不足八位的添0;
		for(x;x<8;x++)
			bit_temp[j*8+x]=0;
		
	}
	
	
	//更改循序
	for(int j=0;j<8;j++)
		for(x=0;x<8;x++)
			ming[j*8+x]=bit_temp[j*8+7-x];
	for(int i=0;i<8;i++)
		if(biaozhi[i]==1)
		{
			//取反
			for(int j=0;j<8;j++)
			{
				ming[i*8+j]=(ming[i*8+j]+1)%2;
			}
			//加一
			for(int j=7;j>=0;j--)
				if(ming[i*8+j]==0)
				{
					ming[i*8+j]=1;
					for(int rem=j+1;rem<8;rem++)
						ming[i*8+rem]=0;
					break;
				}
		}//还原出正确的密文二进制码
	/*for(int we=0;we<64;we++)
	{
		if(we%8==0)
			cout<<endl;
		cout<<ming[we];

	}*/


	Mutation(IP_Table,ming,mingp,64);
	Average(lp,rp,mingp,64);
	
	
	int minge[48],mings[32],mingl[32],temp[32];
	for(int i=0;i<16;i++)
	{
		Mutation(E_Table,rp,minge,48);
		Yihou(key[15-i],minge,48);
		S_box(minge,mings);
		Mutation(P_Table,mings,mingl,32);
		Yihou(mingl,lp,32);
		//左右交换
		if(i!=15){
		for(int j=0;j<32;j++)
		{
			temp[j]=lp[j];
			lp[j]=rp[j];
			rp[j]=temp[j];
		}
		}
		
		
		
	}
	Unite(lp,rp,mingf,64);
	Mutation(IPR_Table,mingf,res,64);
	Int_Char(mi_ming,res);
	f_ming.write(mi_ming,8*sizeof(char));
	}while(1);
	cout<<"完成解密。"<<endl;
	f_ming.close();
	f_mi.close();

	
}
void jiami()
{
	char soc[8];
	int k[64],key[16][48],ke[64],lbit[28],rbit[28],key_temp[56];
	char fming[20],fmi[20];
	cout<<"请输入密钥(7位)"<<endl;
		cin>>soc;
	cout<<"请输入你要加密的文件名(加上后缀)"<<endl;
		cin>>fming;
	cout<<"请输入你要存放密文的文件名(加上后缀)"<<endl;
		cin>>fmi;

	ifstream f_ming;
	f_ming.open(fming,ios::binary);
	ofstream f_mi;
	f_mi.open(fmi,ios::binary);



	//密钥处理
	
	Char_Binint(k,soc);
	/*for(int x=0;x<56;x++)
	{
		if((x)%8==0)
		cout<<endl;
		cout<<k[x];
	}
	cout<<endl;*/
	Add_Check(k);
	/*for(int x=0;x<64;x++)
	{
		if((x)%8==0)
		cout<<endl;
		cout<<k[x];
	}*/
	Mutation(PC1_Table,k,ke,56);
	Average(lbit,rbit,ke,56);
	for(int i=0;i<16;i++)
	{
		L_Shift(lbit,rbit,LOOP_Table[i]);
		Unite(lbit,rbit,key_temp,56);
		Mutation(PC2_Table,key_temp,key[i],48);
	}
	

	// 加密过程
	
	char mingwen[9];
	char mi_ming[9];
	int ming[64],lp[32],rp[32],mingp[64],mingf[64],res[64];
	//cout<<"请输入明文(8位)"<<endl;
	//cin>>mingwen;
	//getchar();
	do{
	f_ming.read(mingwen,8*sizeof(char));
	mingwen[8]='\0';
	if(f_ming.eof())
		break;
	Char_Binint(ming,mingwen);
	Mutation(IP_Table,ming,mingp,64);
	Average(lp,rp,mingp,64);
	
	
	int minge[48],mings[32],mingl[32],temp[32];
	for(int i=0;i<16;i++)
	{
		Mutation(E_Table,rp,minge,48);
		//int keyt[48];
		//for(int j=0;j<48;j++)
			//keyt[j]=key[i][j];
		Yihou(key[i],minge,48);
		S_box(minge,mings);
		Mutation(P_Table,mings,mingl,32);
		Yihou(mingl,lp,32);
		//左右交换
		if(i!=15){
  		for(int j=0;j<32;j++)
		{
			temp[j]=lp[j];
			lp[j]=rp[j];
			rp[j]=temp[j];
		}
		}
		
		
		
	}
	Unite(lp,rp,mingf,64);
	Mutation(IPR_Table,mingf,res,64);
	/*// 显示密文的二进制码
	for(int we=0;we<64;we++)
	{
		if(we%8==0)
			cout<<endl;
		cout<<res[we];

	}*/
		
	Int_Char(mi_ming,res);
	//for(int i=0;i<8;i++)
	//	cout<<mi_ming[i];
	//cout<<endl<<endl;
	f_mi.write(mi_ming,8*sizeof(char));
	}while(1);
	cout<<"完成加密。"<<endl;
	
	
	
	f_ming.close();
	f_mi.close();
}
void main()
{
	

	
	char i;
	do{
	printf("1.jiami\n2.jiemi\n3.quit\n");

	scanf("%s",&i);
	//getchar();
	if(i>=65&&i<=122)
	{
		printf("wrong xuan xiang\n");
		continue;
	}
	
	switch (i)
	{
	case '1': jiami();
	 break;
	case '2':  jiemi();
		break;
	case '3':  exit(0);
		break;
	default : printf("wrong xuan xiang\n");
		
	}

	}while(1);

}

	

	

	



	
	



	

		

	
	
	
	

⌨️ 快捷键说明

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