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

📄 des1.cpp

📁 用尽可能少的代码实现DES密码算法的加密、解密功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	

    
                                                                                        /* KS Function Begin */ /* 轮密钥移位算法,用于生成进入PC-2的中间密钥 */
    if (flg)
	{
      nbrofshift = shift[iter-1];
      for (i = 0; i < (int) nbrofshift; i++) 
      {
        temp1 = kwork[0];
        temp2 = kwork[28];
        for (j = 0; j < 27; j++) 
        {
         kwork[j] = kwork[j+1];
         kwork[j+28] = kwork[j+29];
        }
        kwork[27] = temp1;
        kwork[55] = temp2;
      }
	}   
    else if (iter > 1) 
	{
      nbrofshift = shift[17-iter];
      for (i = 0; i < (int) nbrofshift; i++) 
	  {
        temp1 = kwork[27];
        temp2 = kwork[55];
        for (j = 27; j > 0; j--) 
		{
          kwork[j] = kwork[j-1];
          kwork[j+28] = kwork[j+27];
		}
        kwork[0] = temp1;
        kwork[28] = temp2;
	  }
	}
   

                                                                                        /* Permute kwork - PC2 */ /* 经过PC-2 生成轮密钥 k[i] */
    for(i=0;i<48;i++)           
       kn[i] = kwork[PC2[i]]; 

   
                                                                                        /* KS Function End */

                                                                                        /* worka XOR kn */ /* 异或运算生成Bi,准备通过s盒变换 */
    for(i = 0; i < 48; i++)
       worka[i] = worka[i] ^ kn[i];

                                                                                        /* 8 s-functions */ /* 8个s盒函数运算 */
    
	for(i=0;i<32;i++)
	{
	  if(i>=0&&i<=3)
		valindex = s1[2*worka[ 0]+worka[ 5]][2*(2*(2*worka[ 1]+worka[ 2])+worka[ 3])+worka[ 4]];
	  if(i>=4&&i<=7)
		valindex = s2[2*worka[ 6]+worka[11]][2*(2*(2*worka[ 7]+worka[ 8])+worka[ 9])+worka[10]];
	  if(i>=8&&i<=11)
		valindex = s3[2*worka[12]+worka[17]][2*(2*(2*worka[13]+worka[14])+worka[15])+worka[16]];
	  if(i>=12&&i<=15)
		valindex = s4[2*worka[18]+worka[23]][2*(2*(2*worka[19]+worka[20])+worka[21])+worka[22]];
	  if(i>=16&&i<=19)
		valindex = s5[2*worka[24]+worka[29]][2*(2*(2*worka[25]+worka[26])+worka[27])+worka[28]];
	  if(i>=20&&i<=23)
		valindex = s6[2*worka[30]+worka[35]][2*(2*(2*worka[31]+worka[32])+worka[33])+worka[34]];
	  if(i>=24&&i<=27)
		valindex = s7[2*worka[36]+worka[41]][2*(2*(2*worka[37]+worka[38])+worka[39])+worka[40]];
	  if(i>=28&&i<=31)
		valindex = s8[2*worka[42]+worka[47]][2*(2*(2*worka[43]+worka[44])+worka[45])+worka[46]];

	  valindex = valindex * 4;
	  kn[i]=binary[(i%4)+valindex];   	  
	  
	}                           /* binary[i]将si[][]中元素转化为2进制*/

	

                                                                                        /* Permute - P */ /* f函数中的P置换 */
    for(i=0;i<32;i++)
       worka[i] = kn[P[i]];                                                                    /* worka中储存f函数的值 */

                                                                                        /* bufout XOR worka */
    for (i = 0; i < 32; i++) 
	{ 
        bufout[i+32] = bufout[i] ^ worka[i];
        bufout[i] = buffer[i];
	}
 
 }                                         /* End of Iter 16轮迭代结束 */

                                                                                        /* Prepare Output */
   for (i = 0; i < 32; i++)                                                              // 最后L和R交换 
   {
     j = bufout[i];
     bufout[i] = bufout[32+i];
     bufout[32+i] = j;
   }

                                                                                        /* Inverse Initial Permutation */
   for(i=0;i<64;i++)
      buffer[i] = bufout[IP1[i]];
//	  buffer[IP[i]]=bufout[i];      //此式与上式是等价的,用哪个都一样

   printf("cipher text:\n");
    
   for(i=0;i<64;i++)
   {
		printf("%d  ",buffer[i]);
		if((i+1)%8==0)
			printf("\n");
   }

   j = 0;
   for (i = 0; i < 8; i++) 
   {
    *(dest + i) = 0x00;
    for (k = 0; k < 7; k++)
      *(dest + i) = ((*(dest + i)) + buffer[j+k]) * 2;
  
    *(dest + i) = *(dest + i) + buffer[j+7];
    j += 8;
   } 
      


}

void main()
{
	unsigned char source[(N/8+1)*8]={0x74,0x85,0x02,0xcd,0x38,0x45,0x10,0x97,
		                             0x48,0x69,0x11,0x02,0x6a,0xcd,0xff,0x31,
							         0x38,0x74,0x75,0x64,0x38,0x45,0x10,0x97},
				  dest[(N/8+1)*8],
				  source1[(N/8+1)*8],
				  inkey[8]={0x1a,0x62,0x4c,0x89,0x52,0x0d,0xec,0x46};
	int flg=1;                                        // flg=1 说明是加密 ,flg取1,0控制加、解密 ,source[]中存放的是明文,可自己修改,也可用输入语句输入
	int i;
	if(N%8==0)
	{
		for(i=0;i<N/8;i++)
	      des(&source[i*8],&dest[i*8],inkey,flg);

		printf("\nbuffer:\n");
		for(i=0;i<N;i++)
		{
			printf("%x  ",*(dest+i));
		  if((i+1)%8==0)
		    printf("\n");
	
		}
	}
	else
	{
		
		for(i=N+1;i<((N/8)+1)*8;i++)
		  source[i]=0x00;
		for(i=0;i<N/8+1;i++)
	      des(&source[i*8],&dest[i*8],inkey,flg);
	
		printf("\nbuffer:\n");
		for(i=0;i<(N/8+1)*8;i++)
	   printf("%x  ",*(dest+i));
	}
	
	flg=0;                                                  //解密过程
	if(N%8==0)
	{
		for(i=0;i<N/8;i++)
	      des(&dest[i*8],&source1[i*8],inkey,flg);
		printf("\nbuffer:\n");
		for(i=0;i<N;i++)
		{
			printf("%x  ",*(source1+i));
		  if((i+1)%8==0)
		    printf("\n");
	
		}
	}
	else
	{
		
		for(i=N+1;i<((N/8)+1)*8;i++)
		  dest[i]=0x00;
		for(i=0;i<N/8+1;i++)
	      des(&dest[i*8],&source1[i*8],inkey,flg);
	
		printf("\nbuffer:\n");
		for(i=0;i<(N/8+1)*8;i++)
	   printf("%x  ",*(source1+i));
	}
	
}

⌨️ 快捷键说明

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