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

📄 test.cpp

📁 应用编码与计算机密码学>程序 如果好的话请发言
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   plaintext_bitstream.No_2 = temp.No_6;
   plaintext_bitstream.No_3 = temp.No_3;
   plaintext_bitstream.No_4 = temp.No_1;
   plaintext_bitstream.No_5 = temp.No_4;
   plaintext_bitstream.No_6 = temp.No_8;
   plaintext_bitstream.No_7 = temp.No_5;
   plaintext_bitstream.No_8 = temp.No_7;
}
void ReverseIP(packed_data& plaintext_bitstream)
{ 
//**********以下对明文做IP的逆置换=(4 1 3 5 7 2 8 6)**********
   packed_data temp;
   CopyBitStream(temp,plaintext_bitstream);
   plaintext_bitstream.No_1 = temp.No_4;
   plaintext_bitstream.No_2 = temp.No_1;
   plaintext_bitstream.No_3 = temp.No_3;
   plaintext_bitstream.No_4 = temp.No_5;
   plaintext_bitstream.No_5 = temp.No_7;
   plaintext_bitstream.No_6 = temp.No_2;
   plaintext_bitstream.No_7 = temp.No_8;
   plaintext_bitstream.No_8 = temp.No_6;
}
void EP(packed_data& right_plaintext_bitstream,packed_data& EP_bitstream)
{
//**********以下对明文右半部分做E/P(1 2 3 4)=(4 1 2 3 2 3 4 1)**********
   EP_bitstream.No_1 = right_plaintext_bitstream.No_8;
   EP_bitstream.No_2 = right_plaintext_bitstream.No_5;
   EP_bitstream.No_3 = right_plaintext_bitstream.No_6;
   EP_bitstream.No_4 = right_plaintext_bitstream.No_7;
   EP_bitstream.No_5 = right_plaintext_bitstream.No_6;
   EP_bitstream.No_6 = right_plaintext_bitstream.No_7;
   EP_bitstream.No_7 = right_plaintext_bitstream.No_8;
   EP_bitstream.No_8 = right_plaintext_bitstream.No_5;
}
void XOR1(packed_data& EP_bitstream,packed_data& K1_bitstream,packed_data& EP_XOR_K1_bitstream)
{
//**********以下对E/P_bitstream与K1作异或运算**********
   char ep,K1,ep_xor_K1;
   ToChar(EP_bitstream,ep);
   ToChar(K1_bitstream,K1);
   ep_xor_K1 = ep^K1;
   ToBitStream(ep_xor_K1,EP_XOR_K1_bitstream);
}
void S0(packed_data& left_EP_XOR_K1_bitstream,packed_data& S0_twobit_output)
{
//**********以下利用密码盒S0得到two bit输出**********
	int S0[4][4] = {{1,0,3,2}
	               ,{3,2,1,0}
				   ,{0,2,1,3}
				   ,{3,1,3,2}};
	int i = left_EP_XOR_K1_bitstream.No_1*2 +left_EP_XOR_K1_bitstream.No_4;
    int j = left_EP_XOR_K1_bitstream.No_2*2 +left_EP_XOR_K1_bitstream.No_3;
    S0_twobit_output.No_1 = S0[i][j]/2;
    S0_twobit_output.No_2 = S0[i][j]%2;
}
void S1(packed_data& right_EP_XOR_K1_bitstream,packed_data& S1_twobit_output)
{
//**********以下利用密码盒S1得到two bit输出**********
	int S1[4][4] = {{0,1,2,3}
	               ,{2,0,1,3}
				   ,{1,0,3,2}
				   ,{2,1,0,0}};
	int i = right_EP_XOR_K1_bitstream.No_5*2 +right_EP_XOR_K1_bitstream.No_8;
    int j = right_EP_XOR_K1_bitstream.No_6*2 +right_EP_XOR_K1_bitstream.No_7;
    S1_twobit_output.No_3 = S1[i][j]/2;
    S1_twobit_output.No_4 = S1[i][j]%2;
}
void P4(packed_data& S0S1_output)
{
//**********以下对S0S1-four bitstream作P4=(2 4 3 1)置换**********
   packed_data temp;
   CopyBitStream(temp,S0S1_output);
   S0S1_output.No_1 = temp.No_2;
   S0S1_output.No_2 = temp.No_4;
   S0S1_output.No_3 = temp.No_3;
   S0S1_output.No_4 = temp.No_1;
}
void XOR2(packed_data& S0S1_output,packed_data& left_plaintext_bitstream,packed_data& left_XOR_S0S1_bitstream)
{
//**********以下对P4和plaintext的左部分作异或运算**********   
   if(S0S1_output.No_1 == left_plaintext_bitstream.No_1)
	   left_XOR_S0S1_bitstream.No_1 = 0; 
   else left_XOR_S0S1_bitstream.No_1 = 1;
   if(S0S1_output.No_2 == left_plaintext_bitstream.No_2)
	   left_XOR_S0S1_bitstream.No_2 = 0; 
   else left_XOR_S0S1_bitstream.No_2 = 1;
   if(S0S1_output.No_3 == left_plaintext_bitstream.No_3)
	   left_XOR_S0S1_bitstream.No_3 = 0; 
   else left_XOR_S0S1_bitstream.No_3 = 1;
   if(S0S1_output.No_4 == left_plaintext_bitstream.No_4)
	   left_XOR_S0S1_bitstream.No_4 = 0; 
   else left_XOR_S0S1_bitstream.No_4 = 1;
}
void SW(packed_data& left_XOR_S0S1_bitstream,packed_data& right_plaintext_bitstream,packed_data& second_plaintext_bitstream)
{
	second_plaintext_bitstream.No_1 = right_plaintext_bitstream.No_5;
    second_plaintext_bitstream.No_2 = right_plaintext_bitstream.No_6;
    second_plaintext_bitstream.No_3 = right_plaintext_bitstream.No_7;
    second_plaintext_bitstream.No_4 = right_plaintext_bitstream.No_8;
    second_plaintext_bitstream.No_5 = left_XOR_S0S1_bitstream.No_1;
    second_plaintext_bitstream.No_6 = left_XOR_S0S1_bitstream.No_2;
    second_plaintext_bitstream.No_7 = left_XOR_S0S1_bitstream.No_3;
    second_plaintext_bitstream.No_8 = left_XOR_S0S1_bitstream.No_4;
}
void Encryption(packed_data& plaintext,packed_data& ciphertext,packed_data& K1,packed_data& K2)
{

//******************************IP******************************
	IP(plaintext);                     //IP置换
    cout << endl  << "IP置换后明文:" << endl;	
	PrintBitStream(plaintext);

//******************************f(k)_1******************************
	packed_data EP_bitstream;          
	EP(plaintext,EP_bitstream);        //E/P扩展置换
    cout <<"**************************************************" << endl
         <<"E/P扩展置换:" << endl;	
    PrintBitStream(EP_bitstream);
   
	packed_data EP_XOR_K1_bitstream;
	XOR1(EP_bitstream,K1,EP_XOR_K1_bitstream);//(E/P)^K1
    cout <<"**************************************************" << endl
         <<"E/P扩展置换&K1作异或运算:" << endl;
    PrintBitStream(EP_XOR_K1_bitstream);
	
	packed_data S0S1_output;
    S0(EP_XOR_K1_bitstream,S0S1_output);  //密码盒S0
    cout <<"**************************************************" << endl
         <<"密码盒S0输出:" << endl;
	cout << S0S1_output.No_1 << S0S1_output.No_2 << endl;
    
	S1(EP_XOR_K1_bitstream,S0S1_output);  //密码盒S1
    cout <<"**************************************************" << endl
         <<"密码盒S1输出:" << endl;
	cout << S0S1_output.No_3 << S0S1_output.No_4 << endl;
    
	P4(S0S1_output);                       //P4置换
    cout <<"**************************************************" << endl
         <<"P4置换:" << endl;
	cout << S0S1_output.No_1 << S0S1_output.No_2
		 << S0S1_output.No_3 << S0S1_output.No_4 << endl;
    
	packed_data left_XOR_S0S1_bitstream;   //P4^明文的左半部分
	XOR2(S0S1_output,plaintext,left_XOR_S0S1_bitstream);
    cout <<"**************************************************" << endl
         <<"明文的左半部分与P4作异或运算:" << endl;
	cout << left_XOR_S0S1_bitstream.No_1 << left_XOR_S0S1_bitstream.No_2
		 << left_XOR_S0S1_bitstream.No_3 << left_XOR_S0S1_bitstream.No_4 << endl;

//*******************************SW*********************************
	packed_data second_plaintext;          //SW运算 
  	SW(left_XOR_S0S1_bitstream,plaintext,second_plaintext);
    cout <<"**************************************************" << endl
         <<"SW运算:" << endl;
	PrintBitStream(second_plaintext);

//******************************f(k)_2******************************
    packed_data second_EP_bitstream;          
	EP(second_plaintext,second_EP_bitstream);        //E/P扩展置换
    cout <<"**************************************************" << endl
         <<"E/P扩展置换:" << endl;	
    PrintBitStream(second_EP_bitstream);
   
	packed_data second_EP_XOR_K2_bitstream;
	XOR1(second_EP_bitstream,K2,second_EP_XOR_K2_bitstream);//(E/P)^K2
    cout <<"**************************************************" << endl
         <<"E/P扩展置换&K2作异或运算:" << endl;
    PrintBitStream(second_EP_XOR_K2_bitstream);
	
	packed_data second_S0S1_output;
    S0(second_EP_XOR_K2_bitstream,second_S0S1_output);  //密码盒S0
    cout <<"**************************************************" << endl
         <<"密码盒S0输出:" << endl;
	cout << second_S0S1_output.No_1 << second_S0S1_output.No_2 << endl;
    
	S1(second_EP_XOR_K2_bitstream,second_S0S1_output);  //密码盒S1
    cout <<"**************************************************" << endl
         <<"密码盒S1输出:" << endl;
	cout << second_S0S1_output.No_3 << second_S0S1_output.No_4 << endl;
    
	P4(second_S0S1_output);                       //P4置换
    cout <<"**************************************************" << endl
         <<"P4置换:" << endl;
	cout << second_S0S1_output.No_1 << second_S0S1_output.No_2
		 << second_S0S1_output.No_3 << second_S0S1_output.No_4 << endl;
    
	packed_data second_left_XOR_S0S1_bitstream;   //P4^明文的左半部分
	XOR2(second_S0S1_output,second_plaintext,second_left_XOR_S0S1_bitstream);
    cout <<"**************************************************" << endl
         <<"明文的左半部分与P4作异或运算:" << endl;
	cout << second_left_XOR_S0S1_bitstream.No_1 
		 << second_left_XOR_S0S1_bitstream.No_2
		 << second_left_XOR_S0S1_bitstream.No_3 
		 << second_left_XOR_S0S1_bitstream.No_4 
		 << endl;

//******************************ReverseIP******************************
	packed_data input_ReverseIP; 
    input_ReverseIP.No_1 = second_left_XOR_S0S1_bitstream.No_1;
    input_ReverseIP.No_2 = second_left_XOR_S0S1_bitstream.No_2;
	input_ReverseIP.No_3 = second_left_XOR_S0S1_bitstream.No_3;
	input_ReverseIP.No_4 = second_left_XOR_S0S1_bitstream.No_4;
	input_ReverseIP.No_5 = second_plaintext.No_5;
	input_ReverseIP.No_6 = second_plaintext.No_6;
	input_ReverseIP.No_7 = second_plaintext.No_7;
	input_ReverseIP.No_8 = second_plaintext.No_8;
    ReverseIP(input_ReverseIP);

//******************************产生密文******************************
	CopyBitStream(ciphertext,input_ReverseIP);
    cout <<"**************************************************" << endl
         <<"产生的密文:" << endl;
	PrintBitStream(ciphertext);
}
void Decryption(packed_data& ciphertext,packed_data& plaintext,packed_data& K1,packed_data& K2)
{
//******************************IP******************************
	IP(ciphertext);                     //IP置换
    cout <<"**************************************************" << endl
         <<"IP置换后密文:" << endl;	
	PrintBitStream(ciphertext);

//******************************f(k)_2******************************
	packed_data EP_bitstream;          
	EP(ciphertext,EP_bitstream);        //E/P扩展置换
    cout <<"**************************************************" << endl
         <<"E/P扩展置换:" << endl;	
    PrintBitStream(EP_bitstream);
   
	packed_data EP_XOR_K2_bitstream;
	XOR1(EP_bitstream,K2,EP_XOR_K2_bitstream);//(E/P)^K2
    cout <<"**************************************************" << endl
         <<"E/P扩展置换&K2作异或运算:" << endl;
    PrintBitStream(EP_XOR_K2_bitstream);
	
	packed_data S0S1_output;
    S0(EP_XOR_K2_bitstream,S0S1_output);  //密码盒S0
    cout <<"**************************************************" << endl
         <<"密码盒S0输出:" << endl;
	cout << S0S1_output.No_1 << S0S1_output.No_2 << endl;
    
	S1(EP_XOR_K2_bitstream,S0S1_output);  //密码盒S1
    cout <<"**************************************************" << endl
         <<"密码盒S1输出:" << endl;
	cout << S0S1_output.No_3 << S0S1_output.No_4 << endl;
    
	P4(S0S1_output);                       //P4置换
    cout <<"**************************************************" << endl
         <<"P4置换:" << endl;
	cout << S0S1_output.No_1 << S0S1_output.No_2
		 << S0S1_output.No_3 << S0S1_output.No_4 << endl;
    
	packed_data left_XOR_S0S1_bitstream;   //P4^明文的左半部分
	XOR2(S0S1_output,ciphertext,left_XOR_S0S1_bitstream);
    cout <<"**************************************************" << endl
         <<"明文的左半部分与P4作异或运算:" << endl;
	cout << left_XOR_S0S1_bitstream.No_1 << left_XOR_S0S1_bitstream.No_2
		 << left_XOR_S0S1_bitstream.No_3 << left_XOR_S0S1_bitstream.No_4 << endl;

//*******************************SW*********************************
	packed_data second_ciphertext;          //SW运算 
  	SW(left_XOR_S0S1_bitstream,ciphertext,second_ciphertext);
    cout <<"**************************************************" << endl
         <<"SW运算:" << endl;
	PrintBitStream(second_ciphertext);

//******************************f(k)_1******************************
    packed_data second_EP_bitstream;          
	EP(second_ciphertext,second_EP_bitstream);        //E/P扩展置换
    cout <<"**************************************************" << endl
         <<"E/P扩展置换:" << endl;	
    PrintBitStream(second_EP_bitstream);
   
	packed_data second_EP_XOR_K1_bitstream;
	XOR1(second_EP_bitstream,K1,second_EP_XOR_K1_bitstream);//(E/P)^K1
    cout <<"**************************************************" << endl
         <<"E/P扩展置换&K1作异或运算:" << endl;
    PrintBitStream(second_EP_XOR_K1_bitstream);
	
	packed_data second_S0S1_output;
    S0(second_EP_XOR_K1_bitstream,second_S0S1_output);  //密码盒S0
    cout <<"**************************************************" << endl
         <<"密码盒S0输出:" << endl;
	cout << second_S0S1_output.No_1 << second_S0S1_output.No_2 << endl;
    
	S1(second_EP_XOR_K1_bitstream,second_S0S1_output);  //密码盒S1
    cout <<"**************************************************" << endl
         <<"密码盒S1输出:" << endl;
	cout << second_S0S1_output.No_3 << second_S0S1_output.No_4 << endl;
    
	P4(second_S0S1_output);                       //P4置换
    cout <<"**************************************************" << endl
         <<"P4置换:" << endl;
	cout << second_S0S1_output.No_1 << second_S0S1_output.No_2
		 << second_S0S1_output.No_3 << second_S0S1_output.No_4 << endl;
    
	packed_data second_left_XOR_S0S1_bitstream;   //P4^明文的左半部分
	XOR2(second_S0S1_output,second_ciphertext,second_left_XOR_S0S1_bitstream);
    cout <<"**************************************************" << endl
         <<"明文的左半部分与P4作异或运算:" << endl;
	cout << second_left_XOR_S0S1_bitstream.No_1 
		 << second_left_XOR_S0S1_bitstream.No_2
		 << second_left_XOR_S0S1_bitstream.No_3 
		 << second_left_XOR_S0S1_bitstream.No_4 
		 << endl;

//******************************ReverseIP******************************
	packed_data input_ReverseIP; 
    input_ReverseIP.No_1 = second_left_XOR_S0S1_bitstream.No_1;
    input_ReverseIP.No_2 = second_left_XOR_S0S1_bitstream.No_2;
	input_ReverseIP.No_3 = second_left_XOR_S0S1_bitstream.No_3;
	input_ReverseIP.No_4 = second_left_XOR_S0S1_bitstream.No_4;
	input_ReverseIP.No_5 = second_ciphertext.No_5;
	input_ReverseIP.No_6 = second_ciphertext.No_6;
	input_ReverseIP.No_7 = second_ciphertext.No_7;
	input_ReverseIP.No_8 = second_ciphertext.No_8;
    ReverseIP(input_ReverseIP);

//******************************恢复明文***************************
	CopyBitStream(plaintext,input_ReverseIP);
    cout <<"**************************************************" << endl
         <<"恢复的明文:" << endl;
	PrintBitStream(plaintext);
}

⌨️ 快捷键说明

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