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

📄 des.cpp

📁 des 密码算法 能够实现des的密钥生成和 数据加密
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			  {
				  if (j==0)
				  {
					  if(i==0) pstroutput+=sprintf(pstroutput,"/******************步骤1-2:生成子密钥**************************/\n");
					  if(i==0)pstroutput+=sprintf(pstroutput,"步骤1-2-%d-1:第%d轮循环左移,左移%d位后:\n",i,i,totRot[i]);
					  else pstroutput+=sprintf(pstroutput,"步骤1-2-%d-1:第%d轮循环左移累计%d位,在前基础上再左移%d位后:\n",i,i,totRot[i],totRot[i]-totRot[i-1]);
					  pstroutput+=sprintf(pstroutput,"左28位:\n");
				  }
				  pstroutput+=sprintf(pstroutput,"%d", pc1m[(k < (j < 28 ? 28 : 56)) ? k : k - 28]); //(j < 28 ? 28 : 56):取28则左半,取56右半,k - 28表示循环移位的
				  if (j==27) pstroutput+=sprintf(pstroutput,"\n右28位:");
				  if ((j+1)%7==0) pstroutput+=sprintf(pstroutput,"	");
				  if ((j+1)%28==0 && doEncrypt) pstroutput+=sprintf(pstroutput,"\n");
			  }
		  } /* end of for j */
		  if( doEncrypt)pstroutput+=sprintf(pstroutput,"步骤1-2-%d-2:第%d轮循环左移,累计左移%d位后左右合并得:\n",i,i,totRot[i]);
		  if( doEncrypt)for (j = 0; j < 56; j++)
		  {
			  pstroutput+=sprintf(pstroutput,"%d",(j%7+1));
			  if ((j+1)%7==0) pstroutput+=sprintf(pstroutput,"	");
		  }
		  
		  
		  if( doEncrypt)pstroutput+=sprintf(pstroutput,"\n");
		  for (j = 0; j < 56; j++)
		  {
			  //循环左移:即用右边(编号大)的位去写左边的(编号小)的位
			  k 	 = j + totRot[i];/*static const char totRot[] = 1, 2(1+1), 4(1+1+2+2,教材上前面左移几项位数之和), 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28};*/
			  pcr[j] = pc1m[(k < (j < 28 ? 28 : 56)) ? k : k - 28];//(j < 28 ? 28 : 56):取28则左半,取56右半,k - 28表示循环移位的
			  
			  if( doEncrypt)
			  {
				  pstroutput+=sprintf(pstroutput,"%d", pc1m[(k < (j < 28 ? 28 : 56)) ? k : k - 28]); //(j < 28 ? 28 : 56):取28则左半,取56右半,k - 28表示循环移位的
				  if ((j+1)%7==0) pstroutput+=sprintf(pstroutput,"	");
				  if ((j+1)%56==0 && doEncrypt) pstroutput+=sprintf(pstroutput,"\n");
			  }
		  } /* end of for j */
		  /* Rotate left and right halves independently */
		  if (doEncrypt)pstroutput+=sprintf(pstroutput,"步骤1-2-%d-3:照以下数组进行选位并排序:\n",i);
		  for (j=0; j<48; j++)//
		  {
			  if (doEncrypt)
			  {//	k			  = j % 6;
				  pstroutput+=sprintf(pstroutput,"%02d,", pc2[j]);
				  if ((j+1)%6==0 && doEncrypt) pstroutput+=sprintf(pstroutput,"|");
				  if ((j+1)%24==0 && doEncrypt)pstroutput+=sprintf(pstroutput,"\n");
			  } 
		  }
		  //		if (doEncrypt) pstroutput+=sprintf(pstroutput,"\n");
		  for (j=0; j<48; j++)//
		  {
			  /* Select bits individually, check bit that goes to kn[j] */
			  //默认是所有密钥位都为零,只是要将为1的位重置一下即可。
			  if (pcr[pc2[j] - 1])//pc2是新的56位重新编号从1到56,pcr数组下标j从0起的,所以-1
			  {
				  /* mask it in if it's there */
				  k 			= j % 6;//j/6是j/6下取整。每6位写一个字节,共8字节,每字节还有两位没用。
				  kn[i][j / 6] |= byteBit[k] >> 2;// 0200, 0100, 040, 020, 010, 04, 02, 01 //128,64,32,16,8,4,2,1
			  } /* end of if *///先右移2位,即左边2位是空着的,k如何也取不到6(32,16,8,4,2,1,0,0)再或操作取位
			  
			  if ( j==0 && doEncrypt)pstroutput+=sprintf(pstroutput,"步骤1-2-%d-3:第%d轮循环左移累计%d位,压缩置换后得到子钥K%d:\n",i,i,totRot[i],i);
			  if (doEncrypt)
			  { k			  = j % 6;
			  pstroutput+=sprintf(pstroutput,"%d", kn[i][j / 6] & (byteBit[k] >> 2) ? 1:0);
			  if ((j+1)%6==0 && doEncrypt) pstroutput+=sprintf(pstroutput,"	");
			  } 	 
			  
		  } /* end of j */
		  if( doEncrypt)pstroutput+=sprintf(pstroutput,"\n");
		  if(i==15&&doEncrypt) pstroutput+=sprintf(pstroutput,"/******************步骤1结束**************************/\n");
	  } /* end of for i */
	  
	  return;
} /* SetKey() */

  /************************************************************************
  *  Function name	 : Permute
  *  Description	 :
  * 				 :
  *  Parameters 	 : inBlock	-
  * 				 : perm 	-
  * 				 : outBlock -
  *  Returns		 : -
  *  Author 		 : Richard Shen
  * ----------------------------------------------------------------------
  *  Date	  By	   Description
  * ----------------------------------------------------------------------
  *  20Jan99  RCS	   Created.
  ************************************************************************/
  void Permute(unsigned char *inBlock, char perm[16][16][8],
	  unsigned char *outBlock
	  )
  {
	  int	i;
	  int	j;
	  char	*p;
	  char	*q;
	  char	*oBlock;
	  
	  
	  if (perm == NULL)
	  {
		  /* No permutation, just copy */
		  for (i = 8; i != 0; i--)
			  *outBlock++ = *inBlock++;
		  
		  return;
	  } /* end of if */
	  
	  /* Clear output block    */
	  memset(outBlock, 0, 8);
	  
	  for (j = 0; j < 16; j += 2)
	  {
		  oBlock =(char  *) outBlock;
		  
		  /* For each input nibble and each output byte, OR the masks together */
		  p = perm[j][(*inBlock >> 4) & 017];
		  q = perm[j + 1][*inBlock & 017];
		  for (i = 8; i != 0; i--)
			  *oBlock++ |= *p++ | *q++;
		  
		  inBlock++;
	  } /* end of for j */
	  
	  return;
  } /* Permute() */
  
	/************************************************************************
	*  Function name   : Round
	*  Description	   : Do one DES cipher round
	*				   :
	*  Parameters	   : num   -
	*				   : block -
	*  Returns		   : -
	*  Author		   : Richard Shen
	* ----------------------------------------------------------------------
	*  Date 	By		 Description
	* ----------------------------------------------------------------------
	*  20Jan99	RCS 	 Created.
  ************************************************************************/
  void Round(int doEncrypt,int num, unsigned long *block)
  {

	  unsigned long temp(0);
	  //long也是32位,0元素为左,1元素字为右
	  /*	  if (num & 1) //从0起点,奇数轮完后,1元素异或后赋给1元素。
	  block[1] ^= F(doEncrypt,block[0], kn[num]);
	  else
	  block[0] ^= F(doEncrypt,block[1], kn[num]);
	  */	
	  
	  
	  
	  long Ftemp(0);
	  int i(0);int j(0);
	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密步骤2-2-%d:第%d轮处理开始***************************\n",num,num);//) & 07
	  else pstroutput+=sprintf(pstroutput,"解密步骤2-2-%d:第%d轮处理开始***************************\n",num,num);//) & 07

	  Ftemp=F(doEncrypt,block[1], kn[num]);//调用F函数
	  
	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮开始的:block[1]\n",num);	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮开始的:block[1]\n",num);
	  else pstroutput+=sprintf(pstroutput,"解密第%d轮开始的:block[1]\n",num);
	  
	  for( i=0;i<4;i++)
	  {
		  for(j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[1]>>(3-i)*8 & byteBit[j]) ? 1:0);
		  pstroutput+=sprintf(pstroutput,"	");//8位一制表符
		  if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n"); 
		  
	  } 	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"第%d轮后的block[0]即处理前的block[1]:\n",num);
	  for( i=0;i<4;i++)
	  {
		  for( j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[1]>>(3-i)*8 & byteBit[j]) ? 1:0);
		  pstroutput+=sprintf(pstroutput,"	");//8位一制表符
		  if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n"); 
		  
	  } 
	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮前的:block[0]\n",num);
	  else pstroutput+=sprintf(pstroutput,"解密第%d轮前的:block[0]\n",num);
	  for( i=0;i<4;i++)
	  {
		  for(j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[0]>>(3-i)*8 & byteBit[j]) ? 1:0);
		  pstroutput+=sprintf(pstroutput,"	");//8位一制表符
		  if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n"); 
		  
	  } 	
	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮的F(block[1], kn[%d]):\n",num,num);
	  else pstroutput+=sprintf(pstroutput,"解密第%d轮的F(block[1], kn[%d]):\n",num,num);
	  for( i=0;i<4;i++)
	  {
		  for( j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(Ftemp>>(3-i)*8 & byteBit[j]) ? 1:0);
		  pstroutput+=sprintf(pstroutput,"	");//8位一制表符
		  if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n"); 
		  
	  } 	
	  //	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"步骤2-2-%d:第%d轮处理开始***************************\n",num,num);//) & 07
	  
	  temp = block[0]^Ftemp;
	  
	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密步骤2-3-%d F值与右半异或,互换:第%d轮的F(block[1], kn[%d])^block[0]且赋给block[1]:\n",num,num,num);
	  else pstroutput+=sprintf(pstroutput,"解密步骤2-3-%d F值与右半异或,互换:第%d轮的F(block[1], kn[%d])^block[0]且赋给block[1]:\n",num,num,num);
	  for( i=0;i<4;i++)
	  {
		  for(int j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(temp>>(3-i)*8 & byteBit[j]) ? 1:0);
		  pstroutput+=sprintf(pstroutput,"	");//8位一制表符
		  if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n"); 
		  
	  } 		 
	  
	  block[0]=block[1];
	  block[1]=temp;
	  
	  
	  
	  if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮后结果:\n",num);
	  else pstroutput+=sprintf(pstroutput,"解密第%d轮后结果:\n",num);
	  
	  for(i=0;i<4;i++)
	  {
		  for(int j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[0]>>(3-i)*8 & byteBit[j]) ? 1:0);
		  pstroutput+=sprintf(pstroutput,"	");//8位一制表符
		  if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n"); 
		  
	  } 	
	  for(i=0;i<4;i++)
	  {
		  for(int j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[1]>>(3-i)*8 & byteBit[j]) ? 1:0);
		  pstroutput+=sprintf(pstroutput,"	");//8位一制表符
		  if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n"); 
		  
	  } 		
	  
	  return;
  } /* Round() */
  
	/************************************************************************
	*  Function name   : F
	*  Description	   : The nonlinear function F(r, k), the heart of DES
	*				   :
	*  Parameters	   : r		  -
	*				   : subKey   -
	*  Returns		   : ...
	*  Author		   : Richard Shen
	* ----------------------------------------------------------------------
	*  Date 	By		 Description
	* ----------------------------------------------------------------------
	*  20Jan99	RCS 	 Created.
	************************************************************************/
//F函数处理
	long F(int doEncrypt,unsigned long r, unsigned char subKey[8])
	{
		unsigned long  rVal, rt;
		
		/*
		Run E(R) ^ K through the combined S & P boxes
		This code takes advantage of a convenient regularity in
		E, namely that each group of 6 bits in E(R) feeding
		a single S-box is a contiguous segment of R.
		*/
		unsigned long  rt0,rt1;
		
		//相当于循环右移1位
		rt0 = (r >> 1) | ((r & 1) ? 0x80000000 : 0);//((r & 1) ? 0x80000000 : 0)取出第32位 >>左补0
		//相当于循环左移1位,r始终未变
		rt1 = (r << 1) | ((r & 0x80000000) ? 1 : 0);
		if (doEncrypt) {
			pstroutput+=sprintf(pstroutput,"加密步骤F处理-A右半扩展:Right Half (循环右移花接1位后)扩展后r的48位明文:\n");//) & 07
			for(int i=0;i<48;i++){
				if(i/6==7) pstroutput+=sprintf(pstroutput,"%d", rt1  & (byteBit[i%6+2 ]) ? 1:0);//最后6位
				else pstroutput+=sprintf(pstroutput,"%d", rt0 >> 26-i/6*4 & (byteBit[i%6+2]) ? 1:0);//前面7个6位
				if ((i%6+1)%4==0) pstroutput+=sprintf(pstroutput,"	"); 
				if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n"); 
			}
		}
		else {
			pstroutput+=sprintf(pstroutput,"解密步骤F处理-A右半扩展:Right Half 扩展后r的48位明文:\n");//) & 07
			for(int i=0;i<48;i++){
				if(i/6==7) pstroutput+=sprintf(pstroutput,"%d", rt1  & (byteBit[i%6+2 ]) ? 1:0);//最后6位
				else pstroutput+=sprintf(pstroutput,"%d", rt0 >> 26-i/6*4 & (byteBit[i%6+2]) ? 1:0);//前面7个6位
				if ((i%6+1)%4==0) pstroutput+=sprintf(pstroutput,"	"); 
				if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n"); 
			}
		}
		rVal	= 0;
		unsigned long val(0);
		
		unsigned long  rValtwx[8]={0};
		unsigned char tempSubKeyByte;
		unsigned long XorValue(0),rowCol(0);
		
		//	  tempSubKeyByte=*subKey++;
		
		//	  rVal |= sp[0][((rt0 >> 26) ^ tempSubKeyByte) & 0x3f];//& 0x3f:仅取6位
		
		/*	  rValtwx[0]= sp[0][((rt0 >> 26) ^ *subKey++) & 0x3f];
		rValtwx[1]= sp[1][((rt0 >> 22) ^ *subKey++) & 0x3f];
		rValtwx[2]= sp[2][((rt0 >> 18) ^ *subKey++) & 0x3f];
		rValtwx[3]= sp[3][((rt0 >> 14) ^ *subKey++) & 0x3f];
		rValtwx[4]= sp[4][((rt0 >> 10) ^ *subKey++) & 0x3f];
		rValtwx[5]= sp[5][((rt0 >> 6) ^ *subKey++) & 0x3f];
		rValtwx[6]= sp[6][((rt0 >> 2) ^ *subKey++) & 0x3f];
		rValtwx[7]= sp[7][(rt1	^ *subKey) & 0x3f];
		*/
		for(int KeyByte=0; KeyByte<8;KeyByte++)
		{				  
			if (doEncrypt) 
			{
				pstroutput+=sprintf(pstroutput,"加密步骤F处理B:密钥字节的F处理...........\n");//) & 07
				pstroutput+=sprintf(pstroutput,"加密步骤F处理B-%d-1:第%d个6位密钥:",KeyByte,KeyByte);//) & 07
				for(int  i=0;i<6;i++)
				{
					pstroutput+=sprintf(pstroutput,"%d", subKey[KeyByte]	& (byteBit[i%6+2 ]) ? 1:0);
					if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n");	
				}
				
				pstroutput+=sprintf(pstroutput,"加密步骤F处理B-%d-1:第%d个6位数据:",KeyByte,KeyByte);//) & 07
				for( i=0;i<6;i++)
				{
					if(KeyByte<7) pstroutput+=sprintf(pstroutput,"%d", rt0 >> (26-KeyByte*4)	& (byteBit[i%6+2 ]) ? 1:0);
					else pstroutput+=sprintf(pstroutput,"%d", rt1	& (byteBit[i%6+2 ]) ? 1:0);
					if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n");
				}
				
				pstroutput+=sprintf(pstroutput,"加密步骤F处理B-%d-2:第%d次异或6位:",KeyByte,KeyByte);//) & 07
				for(i=0;i<6;i++)
				{
					if(KeyByte<7) pstroutput+=sprintf(pstroutput,"%d", (rt0 >> (26-KeyByte*4) ^ subKey[KeyByte])	& (byteBit[i%6+2 ]) ? 1:0);
					else pstroutput+=sprintf(pstroutput,"%d", (rt1 ^ subKey[KeyByte])	& (byteBit[i%6+2 ]) ? 1:0);
					if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n");	
					
				}
			}
			else 
			{

⌨️ 快捷键说明

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