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

📄 desdenew.cpp

📁 一个基于WIN32控制台的简单的DES算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        s=s+16;
      }
      if(in[i+2]=='1')
      { 
        s=s+32;
      }
      if(in[i+1]=='1')
      { 
        s=s+64;
      }     
      out[i/8]=s;
	}
  s=0;
 }
}

/*---------------------------------------------------------------------------------------------------------------*/


void DES(char Ptxt[], char Ctxt[])   // DES加密函数定义
{
 char LStr[32];
 char RStr[32];
 char in[64];
 char out[64];
 char TempStr[32];
 char RoundK[16][48];
 void IPF(char [],char []); // IP置换函数
 void InvIPF(char [],char []); // 逆IP置换函数
 void CipherF(char [],char []);   // Cipher函数
 void XOR32(char [], char[]);     // 32bit异或函数
 void KeyEx(char [], char [][48]);     // 密钥生成函数
 
 IPF(Ptxt,in);

 for(int i=0;i<32;i++)   // 64bit被分成左右两组
   {
    LStr[i]=in[i]; 
   }
 for(i=32;i<64;i++)
   {
    RStr[i-32]=in[i]; 
   }
 
 
 KeyEx(KEY,RoundK);      // 利用密钥生成函数得到16轮密钥
 for(int r=1;r<=16;r++)  //DES核心算法开始
	 {
       for(i=0;i<32;i++)
	   {
         TempStr[i]=RStr[i]; 
	   }
       CipherF(RStr,RoundK[16-r]);  // 利用Cipher函数进行密钥混合
       XOR32(LStr,RStr);
       for(i=0;i<32;i++)
	   {
         LStr[i]=TempStr[i]; 
	   }
	 }//DES核心算法结束
 

 for(i=0;i<32;i++)  // 输出密文,左右两组交换位置
   {
    out[i]=RStr[i]; 
   }
 for(i=32;i<64;i++)
   {
    out[i]=LStr[i-32];
   }
 InvIPF(out,Ctxt);
} 
 
 
/*---------------------------------------------------------------------------------------------------------------*/

void CipherF(char in[], char key[])  // Cipher函数定义
{
 char Str48[48];
 char Str32[32];
 void XOR48(char [], char[]);  // 48bit异或函数
 void SboxP(char [], char[]);          // DES的S盒
 
 int n=0;
 int temp;  
 for(int i=0;i<48;i++)           // 32->48bit扩展
  {
   n=ex[i];
   temp=in[n-1];
   Str48[i]=temp;
  }

 XOR48(key,Str48);        // 48bit异或函数
 SboxP(Str48,Str32);       // 使用S盒
 
 for(i=0;i<32;i++)               // P置换
  {
   n=p32[i];
   temp=Str32[n-1];
   in[i]=temp;
  }
}


/*---------------------------------------------------------------------------------------------------------------*/


void SboxP(char in[],char out[])  // S盒定义
{
 char box[8][6];
 int j;
 int n=0;
 for(int i=0;i<8;i++)
  for(j=0;j<6;j++)
  {
   box[i][j]=in[n];
   n=n+1;
  }
 
 char x=0; 
 char y=0;  // S盒内的行列坐标(x,y)
 
 n=0;
 for(int s=1;s<=8;s++)
 {
   if(box[s-1][0]=='1')   
    {
     x=x+2;
    }
   if(box[s-1][5]=='1')
    {
     x=x+1;
    }                     // 确定行坐标x
   if(box[s-1][1]=='1')
    {
     y=y+8;
    }
   if(box[s-1][2]=='1')
    {
     y=y+4;
    }
   if(box[s-1][3]=='1')
    {
     y=y+2;
    }
   if(box[s-1][4]=='1')
    {
     y=y+1;               
    }                     // 确定列坐标y
   
   switch(sbox[s-1][x][y]) // 0至15的整数转化为4bit二进制串
   {
    case 0 : 
		out[n]='0'; out[n+1]='0'; out[n+2]='0'; out[n+3]='0'; 
		break;
    case 1 : 
		out[n]='0'; out[n+1]='0'; out[n+2]='0'; out[n+3]='1'; 
		break;
    case 2 : 
		out[n]='0'; out[n+1]='0'; out[n+2]='1'; out[n+3]='0'; 
		break;
    case 3 : 
        out[n]='0'; out[n+1]='0'; out[n+2]='1'; out[n+3]='1'; 
		break;
	case 4 : 
        out[n]='0'; out[n+1]='1'; out[n+2]='0'; out[n+3]='0'; 
		break;
	case 5 : 
        out[n]='0'; out[n+1]='1'; out[n+2]='0'; out[n+3]='1'; 
		break;
	case 6 : 
        out[n]='0'; out[n+1]='1'; out[n+2]='1'; out[n+3]='0'; 
		break;
	case 7 : 
        out[n]='0'; out[n+1]='1'; out[n+2]='1'; out[n+3]='1'; 
		break;
	case 8 : 
        out[n]='1'; out[n+1]='0'; out[n+2]='0'; out[n+3]='0'; 
		break;
	case 9 : 
        out[n]='1'; out[n+1]='0'; out[n+2]='0'; out[n+3]='1'; 
		break;
	case 10 : 
        out[n]='1'; out[n+1]='0'; out[n+2]='1'; out[n+3]='0'; 
		break;
	case 11 : 
        out[n]='1'; out[n+1]='0'; out[n+2]='1'; out[n+3]='1'; 
		break;
	case 12 : 
        out[n]='1'; out[n+1]='1'; out[n+2]='0'; out[n+3]='0'; 
		break;
	case 13 : 
        out[n]='1'; out[n+1]='1'; out[n+2]='0'; out[n+3]='1'; 
		break;
	case 14 : 
        out[n]='1'; out[n+1]='1'; out[n+2]='1'; out[n+3]='0'; 
		break;
	case 15 : 
        out[n]='1'; out[n+1]='1'; out[n+2]='1'; out[n+3]='1'; 
		break;
   }
   n=n+4;
   x=0; 
   y=0; 
 }
}


/*---------------------------------------------------------------------------------------------------------------*/

void XOR32(char Str1[], char Str2[])   // 32bit异或函数定义
{
 for(int i=0;i<32;i++)
   {
    if((Str1[i]=='1')&&(Str2[i]=='1'))
     {
      Str2[i]='0';
	  continue;
     }
    if((Str1[i]=='1')&&(Str2[i]=='0'))
     {
      Str2[i]='1';
	  continue;
     }
    if((Str1[i]=='0')&&(Str2[i]=='1'))
     {
      Str2[i]='1';
	  continue;
     }
    if((Str1[i]=='0')&&(Str2[i]=='0'))
     {
      Str2[i]='0';
	  continue;
     }
   }
}


void XOR48(char Str1[], char Str2[])   // 48bit异或函数定义
{
 for(int i=0;i<48;i++)
  {
   if((Str1[i]=='1')&&(Str2[i]=='1'))
    {
     Str2[i]='0';
	 continue;
    }
   if((Str1[i]=='1')&&(Str2[i]=='0'))
    {
     Str2[i]='1';
	 continue;
    }
   if((Str1[i]=='0')&&(Str2[i]=='1'))
    {
     Str2[i]='1';
	 continue;
    }
   if((Str1[i]=='0')&&(Str2[i]=='0'))
    {
     Str2[i]='0';
     continue;
    }
  }
}


/*---------------------------------------------------------------------------------------------------------------*/

void KeyEx(char initalK[], char RoundK[][48])// DES密钥生成函数定义
{
 int s=0;                      // 校验初始密钥initalK的正确性
 int j=0;
 for(int i=0;i<64;i=i+8)
  {
   for(j=0;j<8;j++)
    {
     if(initalK[i+j]=='1')
       s=s+1;
    }
   if(s%2)
    {
     s=0;
    }
   else
    {
     printf("\n KEY error! \n");
     exit(1);
    }
 }                             // 完成对初始密钥initalK的校验
			      
 int n=0;                      
 int temp;
 char key56[56];
 for(i=0;i<56;i++)             
   {
    n=pc1[i];                  // 选择置换1,同时除去校验位
    temp=initalK[n-1];
    key56[i]=temp;
   }

 for(int r=1;r<=16;r++)
  {
   for(i=1;i<=recycle[r-1];i++)   // 确定循环左移的次数
    {
     
	 temp=key56[0];              // 左半部分循环左移开始
	 for(j=0;j<27;j++)            
      {
       key56[j]=key56[j+1];
      }
     key56[27]=temp;               //左半部分循环左移结束

     
	 temp=key56[28];             // 右半部分循环左移开始
	 for(j=28;j<55;j++)
      {
       key56[j]=key56[j+1];
      }
     key56[55]=temp;            //左半部分循环左移结束

    }                           // 全部循环左移结束
   
   for(i=0;i<48;i++)        // 选择置换2
    {
     n=pc2[i];
     temp=key56[n-1];
     RoundK[r-1][i]=temp;
    }                       // 得到第r轮密钥
  }
}

 
/*---------------------------------------------------------------------------------------------------------------*/ 


void IPF(char in[],char out[])   // IP置换函数定义
{
 int temp;
 int n;
 for(int i=0;i<64;i++)
   {
    n=IP[i];
    temp=in[n-1];
    out[i]=temp;
   }
}

void InvIPF(char in[],char out[])  // 逆IP置换函数定义
{
 int temp;
 int n;
 for(int i=0;i<64;i++)
   {
    n=InvIP[i];
    temp=in[n-1];
    out[i]=temp;
   }
}


/*---------------------------------------------------------------------------------------------------------------*/ 

void output(char in[],FILE * out)    // 输出函数定义
{
 for(int i=0;i<8;i++)
   fputc(in[i],out);
}

/*---------------------------------------------------------------------------------------------------------------*/

void output(char in[],FILE * out,int n) // 向文件输出加密结果
{
  fwrite(in,1,n,out);
}

⌨️ 快捷键说明

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