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

📄 des.cpp

📁  数据加密算法(Data Encryption Algorithm
💻 CPP
字号:
#include <iostream>
#include <string>

using namespace std;

void dd(int aa[6],int &hang,int &lie)
{
 hang=aa[0]*2+aa[5];
 lie=aa[1]*8+aa[2]*4+aa[3]*2+aa[4];
}

int main()
{   
 int cnt=0;
 char mingwen[9];
 cout<<"请输入8位明文:";
 cin>>mingwen;
 char key[9];
 cout<<"请输入8位密钥:";
 cin>>key;
 int minint[64];
 int keyint[64];
 int miwen[64];
 int i=0,j=0,m=0,n=0;
 for(i=0;i<64;i++)
  minint[i]=0;
 for(i=0;i<64;i++)
  keyint[i]=0;
 for(i=0;i<8;i++)
 {
  int temp=(int)mingwen[i];
  int z=0;
  for(z=7;z>=0;z--)
  {
   minint[8*i+z]=temp%2;
   temp=temp/2;
   cnt++;
  }
 }
 for(i=0;i<8;i++)
 {
  int temp=(int)key[i];
  int z;
  for(z=7;z>=0;z--)
  {
   keyint[8*i+z]=temp%2;
   temp=temp/2;
  }
 }
 int pc1[56]={                                    
  56, 48, 40, 32, 24, 16,  8,  0, 57, 49, 41, 33, 25, 17, 
  9 ,  1, 58, 50, 42, 34, 26, 18, 10,  2, 59, 51, 43, 35, 
  62, 54, 46, 38, 30, 22, 14,  6, 61, 53, 45, 37, 29, 21,
  13,  5, 60, 52, 44, 36, 28, 20, 12,  4, 27, 19, 11, 3};
 int pc2[48]={       
  13, 16, 10, 23,  0,  4,  2, 27, 14,  5, 20,  9,
  22, 18, 11,  3, 25,  7, 15,  6, 26, 19, 12,  1,
  40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
  43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };

 int beginip[64]={       
      57,49,41,33,25,17,9,1,   
   59,51,43,35,27,19,11,3,   
   61,53,45,37,29,21,13,5,   
   63,55,47,39,31,23,15,7,   
   56,48,40,32,24,16,8,0,   
   58,50,42,34,26,18,10,2,   
   60,52,44,36,28,20,12,4,   
   62,54,46,38,30,22,14,6 };
 int zhihuane[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 zhihuanp[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 };
 int zhihuanpp[64]={ 39,7,47,15,55,23,63,31,
      38,6,46,14,54,22,62,30,
      37,5,45,13,53,21,61,29,
      36,4,44,12,52,20,60,28,
      35,3,43,11,51,19,59,27,
      34,2,42,10,50,18,58,26, 
      33,1,41,9,49,17,57,25,
         32,0,40,8,48,16,56,24};
 
 int ss[8][64]={14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,//s盒
                 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
                    4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
          15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,


                   15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
        3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
     0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
       13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,

 

       10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
       13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
       13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
        1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,


                    7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
       13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
       10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
        3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,


      2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
     14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
      4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
     11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,


     12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
     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,

 

     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,


     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  };


    int pc1key[56]; 
 for(i=0;i<56;i++)
 {             
  pc1key[i]=keyint[pc1[i]];
 }

 int leftkey[28];
 int rightkey[28];

 for(j=0;j<28;j++)
 {
  leftkey[j]=pc1key[j];
  rightkey[j]=pc1key[j+28];
 }

 int lun=1;
 int movleft[17]={    0,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};


    int ww[64];
    for(i=0;i<64;i++)
 {
  ww[i]=minint[i];    
 }
 for(i=0;i<64;i++)
         minint[i]=ww[beginip[i]];

 int leftmin[32];
 int rightmin[32];

    for(j=0;j<32;j++)
 {
  leftmin[j]=minint[j];
 
  rightmin[j]=minint[j+32];
 }

 int keykey[16][48];
 int s=0;
 for(s=0;s<16;s++)
 {
  int temp=0;
  int temp1[28],temp2[28];
  for(j=0;j<28;j++)
  {
   temp1[j]=leftkey[j];
   temp2[j]=rightkey[j];
  }
  for(j=0;j<28;j++)
  {
   leftkey[j]=temp1[(j+movleft[lun]+28)%28];
   rightkey[j]=temp2[(j+movleft[lun]+28)%28]; 
  }  
     int pc2keytemp[56];
  for(i=0;i<28;i++)
  {
   pc2keytemp[i]=leftkey[i];
   pc2keytemp[i+28]=rightkey[i];
  }
  int pc2key[48];
  for(i=0;i<48;i++)
  {
   pc2key[i]=pc2keytemp[pc2[i]];
   keykey[s][i]=pc2keytemp[pc2[i]];
  }
  int lefttemp[32];
  int righttemp[32];
  for(i=0;i<32;i++)
  {
   lefttemp[i]=leftmin[i];
   righttemp[i]=rightmin[i];
  }
  int kk[48];
  for(i=0;i<48;i++)
   kk[i]=rightmin[zhihuane[i]];
  for(i=0;i<48;i++)
   kk[i]=pc2key[i]^kk[i];
  int cc[8][6];
  n=0;
  for(i=0;i<8;i++)
  {
   for(j=0;j<6;j++)
   {
    cc[i][j]=kk[n++];
   }
  }
  int tt[32];
  int coutt=0;
  int hang=0,lie=0;
  for(i=0;i<8;i++)
  {
   dd(cc[i],hang,lie);
   int xx=ss[i][hang*16+lie];
   int z=3;
   for(z=3;z>=0;z--)
   {
    tt[i*4+z]=xx%2;
    xx=xx/2;
   } 
  }
  int dd[32];
  for(i=0;i<32;i++)
  {
   dd[i]=tt[zhihuanp[i]];  
  }
  for(i=0;i<32;i++)
   dd[i]=dd[i]^leftmin[i];
  for(i=0;i<32;i++)
  {
   leftmin[i]=righttemp[i];
   rightmin[i]=dd[i];
  }
  lun++;
 }
 int o;
 for(i=0;i<32;i++)
 {
  o=leftmin[i];
  leftmin[i]=rightmin[i];
  rightmin[i]=o;
 }
 for(i=0;i<32;i++)
 {
  minint[i]=leftmin[i];
  minint[i+32]=rightmin[i];
 }
 for(i=0;i<64;i++)
 {
  miwen[i]=minint[zhihuanpp[i]];
 }
 for(i=0;i<64;i++)
  cout<<miwen[i];
 cout<<endl;
 char michar[8];
    for(i=0;i<8;i++)
 { 
  long int qq=0;
  for(j=0;j<8;j++)
  {
   qq=(miwen[j+8*i]+qq)*2;
  }
  qq=qq/2;
  michar[i]=(char)(qq);
 }
 cout<<"加密得到的密文为:   ";
 for(i=0;i<8;i++)
  cout<<michar[i];
 cout<<endl;
lun=1;
    s=0;
 for(i=0;i<8;i++)
  mingwen[i]=michar[i];

 for(s=0;s<16;s++)
 {

  int lefttemp[32];
  int righttemp[32];
  for(i=0;i<32;i++)
  {
   lefttemp[i]=leftmin[i];
   righttemp[i]=rightmin[i];
  }
  int kk[48];
  for(i=0;i<48;i++)
   kk[i]=rightmin[zhihuane[i]];
  for(i=0;i<48;i++)
   kk[i]=keykey[16-lun][i]^kk[i];
  int cc[8][6]; 
  n=0;
  for(i=0;i<8;i++)
  {
   for(j=0;j<6;j++)
   {
    cc[i][j]=kk[n++];
   }
  }
  int tt[32];
  int coutt=0;
  int hang=0,lie=0;
  for(i=0;i<8;i++)
  {
   dd(cc[i],hang,lie);
   int xx=ss[i][hang*16+lie];
   int z=3;
   for(z=3;z>=0;z--)
   {
    tt[i*4+z]=xx%2;
    xx=xx/2;
   } 
  }
  int dd[32];
  for(i=0;i<32;i++)
  {
   dd[i]=tt[zhihuanp[i]];  
  }

  for(i=0;i<32;i++)
   dd[i]=dd[i]^leftmin[i];
  for(i=0;i<32;i++)
  {
   leftmin[i]=righttemp[i];
   rightmin[i]=dd[i];
  }
  lun++;
 }
 for(i=0;i<32;i++)
 {
  o=leftmin[i];
  leftmin[i]=rightmin[i];
  rightmin[i]=o;
 }
 for(i=0;i<32;i++)
 {
  minint[i]=leftmin[i];
  minint[i+32]=rightmin[i];
 }
 for(i=0;i<64;i++)
 {
  miwen[i]=minint[zhihuanpp[i]];
 }
 char jiemichar[8];
    for(i=0;i<8;i++)
 { 
  long int qq=0;
  for(j=0;j<8;j++)
  {
   qq=(miwen[j+8*i]+qq)*2;
  }
  qq=qq/2;
  jiemichar[i]=(char)(qq);
 }
 cout<<"解密得到的明文为:    ";
 for(i=0;i<8;i++)
  cout<<jiemichar[i];
  cout<<endl;
 return 0;
}

⌨️ 快捷键说明

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