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

📄 des.cpp

📁 一款和不错的用VC实现的DES算法,希望对大家对提意见,
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<math.h>
#include<iostream.h>
void main()
{
	//////////////////////ketT[]是书中45页的表pc-1
int	ketT[56]={  56, 48, 40, 32, 24, 16,  8,  0,
                57, 49, 41, 33, 25, 17,  9,  1,
                58, 50, 42, 34, 26, 18, 10,  2,
                59, 51, 43, 35,62, 54, 46, 38, 
				30, 22, 14,  6,61, 53, 45, 37, 
				29, 21, 13,  5,60, 52, 44, 36, 
				28, 20, 12,  4,27, 19, 11,  3 } ;
        cout<<ketT[22]<<endl; // 对密钥key[64]实施换位变换得密钥keyT[56].


	

		//把变换后的密钥等分成两部分,前28位记为C, 后28位记为D.
    int C[28];
	int D[28];
	int i,j;
	cout<<"C:"<<endl;

	for(i=0;i<28;i++)
	{C[i]=ketT[i];cout<<C[i]<<" ";}
	cout<<endl;
		cout<<"D:"<<endl;
	for(i=0;i<28;i++)
	{D[i]=ketT[i+28];cout<<D[i]<<" ";}
    cout<<endl;



	// 串联C,D,得到一个56位数K[56]
	int hj;
     int E[28];
	 int F[28];
	 int K[16][56];
     for(hj=0;hj<16;hj++)
	 {
      
	   switch (hj)
	  {
	  case 0:
		   for(j=0;j<28;j++)
		   {
			   E[j]=C[j];
			   F[j]=D[j];
		   }
		   for(j=0;j<28;j++)
		   {
			   if(j==27)
			   {C[j]=E[0];D[j]=F[0];}
			   else
			   {C[j]=E[j+1];D[j]=F[j+1];}
			 
		   }
///.//////////////////////////
           for(i=0;i<28;i++)
		   {
		     K[0][i]=C[i];
		   }
		   for(j=0;j<28;j++)
		   {
		    K[0][j+28]=D[j];
		   }
		   cout<<"k0::";
           for(i=0;i<56;i++)
           {cout<<K[0][i]<<" ";}


	/*cout<<"C:"<<endl;
		  for(j=0;j<28;j++)
		  {
			  
			  cout<<C[j]<<" ";}
		  cout<<endl;
  cout<<"D:"<<endl;
		  for(j=0;j<28;j++)
		  {
			  
			  cout<<D[j]<<" ";}*/
		  cout<<endl;break;

	   case 1:
		   for(j=0;j<28;j++)
		   {
			   E[j]=C[j];
			   F[j]=D[j];
		   }
		   for(j=0;j<28;j++)
		   {
			   if(j==27)
			   {C[j]=E[0];D[j]=F[0];}
			   else
			   {C[j]=E[j+1];D[j]=F[j+1];}
			 
		   }

		   cout<<"k1::";
		   for(i=0;i<28;i++)
		   {
		     K[1][i]=C[i];
		   }
		   for(j=0;j<28;j++)
		   {
		    K[1][j+28]=D[j];
		   }
		   for(i=0;i<56;i++)
           {cout<<K[1][i]<<" ";}
           //for(i=0;i<56;i++)
          
	/*cout<<"C:"<<endl;
		  for(j=0;j<28;j++)
		  {
			  
			  cout<<C[j]<<" ";}
		  cout<<endl;
  cout<<"D:"<<endl;
		  for(j=0;j<28;j++)
		  {
			  
			  cout<<D[j]<<" ";}*/
		  cout<<endl;break;
	   case 8:
		   for(j=0;j<28;j++)
		   {
			   E[j]=C[j];
			   F[j]=D[j];
		   }
		   for(j=0;j<28;j++)
		   {
			   if(j==27)
			   {C[j]=E[0];D[j]=F[0];}
			   else
			   {C[j]=E[j+1];D[j]=F[j+1];}
			 
		   }
		   cout<<"k8::";
		   for(i=0;i<28;i++)
		   {
		     K[8][i]=C[i]; 
		   }
		   for(j=0;j<28;j++)
		   {
		    K[8][j+28]=D[j];
		   }
		   for(i=0;i<56;i++)
           {cout<<K[8][i]<<" ";}
/*	cout<<"C:"<<endl;
		  for(j=0;j<28;j++)
		  {
			  
			  cout<<C[j]<<" ";}
		  cout<<endl;
  cout<<"D:"<<endl;
		  for(j=0;j<28;j++)
		  {
			  
			  cout<<D[j]<<" ";}*/
		  cout<<endl;break;
	   case 15:
		   for(j=0;j<28;j++)
		   {
			   E[j]=C[j];
			   F[j]=D[j];
		   }
		   for(j=0;j<28;j++)
		   {
			   if(j==27)
			   {C[j]=E[0];D[j]=F[0];}
			   else
			   {C[j]=E[j+1];D[j]=F[j+1];}
			 
		   }
		   cout<<"k15::";
		   for(i=0;i<28;i++)
		   {
		     K[15][i]=C[i]; 
		   }
		   for(j=0;j<28;j++)
		   {
		    K[15][j+28]=D[j];
		   }
		   for(i=0;i<56;i++)
           {cout<<K[15][i]<<" ";}
/*	cout<<"C:"<<endl;
		  for(j=0;j<28;j++)
		  {
			  
			  cout<<C[j]<<" ";}
		  cout<<endl;
  cout<<"D:"<<endl;
		  for(j=0;j<28;j++)
		  {
			  
			  cout<<D[j]<<" ";}*/
		  cout<<endl;break;
	   default:
		   for(j=0;j<28;j++)
		   {
			   E[j]=C[j];F[j]=D[j];
		   }
		   for(j=0;j<28;j++)
		   {
			   if(j==26)
			   {C[j]=E[0];D[j]=F[0];}
			   else
			   {if(j==27)
				   {C[j]=E[1];D[j]=F[1];}
				   else
				   {C[j]=E[j+2];D[j]=F[j+2];}}
			 
		   }
		   cout<<"k"<<hj<<"::";
		   for(j=0;j<28;j++)
		   {
		     K[hj][j]=C[j]; 
		   }
		   for(j=0;j<28;j++)
		   {
		    K[hj][j+28]=D[j];
		   }
		   for(j=0;j<56;j++)
           {cout<<K[hj][j]<<" ";}
		  /*for(j=0;j<28;j++)
		  cout<<C[j]<<" ";
		  cout<<endl;
		  for(j=0;j<28;j++)
		  cout<<D[j]<<" ";*/
		  cout<<endl;break;

	  }
	  
	 }
cout<<endl;cout<<endl;
cout<<"as"<<endl;
	 for(i=0;i<16;i++)
	 {for(j=0;j<56;j++)
	 {cout<<K[i][j]<<" ";}
	 cout<<endl;}


cout<<endl;cout<<endl;




	 
////产生48位子密钥sonkey[i][48],zmy[i][j]是保存密钥初始表中的j位置
//hg[]是书中45页的表pc-2
	int hg[48]= {13,16,10,23,0,4,2,27,14,5,20,9,
                 22,18,11,3,25,7,15,6,26,19,12,1,
                 40,51,30,36,46,54,29,39,50,44,32,47,
                 43,48,38,55,33,52,45,41,49,35,28,31};
    int zmy[16][48];
	int r;
	cout<<"产生16个48位子密钥的位置置换为:"<<endl;
	  for(i=0;i<16;i++)
	  {  
		  for(j=0;j<48;j++)
		  {
			  r=hg[j];
			   zmy[i][j]=K[i][r];
		       cout<<zmy[i][j]<<" ";
		  }

	      cout<<endl;
	  }
	  int miyao[64]={0,0,1,1,1,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,1,
			           0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};;
	  int sonkey[16][48];
	  int myao;
	  int zhong;
	  /*cout<<"请输入一个64位的初始密钥:"<<endl;
	for(i=0;i<64;i++)
	{
		cin>>myao;
	    miyao[i]=myao;
	}*/
	  cout<<"产生的16个密钥是:(二进制数)"<<endl;
    for(i=0;i<16;i++)
	{
		cout<<"K"<<i<<endl;
		  for(j=0;j<48;j++)
          {
		    zhong=zmy[i][j];
			sonkey[i][j]=miyao[zhong];
			zhong=0;
			cout<<sonkey[i][j]<<" ";
		  }
      cout<<endl;
	}

     
///////////////////////////////对待加密的数据块DATA[64]置换位变换表(书43页IP表)

	 int change[64]={ 58,50,42,34,26,18,10,2,
                      60,52,44,36,28,20,12,4,
                      62,54,46,38,30,22,14,6,
                      64,56,48,40,32,24,16,8, //->L[0]
                      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 }; //->R[0]

	 ////////////////逆初始置换表nibiao[](书43页IP~表)

	 int nibiao[64]={40,8,48,16,56,24,64,32,
	                 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};
	 ////////////////////////////////////////////////////////////////////
		   //构造8个s 盒
		   
                   
		  int S[8][4][16]={14,4,13,1,2,15,11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
		                    0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
		                    4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
		                   15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,//s1
                   
		                15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
						 3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
						 0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
						13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,//s2
                    
		                10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
						13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
						13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
						 1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,//s3
                    
		                 7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
						13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
						10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
						3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,//s4
                    
		                 2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
						14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
						4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
						11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,//s5

		                12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,

⌨️ 快捷键说明

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