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

📄 des.cpp

📁 一款和不错的用VC实现的DES算法,希望对大家对提意见,
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -