des.cpp

来自「一款和不错的用VC实现的DES算法,希望对大家对提意见,」· C++ 代码 · 共 692 行 · 第 1/2 页

CPP
692
字号
						10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
						 9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
						 4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,//s6
                   
		                 4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
                        13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
                         1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
                         6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,//s7
                   
		                13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
                         1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
                         7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
                         2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11};//s8
////////////////////////////////////////////////////////////////////

  //经过s置换后,将得到的数据再次置换时所用的表tmp
		  int tmp[32]={ 15,  6, 19, 20, 28, 11, 27, 16, 
						  0, 14, 22, 25,  4, 17, 30,  9, 
						  1,  7, 23, 13, 31, 26,  2,  8, 
						 18, 12, 29,  5, 21, 10,  3, 24};









///////		 / ////////////////////////////////////////////////////////////
          //根据下面表格扩充32位数据R[0][i]为48位数据RR[j]。
		  int kch[48]= {31,0,1,2,3,4,  
                        3,4,5,6,7,8,  
                        7,8,9,10,11,12,  
						11,12,13,14,15,16,  
						15,16,17,18,19,20,  
						19,20,21,22,23,24,  
						23,24,25,26,27,28,  
						27,28,29,30,31,0 };
		  int kkk,jj;
		  int RR[48];
          int gg[48];//保存异或运算产生的值
		  int b1,b2,b3,b4,b5,b6,b7;
		 int ss[8];//保存由s盒替换得到的值
/////////////////////////////////////////////////	 
//由转换表转换后的64位数据块data[64]	 
		 int DATA[64]={1,0,1,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,
			           0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
	 int data[64];
	 int n,chk;
	 
	/*cout<<"请输入64位的0,1数据"<<endl;
	 for(i=0;i<64;i++)
	 {   
		 cin>>n;
	     DATA[i]=n;
	 }*/

       for(i=0;i<64;i++)
	   {
	    chk=change[i];
        data[i]=DATA[chk-1];//change中的最小值为1
		chk=0;
	   }
  
////////////////////////////////////////////////////////////
	  //将变换后的数据块分成前后两部分,前32位记为L[0][32],后32位记为R[0][32]. 
	   int L[17][32];
	   int R[17][32];
		   for(i=0;i<32;i++)
		   {
			   L[0][i]=data[i];
		       R[0][i]=data[i+32];
		   }

/////用RR[48]与子密钥sonkey[i][48]作异或运算。
		   int uj;
	for(uj=0;uj<16;uj++)
	{	  for(i=0;i<48;i++)
		  {
		    kkk=kch[i];
			RR[i]=R[uj][kkk];//扩充的48位数据RR[j]。
            jj=RR[i]+sonkey[uj][i];//以一轮进行异或运算
            if(jj==2)
			{gg[i]=0;}
			else
			{gg[i]=jj;}
		  }
		  ////////////////////////////////////////
		  ///把所得的gg[i]48位数分成8个6位数B[8][6]。1-6位为B[0][6],7-12位为B[1][6],……,43-48位为B[7][6]。
          int B[8][6];
		  for(i=0;i<6;i++)
		  {
		       B[0][i]=gg[i];
			   B[1][i]=gg[i+6];
			   B[2][i]=gg[i+12];
			   B[3][i]=gg[i+18];
			   B[4][i]=gg[i+24];
			   B[5][i]=gg[i+30];
			   B[6][i]=gg[i+36];
			   B[7][i]=gg[i+42];

		  }

		  //////////////////////////////////////////////////
		  //用S密箱里的值替换B[][],保存在ss[]里
         
		 for(i=0;i<8;i++)
		 {
		 b1=2*B[i][0]+B[i][5];//b1对应s盒行值
		 b2=2*2*2*B[i][1]+2*2*B[i][2]+2*B[i][3]+B[i][4];//b2对应s盒列值
		 //用S密箱里的值S[j][m][n]替换B[][]
         b3=S[i][b1][b2];
		 ss[i]=b3;
		 b1=0;b2=0;
		 cout<<ss[i]<<" ";
		 }

		 int yuan[32];//将ss[i]化为二进制
        for(i=0;i<8;i++)
		{
		   b3=ss[i];
		   b4=b3-8;
		   if(b4>0)
		   {yuan[4*i]=1;}
		   else {yuan[4*i]=0;}
		   b5=b4-4;
		   if(b5>0)
		   {yuan[4*i+1]=1;}
		   else {yuan[4*i+1]=0;}
		   b6=b5-2;
		   if(b6>0)
		   {yuan[4*i+2]=1;}
		   else {yuan[4*i+2]=0;}
		   b7=b6-1;
		   if(b7>0)
		   {yuan[4*i+3]=1;}
		   else {yuan[4*i+3]=0;}
		}
		
 //////////////////////////////////////////////////////////////////////
        //对yuan[32]做作换位变换为tmp1[32]
		int fb;
		int tmp1[32];
		for(i=0;i<32;i++)
		{
		  fb=tmp[i];//置换表中的数值
		  tmp1[i]=yuan[fb];
          
		}////到此产生了加密函数f///



/////////////////////////把得到的结果tmp1[32]与L[i][32]作异或运算.把计算结果賦给R[i+1][32]。
		 
        for(i=0;i<32;i++)
		  {
		    
            jj=tmp1[i]+L[uj][i];//以一轮进行异或运算
            if(jj==2)
			{gg[i]=0;}
			else
			{gg[i]=jj;}
			
		}
		for(i=0;i<32;i++)
		{
	      R[uj+1][i]=gg[i];
		  L[uj+1][i]=R[uj][i];
		}
		cout<<endl;
       for(i=0;i<32;i++)
		   cout<< L[uj+1][i]<<" ";
	   cout<<endl;
		   for(i=0;i<32;i++)
			    cout<< R[uj+1][i]<<" ";
	   cout<<endl;
        
	}
	cout<<endl;cout<<endl;cout<<endl;cout<<endl;
	//////把R[16]和L[16] 顺序串联起来得到一个64位数tmp2[64]。
	int tmp2[64];
	for(i=0;i<32;i++)
	{
	  tmp2[i]=R[16][i];
	  tmp2[i+32]=L[16][i];
	}
	for(i=0;i<64;i++)
		cout<<tmp2[i]<<" ";
	cout<<endl;cout<<endl;cout<<endl;cout<<endl;
	int out[64];
	for(i=0;i<64;i++)
	{
	   kkk=nibiao[i];
       out[kkk-1]=tmp2[i];//nibiao中的最小值为1
	}

	cout<<"加密过的64位数据为:"<<endl;
	for(i=0;i<64;i++)
		cout<<out[i]<<" ";
cout<<endl;

	//////以上是对一个64位的明文进行的加密过程/////////////////////////////////////




/*	////////////////////////////////////////////////////
	  for(i=0;i<32;i++)
		   {
			   L[0][i]=tmp2[i+32];
		       R[0][i]=tmp2[i];
		   }
	 
/////用RR[48]与子密钥sonkey[i][48]作异或运算。
		  
	  for(uj=0;uj<16;uj++)
	{	 
	  
		for(i=0;i<48;i++)
		  {
		    kkk=kch[i];
			RR[i]=L[uj][kkk];//扩充的48位数据RR[j]。
			cout<<RR[i];
           jj=RR[i]+sonkey[15-uj][i];//以一轮进行异或运算
            if(jj==2)
			{gg[i]=0;}
			else
			{gg[i]=jj;}
			
		  }
	
	   
		  ////////////////////////////////////////
		  ///把所得的gg[i]48位数分成8个6位数B[8][6]。1-6位为B[0][6],7-12位为B[1][6],……,43-48位为B[7][6]。
          int B[8][6];
		  for(i=0;i<6;i++)
		  {
		       B[0][i]=gg[i];
			   B[1][i]=gg[i+6];
			   B[2][i]=gg[i+12];
			   B[3][i]=gg[i+18];
			   B[4][i]=gg[i+24];
			   B[5][i]=gg[i+30];
			   B[6][i]=gg[i+36];
			   B[7][i]=gg[i+42];

		  }

		  //////////////////////////////////////////////////
		  //用S密箱里的值替换B[][],保存在ss[]里
         
		 for(i=0;i<8;i++)
		 {
		 b1=2*B[i][0]+B[i][5];//b1对应s盒行值
		 b2=2*2*2*B[i][1]+2*2*B[i][2]+2*B[i][3]+B[i][4];//b2对应s盒列值
		 //用S密箱里的值S[j][m][n]替换B[][]
         b3=S[i][b1][b2];
		 ss[i]=b3;
		 b1=0;b2=0;
		 cout<<ss[i]<<" ";
		 }

		 int yuan[32];//将ss[i]化为二进制
        for(i=0;i<8;i++)
		{
		   b3=ss[i];
		   b4=b3-8;
		   if(b4>0)
		   {yuan[4*i]=1;}
		   else {yuan[4*i]=0;}
		   b5=b4-4;
		   if(b5>0)
		   {yuan[4*i+1]=1;}
		   else {yuan[4*i+1]=0;}
		   b6=b5-2;
		   if(b6>0)
		   {yuan[4*i+2]=1;}
		   else {yuan[4*i+2]=0;}
		   b7=b6-1;
		   if(b7>0)
		   {yuan[4*i+3]=1;}
		   else {yuan[4*i+3]=0;}
		}
		
 //////////////////////////////////////////////////////////////////////
        //对yuan[32]做作换位变换为tmp1[32]
		int fb;
		int tmp1[32];
		for(i=0;i<32;i++)
		{
		  fb=tmp[i];//置换表中的数值
		  tmp1[i]=yuan[fb];
          
		}
/////////////////////////把得到的结果tmp1[32]与R[i][32]作异或运算.把计算结果賦给L[i-1][32]。
		 
        for(i=0;i<32;i++)
		  {
		    
            jj=tmp1[i]+R[uj][i];//以一轮进行异或运算
            if(jj==2)
			{gg[i]=0;}
			else
			{gg[i]=jj;}
			
		}
		for(i=0;i<32;i++)
		{
	      L[uj+1][i]=gg[i];
		  R[uj+1][i]=L[uj][i];
		}
		cout<<endl;
       for(i=0;i<32;i++)
		   cout<< L[uj+1][i]<<" ";
	   cout<<endl;
		   for(i=0;i<32;i++)
			    cout<< R[uj+1][i]<<" ";
	   cout<<endl;
        
	}
	cout<<endl;cout<<endl;cout<<endl;cout<<endl;
	//////把R[16]和L[16] 顺序串联起来得到一个64位数tmp2[64]。

	for(i=0;i<32;i++)
	{
	  tmp2[i+32]=R[16][i];
	  tmp2[i]=L[16][i];
	}
	for(i=0;i<64;i++)
		cout<<tmp2[i]<<" ";
	cout<<endl;cout<<endl;cout<<endl;cout<<endl;
	int yout[64];
	for(i=0;i<64;i++)
	{
	   kkk=nibiao[i];
       yout[kkk-1]=tmp2[i];
	}

cout<<"明文为:"<<endl;
	for(i=0;i<64;i++)
		cout<<yout[i]<<" ";*/



}

⌨️ 快捷键说明

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