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

📄 des1.cpp

📁 DES加密算法是应用很普遍的加密算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			cout<<"S_Box is:";
			print32(S_result);
		}
		
		/* P盒替换 */
		for(j=0;j<32;j++)
			P_result[j]=S_result[P_Box[j]-1];
		if(isdetialprint)
		{
			cout<<"f(R"<<i-1<<",K"<<i<<")=";
			print32(P_result);
		}
			
		/* 将32位明文的经过P盒替换后的右半部分与起初分组的明文的左半部分进行异或 */
		for(j=0;j<32;j++)
			text32_right[i][j]=P_result[j]^text32_left[i-1][j];
		if(isdetialprint)
		{
			cout<<"R"<<i<<"=";
			print32(text32_right[i]);
		}

		/* L[i]=R[i-1] */
		for(j=0;j<32;j++)
			text32_left[i][j]=text32_right[i-1][j];
		if(isdetialprint)
		{
			cout<<"L"<<i<<"=R"<<i-1<<"=";
			print32(text32_left[i]);
			cout<<endl;
		}

	}//end of f function

	/* 将L16与R16合并 */
	for(i=0;i<32;i++)
	{
		text64[i]=text32_right[16][i];
		text64[i+32]=text32_left[16][i];
	}

	/* 末置换 */
	for(i=0;i<64;i++)
		text2[i]=text64[Final_Permutation[i]-1];
	if(isdetialprint)
	{
		cout<<"IP-1:";
		print64(text2);
		cout<<endl;
	}
}

void converse(bitset<64> &bitvec)
{
	for(int i=0;i<32;i++)
		if(bitvec[i]!=bitvec[63-i])
		{
			bitvec.flip(i);
			bitvec.flip(63-i);
		}
}
/* 加密子程序 */
void DES_Encrypt(bitset<64> Plaintext,bitset<64> & key,bitset<64> &Ciphertext)
{
	DES_Function(Plaintext,Ciphertext,key,Encrypt);
};

/* 解密子程序 */
void DES_Decrypt(bitset<64> &Plaintext,bitset<64> key,bitset<64> Ciphertext)
{
	DES_Function(Ciphertext,Plaintext,key,Decrypt);
};


void testProgram()
{
	unsigned char ch;
	bool isInput=false;
	int i,j,CheckParity;
	string str1("0000000100100011010001010110011110001001101010111100110111101111");
	string str2("0001001100110100010101110111100110011011101111001101111111110001");
	string str3("1010101010101010101010101010101010101010101010101010101010101010");
	bitset<64> Plaintext(str1),Key(str2),Ciphertext(str3);

	converse(Plaintext);
	converse(Key);
	/* 让计算机自动执行还是亲自输入 */
	cout<<"请选择是让计算机自动执行还是亲自输入,让计算机自动执行吗?(Y/N)";
	cin>>ch;
	if((ch=='n')||(ch=='N')) isInput=true;

	/* 读入原文和密钥*/
	if(isInput)
	{
		/* 读入原文 */
		cout<<"请输入要加密的原文或者原文的Hash值(任意8个字符):"<<endl;	
		for(i=0;i<8;i++)
		{
			cin>>ch;
			for(j=0;j<8;j++)
			{
				Plaintext[i*8+7-j]=ch&1;
				ch>>=1;
			}
		}

		/* 读入密钥并加入奇偶校验位 */
		cout<<"请输入密钥(8个字符):"<<endl;	
		for(i=0;i<8;i++)
		{
			cin>>ch;
			for(j=0;j<8;j++)
			{
				if(ch&1)
					Key.set((8-i)*8-(8-j));
				else Key.reset((8-i)*8-(8-j));
				ch>>=1;
			}
			CheckParity=((Key.count()%2==0)?0:1);//奇偶校验,如果有奇数个1,则奇偶校验位为1,否则为零
			if(CheckParity) 
				Key.set((8-i)*8-1);
			else Key.reset((8-i)*8-1);
		}
	}
	else
	{
		cout<<"要加密的原文或者原文的Hash值为:"<<endl;
		print64(Plaintext);
		cout<<"密钥为:"<<endl;
		print64(Key);
	}

	/* 用DES对原文进行加密操作 */
	cout<<endl<<"正在对原文进行加密..."<<endl<<endl;
	DES_Encrypt(Plaintext,Key,Ciphertext);

	/* 加密后输出 */
	cout<<"得到的密文是:"<<endl;
	print64(Ciphertext);
	if(isInput)
	{
		cout<<"相应的字符串为:";
		for(i=0;i<8;i++)
		{
			for(j=0;j<8;j++)
			{
				ch=Ciphertext[i*8+j];
				ch<<=1;
			}
		}
		converse(Ciphertext);
		string str(Ciphertext.to_string());
		for(i=0;i<8;i++)
		{
			bitset<8> text(str,i*8,8);
			ch=text.to_ulong();
			cout<<ch;
		}
		cout<<endl;
		converse(Ciphertext);
		cout<<endl;
	}
	/* 用DES对密文进行解密操作 */	
	cout<<"开始解密?(Y/N)..."<<endl;
	cin>>ch;
	if(ch=='n') 
	{
		cout<<"Good Bye!"<<endl;
		exit(0);
	}
	DES_Decrypt(Plaintext,Key,Ciphertext);

	/* 解密后输出 */
	cout<<"得到的原文是:"<<endl;
	if(isInput)
	{
		for(i=0;i<8;i++)
		{
			for(j=0;j<8;j++)
			{
				ch=Plaintext[i*8+j];
				ch<<=1;
			}
		}
		converse(Plaintext);
		string str(Plaintext.to_string());
		for(i=0;i<8;i++)
		{
			bitset<8> text(str,i*8,8);
			ch=text.to_ulong();
			cout<<ch;
		}
		cout<<endl;
	}
	else print64(Plaintext);
};
void useProgram(int flag)
{

	if((flag!=Encrypt)&&(flag!=Decrypt))
	{
		cerr<<"error:unknow parameter!\n";
		exit(0);
	}
	ifstream infile,keyfile;
	ofstream outfile;
	typedef	bitset<8> bits8type;	
	vector<bits8type> text;
	bitset<8> bits8;
	bitset<64> Plaintext,Key,Ciphertext;
	char * filename;
	char ch;
	string str;
	int i,j,CheckParity;
	
	if(flag==Encrypt) filename="plain.txt";
	else if(flag==Decrypt) filename="cipher.txt";
	infile.open(filename,ios_base::in);
	/* 确认文件是否正确打开 */
	if(!infile)
	{
		cerr<<"error:unable to open input file!\n";
		exit(0);
	}

	/* 从文件读入明文(或密文)的每个字符并存放到text中 */
	while(!infile.eof())
	{
		infile.get(ch);	
		for(j=0;j<8;j++)
		{
			bits8[7-j]=ch&1;
			ch>>=1;
		}		
		text.push_back(bits8);
	}
	infile.close();
	text.pop_back();	

	/*如果字符总数不是8的整数倍,用空字符填充使之成为8的整数倍*/
	int size=text.size()%8;
	if(size!=0)
		for(i=0;i<(8-size%8);i++)
		{
			ch=' ';
			for(j=0;j<8;j++)
			{
				bits8[7-j]=ch&1;
				ch>>=1;
			}		
			text.push_back(bits8);
		}	

	/* 读入密钥并加入奇偶校验位 */
	keyfile.open("key.txt",ios_base::in);
	if(!keyfile)
	{
		cerr<<"error:unable to open input file!\n";
		exit(0);
	}

	for(i=0;i<8;i++)
	{
		keyfile.get(ch);
		for(j=0;j<8;j++)
		{
			if(ch&1)
				Key.set((8-i)*8-(8-j));
			else Key.reset((8-i)*8-(8-j));
			ch>>=1;
		}
		CheckParity=((Key.count()%2==0)?0:1);//奇偶校验,如果有奇数个1,则奇偶校验位为1,否则为零
		if(CheckParity) 
			Key.set((8-i)*8-1);
		else Key.reset((8-i)*8-1);
	}	

	/* 打开文件准备输出 */
	if(flag==Encrypt) filename="cipher.txt";
	else if(flag==Decrypt) filename="plaint.txt";
	else
	{
		cerr<<"error:unknow parameter!\n";
	}
	outfile.open(filename,ios_base::out);
	if(!outfile)
	{
		cerr<<"error:unable to open output file!\n";
		exit(0);
	}
	

	/* 分组并加密(解密) */
	int groups=text.size()/8;
	for(i=0;i<groups;i++)
	{
		/* 将第i组加密 */
		for(j=0;j<8;j++)
		{
			for(int k=0;k<8;k++)
			{
				Plaintext[8*j+k]=text[i*8+j][k];
			}
		}//end of j
		
		if(flag==Encrypt)
		{
			cout<<endl<<"正在对第"<<i<<"组进行加密..."<<endl;
			DES_Encrypt(Plaintext,Key,Ciphertext);
			converse(Ciphertext);
			str=Ciphertext.to_string();
		}
		else if(flag==Decrypt)	
		{
			cout<<endl<<"正在对第"<<i<<"组进行解密..."<<endl;
			DES_Decrypt(Plaintext,Key,Ciphertext);
			converse(Plaintext);
			str=Plaintext.to_string();		
		}		

		/* 将密文(明文)写入文件*/

		for(j=0;j<8;j++)
		{
			bitset<8> temp(str,j*8,8);
			ch=temp.to_ulong();			
			outfile.put(ch);			
		}//end of j
	}//end of i
	if(flag==Encrypt)
		cout<<"加密结束,已将密文存入copher.txt文件中!"<<endl;
	else cout<<"解密结束,已将明文存入plaint.txt文件中!"<<endl;
	outfile.close();
};
void main()
{
	char choice;
	string	welcome=
		"////////////////////////////////////////////////////////////////////////////\n"
		"//                                                                        //\n"
		"//=========================欢迎使用DES密码系统============================//\n"
		"//                                                                        //\n"
		"//说明:从屏幕输入明文(只能是8个字符)和密钥请按1;                          //\n"
		"//     从文件读入明文(长度无限制)和密钥进行加密请按2;                     //\n" 	
		"//     从文件读入密文(长度无限制)和密钥进行解密请按3;                     //\n"                          //\n"
		"//     退出程序请按0;                                                     //\n"
		"//注:  如果从文件读入,则需要将明文存入in_file.txt文件中,将密钥存入        //\n"
		"//     key_file.txt文件中,如果解密还需将密文存入文件中.                   //\n"
		"//                                                                        //\n"
		"// 作者:李德 ld80118@sohu.com    版本:1.1  开发日期:2003.4                //\n"
		"////////////////////////////////////////////////////////////////////////////\n" ;
	cout<<welcome;
	do
	{
		cout<<"您的选择是:";
		cin>>choice;
		switch(choice)
		{
		case'0':exit(0);
		case'1':isdetialprint=true;//将各个步骤进行详细打印
			testProgram();
			break;
		case'2':useProgram(Encrypt);break;
		case'3':useProgram(Decrypt);break;
		default:cout<<"错您的输入有误,请重试!"<<endl;
		}
	}while((choice!='0')&&(choice!='1')&&(choice!='2')&&(choice!='3'));
}

⌨️ 快捷键说明

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