DES加密算法

  1 #include<stdio.h>
  2 #include<iostream>
  3 using namespace std;
  4 int ip[64]={
  5  58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12,4,
  6  62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16,8,
  7  57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11,3,
  8  61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15,7
  9  };
 10 int fp[64]={
 11  40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
 12  38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
 13  36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
 14  34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25
 15 };
 16 int ei[48]={
 17     32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
 18      8, 9, 10,11,12,13,12,13,14,15,16,17,
 19     16,17,18,19,20,21,20,21,22,23,24,25,
 20      24,25,26,27,28,29,28,29,30,31,32, 1
 21 };
 22 int keyrar[56]={
 23      57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,
 24      10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,
 25      63,55,47,39,31,23,15, 7,62,54,46,38,30,22,
 26      14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4
 27 };
 28 int Pzh[32]={
 29      16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
 30      2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25
 31 };
 32 int sbox[8][64]={
 33       //S1
 34    14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
 35     0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
 36     4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
 37    15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,
 38    //S2
 39    15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
 40     3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
 41     0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
 42    13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,
 43    //S3
 44    10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
 45    13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
 46    13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
 47     1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,
 48    //S4
 49     7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
 50    13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
 51    10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
 52     3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,
 53    //S5
 54     2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
 55    14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
 56     4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
 57    11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,
 58    //S6
 59    12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
 60    10,15, 4, 2, 7,12, 0, 5, 6, 1,13,14, 0,11, 3, 8,
 61     9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
 62        4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,
 63    //S7
 64     4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
 65    13, 0,11, 7, 4, 0, 1,10,14, 3, 5,12, 2,15, 8, 6,
 66     1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
 67     6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,
 68    //S8
 69    13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
 70    1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
 71    7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
 72    2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11
 73 };
 74 int rar[48]={
 75     14,17,11,24, 1, 5, 3,28,15, 6,21,10,
 76     23,19,12, 4,26, 8,16, 7,27,20,13, 2,
 77     41,52,31,37,47,55,30,40,51,34,33,48,
 78     44,49,39,56,34,53,46,42,50,36,29,32
 79 };
 80 bool key[50][50];
 81 /*void BitToByte(char Out[8],bool PMW[64],int number){
 82      int i=0;
 83    for(i=0;i<(number/8);i++)
 84    {
 85     Out[i]=0;
 86    }
 87    for(i=0;i<number;i++)
 88    {
 89        Out[i/8]|=PMW[i];
 90     Out[i/8]|=PMW[i]<<(i%8);
 91     /*cout<<':'<<(PMW[i]<<(i%8))<<':'<<endl;
 92     //if(i%8==7)
 93     printf("%c\n",Out[i/8]);
 94     cout<<Out[i/8]<<endl;*/
 95    }
 96 }*/
 97 void ByteToBit(bool PMW[64],char In[8],int number){
 98      for(int i=0;i<number;i++)
 99         PMW[i]=(In[i/8]>>(i%8))&0x01;
100 }
101 void Xor(bool a[],bool b[],int num){
102      for(int i=0;i<num;i++)
103         a[i]=a[i]^b[i];
104 }
105 void keyfc(char *In){
106      int i,j=0,mov,k,m;
107      bool keyy[56],temp,keyin[64];
108      ByteToBit(keyin,In,64);//字节转换
109      for(i=0;i<56;i++)      //压缩
110         keyy[i]=keyin[keyrar[i]-1];
111     for(i=0;i<16;i++){
112         if(i==0||i==1||i==8||i==15)mov=1;
113         else mov=2;
114         for(k=0;k<mov;k++){
115             for(m=0;m<8;m++){
116                 temp=keyy[m*7];
117                 for(j=m*7;j<m*7+7;j++)
118                     keyy[j]=keyy[j+1];
119                 keyy[m*7+6]=temp;
120             }
121             temp=keyy[0];
122             for(m=0;m<27;m++)
123                 keyy[m]=keyy[m+1];
124             keyy[27]=temp;
125             temp=keyy[28];
126             for(m=28;m<55;m++)
127                 keyy[m]=key[m+1];
128             keyy[55]=temp;
129         }
130         for(j=0;j<48;j++)key[i][j]=keyy[rar[j]-1];
131     }
132 }
133 void DES(/*char Out[8]*/bool ans[64],char In[8],bool MS){
134      bool MW[64],tmp[32],PMW[64];
135      bool kzmw[48],keytem[48],ss[32];
136      int hang,lie,i,j;
137      ByteToBit(PMW,In,64);
138      for(j=0;j<64;j++)MW[j]=PMW[ip[j]-1];
139      cout<<"初始置换后:"<<endl;
140      for(i=0;i<64;i++)cout<<MW[i];
141      cout<<endl;
142      bool *Li=&MW[0],*Ri=&MW[32];
143      cout<<"E扩展之前:"<<endl;
144      for(i=0;i<32;i++)cout<<Ri[i];cout<<endl;
145      for(i=0;i<48;i++)kzmw[i]=Ri[ei[i]-1];
146      cout<<"E扩展之后:"<<endl;
147      for(i=0;i<48;i++)cout<<kzmw[i];cout<<endl;
148      if(MS==0){
149         int flag=0;
150         for(int lun=0;lun<16;lun++){
151             for(i=0;i<32;i++)ss[i]=Ri[i];
152             for(i=0;i<48;i++)kzmw[i]=Ri[ei[i]-1];
153             for(i=0;i<48;i++)keytem[i]=key[lun][i];
154             Xor(kzmw,keytem,48);
155             //S盒
156             for(i=0;i<8;i++){
157                 hang=kzmw[i*6]*2+kzmw[i*6+5];
158                 lie=kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];
159                 tmp[i*4+3]=(sbox[i][(hang+1)*16+lie])%2;
160                 tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
161                 tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
162                 tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;
163                  if(i==2&&flag==0){
164                     cout<<"第三个S盒的输入为:"<<endl;
165                     for(int h=i*6;h<=i*6+5;h++)
166                         cout<<kzmw[h];cout<<endl;
167                     cout<<"第三个S盒的输出为:"<<endl;
168                     for(int h=i*4;h<=i*4+3;h++)
169                         cout<<tmp[h];cout<<endl;
170                 }
171             }
172             //p置换
173             for(i=0;i<32;i++)
174             Ri[i]=tmp[Pzh[i]-1];
175             if(flag==0){
176                     flag=1;
177             cout<<"P置换的输入为:"<<endl;
178             for(i=0;i<32;i++)cout<<tmp[i];cout<<endl;
179             cout<<"P置换的输出为:"<<endl;
180             for(i=0;i<32;i++)cout<<Ri[i];cout<<endl;
181             }
182             Xor(Ri,Li,32);
183             for(i=0;i<32;i++)Li[i]=ss[i];
184         }
185         for(i=0;i<32;i++){
186             tmp[i]=Li[i];
187             Li[i]=Ri[i];
188             Ri[i]=tmp[i];
189         }
190         for(i=0;i<64;i++)PMW[i]=MW[fp[i]-1];
191         for(i=0;i<64;i++)ans[i]=PMW[i];
192         //逆置换
193       //  BitToByte(Out,PMW,64);
194      }
195 }
196 int main(){
197      char Ki[8],jm[8],final[8];
198      bool ans[64];
199      int i;
200      cout<<"请输入密钥(8字节):"<<endl;
201      for(i=0;i<8;i++)cin>>Ki[i];
202      keyfc(Ki);
203 
204      cout<<"请输入明文(8字节):"<<endl;
205      for(i=0;i<8;i++)cin>>jm[i];
206     // DES(final,jm,0);
207     DES(ans,jm,0);
208 
209      cout<<"加密后(64位):"<<endl;
210      for(i=0;i<64;i++)cout<<ans[i];
211     // for(i=0;i<8;i++)cout<<final[i];
212      cout<<endl;
213 
214     /* cout<<"解密后:"<<endl;
215      DES(jm,final,1);
216      for(i=0;i<8;i++)cout<<jm[i];
217      cout<<endl;*/
218 }
View Code

 

posted @ 2020-11-11 19:07  十分的月亮  阅读(151)  评论(0)    收藏  举报