DES加密解密算法C++实现

 DES加密算法并不难,是由一些简单的变换得来的,难的是要有足够的耐心。蒟蒻并不想说自己用了多久才把代码写好的。

 

代码:

         我真的太难了QAQ

  1 #include<iostream>
  2 using namespace std;
  3  
  4         
  5  
  6 int jiami(){
  7     
  8     // 明文 
  9     int mingwen[64];
 10            
 11            
 12     cout<<"请输入16位十六进制的明文:";
 13     string  kk;
 14     cin>>kk;
 15     int len=kk.length();
 16  
 17     
 18     while(len!=16){
 19         cout<<"请重新输入16位十六进制的明文:";
 20         cin>>kk; 
 21         len=kk.length();
 22     }
 23     
 24     int jishu=0;
 25     for(int i=0;i<16;i++){
 26         int a;
 27         if(kk[i]>='0'&&kk[i]<='9')
 28            a=kk[i]-'0';
 29         else
 30            a=kk[i]-'A'+10;
 31            
 32         int n[4]={0};
 33         int f=0;
 34         while(a){
 35             n[f]=a%2;
 36             a=a/2;
 37             f++;
 38         }
 39         mingwen[jishu*4]=n[3];
 40         mingwen[jishu*4+1]=n[2];
 41         mingwen[jishu*4+2]=n[1];
 42         mingwen[jishu*4+3]=n[0];
 43         jishu++; 
 44     } 
 45  
 46    
 47  
 48     //初始置换IP 
 49     int IP[64]={58, 50, 42, 34, 26, 18, 10, 2,
 50                 60, 52, 44, 36, 28, 20, 12, 4,
 51                 62, 54, 46, 38, 30, 22, 14, 6,
 52                 64, 56, 48, 40, 32, 24, 16, 8,
 53                 57, 49, 41, 33, 25, 17,  9, 1,
 54                 59, 51, 43, 35, 27, 19, 11, 3,
 55                 61, 53, 45, 37, 29, 21, 13, 5,
 56                 63, 55, 47, 39, 31, 23, 15, 7};
 57                 
 58                 
 59                 
 60             
 61                 
 62     // 选择运算E   32位明文扩充为48位                
 63     int E[48]={ 32,  1,  2,  3,  4,  5,
 64                 4,  5,  6,  7,  8,  9,
 65                 8,  9, 10, 11, 12, 13,
 66                12, 13, 14, 15, 16, 17,
 67                16, 17, 18, 19, 20, 21,
 68                20, 21, 22, 23, 24, 25,
 69                24, 25, 26, 27, 28, 29,
 70                28, 29, 30, 31, 32,  1 }; 
 71                       
 72               
 73     //64位秘钥     0123456789ABCDEF    56位的秘钥+8位校验码 
 74     int miyao[64];
 75     cout<<"请输入16位十六进制的秘钥:";
 76     string  k_2;
 77     cin>>k_2;
 78     int len_2=k_2.length();
 79  
 80     
 81     while(len_2!=16){
 82         cout<<"请重新输入16位十六进制的秘钥:";
 83         cin>>k_2; 
 84         len_2=k_2.length();
 85     }
 86     
 87     int jishu_2=0;
 88     for(int i=0;i<16;i++){
 89         int a;
 90         if(k_2[i]>='0'&&k_2[i]<='9')
 91            a=k_2[i]-'0';
 92         else
 93            a=k_2[i]-'A'+10;
 94            
 95         int n[4]={0};
 96         int f=0;
 97         while(a){
 98             n[f]=a%2;
 99             a=a/2;
100             f++;
101         }
102         miyao[jishu_2*4]=n[3];
103         miyao[jishu_2*4+1]=n[2];
104         miyao[jishu_2*4+2]=n[1];
105         miyao[jishu_2*4+3]=n[0];
106         jishu_2++; 
107     }      
108            
109            
110     //置换选择1
111     int IP_1[56]={57, 49, 41, 33, 25, 17,  9,
112                    1, 58, 50, 42, 34, 26, 18,
113                   10,  2, 59, 51, 43, 35, 27,
114                   19, 11,  3, 60, 52, 44, 36,
115                   63, 55, 47, 39, 31, 23, 15,
116                    7, 62, 54, 46, 38, 30, 22,
117                   14,  6, 61, 53, 45, 37, 29,
118                   21, 13,  5, 28, 20, 12,  4};
119      
120                 
121  
122     //16次左移对应的位数                 
123     int weiyi[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};     
124     // 置换选择2 秘钥56->48位压缩 
125     int IP_2[48]={14, 17, 11, 24,  1,  5,
126                    3, 28, 15,  6, 21, 10,
127                   23, 19, 12,  4, 26,  8,
128                   16,  7, 27, 20, 13,  2,
129                   41, 52, 31, 37, 47, 55,
130                   30, 40, 51, 45, 33, 48,
131                   44, 49, 39, 56, 34, 53,
132                   46, 42, 50, 36, 29, 32};
133                                 
134      //S盒
135                 
136     int s[8][65]=
137 {
138     {
139         14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
140         0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
141         4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
142         15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13
143     },
144     {
145         15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
146         3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
147         0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
148         13,8,10,1,3,15,4,2,11,6,7,12,10,5,14,9
149     },
150     {
151         10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
152         13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
153         13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
154         1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12
155     },
156     {
157         7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
158         13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
159         10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
160         3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14
161     },
162     {
163         2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
164         14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
165         4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
166         11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3
167     },
168     {
169         12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
170         10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
171         9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
172         4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13
173     },
174     {
175         4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
176         13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
177         1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
178         6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12
179     },
180     {
181         13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
182         1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
183         7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
184         2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11
185     }
186 };
187  
188                 
189      //P置换      
190      int P[32]={16,  7, 20, 21, 29, 12, 28, 17,
191                 1, 15, 23, 26,  5, 18, 31, 10,
192                 2,  8, 24, 14, 32, 27,  3,  9,
193                 19, 13, 30,  6, 22, 11,  4, 25 }; 
194                 
195                 
196             
197     //1初始置换            
198     //1.1  64明文进行初始置换分左右 
199     int mingwen_1[64];
200     int l[32],r[32];
201     for (int i=0;i<64;i++){
202         mingwen_1[i]=mingwen[IP[i]-1];
203     }   
204     for(int i=0;i<32;i++){
205         l[i]=mingwen_1[i];
206         r[i]=mingwen_1[i+32];
207     } 
208     cout<<"明文初始置换M   =";
209     for(int i=0;i<64;i++){
210         if(i%64==0) cout<<" ";
211         cout<<mingwen_1[i];
212     }
213     cout<<endl;
214     
215     
216     //1.2 56位秘钥初始置换分左右 
217     
218     cout<<"秘钥初始置换k0  =";
219     for(int i=0;i<64;i++){
220         if(i%64==0) cout<<" ";
221         cout<<miyao[i];
222     }
223     cout<<endl;
224     
225     int ml[28],mr[28];
226     int miyao_0[58]; 
227     for(int i=0;i<58;i++){
228         miyao_0[i]=miyao[IP_1[i]-1];
229     } 
230     for(int i=0;i<28;i++){
231         ml[i]=miyao_0[i];
232         mr[i]=miyao_0[i+28];
233     }
234     
235      
236     //2.循环加密                  
237     for (int i=0;i<16;i++){
238         
239         cout<<"-------------------------------第"<<i+1<<"轮循环-----------------------------------" <<endl;
240         
241         //2.1明文左右交换 
242         int new_l[32],new_r[48];
243         for(int j=0;j<32;j++){
244             new_l[j]=r[j];
245         }
246         
247         //2.2 右边32位拓展变换成48位
248         for(int j=0;j<48;j++){
249             new_r[j]=r[E[j]-1];
250         }
251         
252         
253         //2.3 左右秘钥 左移
254         int new_ml[28],new_mr[28];
255          for(int j=0;j<28;j++){
256              new_ml[j]=ml[(j+28+weiyi[i])%28];
257              new_mr[j]=mr[(j+28+weiyi[i])%28];
258          }
259     
260         //2.4  重新合并成56位的秘钥
261         int miyao_1[56];
262         for(int j=0;j<28;j++){
263             miyao_1[j]=new_ml[j];
264             miyao_1[j+28]=new_mr[j];
265         } 
266         //2.5  IP_2 56位秘钥压缩成48位的秘钥
267         int k[48];
268         for (int j=0;j<48;j++){
269             k[j]=miyao_1[IP_2[j]-1];
270         } 
271         
272     
273         cout<<"k"<<i+1<<"             =";
274         for(int j=0;j<48;j++){
275           if(j%6==0) cout<<" ";
276           cout<<k[j];
277        }
278         cout<<endl;
279         
280     
281         cout<<"R"<<i<<"            "<<"=";
282         for(int j=0;j<48;j++){
283           if(j%6==0) cout<<" ";
284           cout<<new_r[j];
285        }
286         cout<<endl;
287         
288         
289         //2.6   2.2和2.5XOR
290         int new_r2[48];
291         for(int j=0;j<48;j++){
292             new_r2[j]=new_r[j] ^ k[j];
293         } 
294         
295         
296         cout<<"R(i-1)^ki      "<<"=";
297         for(int j=0;j<48;j++){
298           if(j%6==0) cout<<" ";
299           cout<<new_r2[j];
300        }
301         cout<<endl;
302         
303         //2.7 s盒 
304         int new_r3[32];
305         int b1,b2,b3,b4,b5,b6;
306         int m=0;
307         for(int j=0;j<8;j++){
308             int row = ((new_r2[j*6])<<1)+(new_r2[j*6+5]);   //第1,6位组成行号
309             int col = ((new_r2[j*6+1])<<3)+((new_r2[j*6+2])<<2)+((new_r2[j*6+3])<<1)+(new_r2[j*6+4]);  //第2,3,4,5位组成列号
310               //找到s盒对应的数 
311             int a=s[j][16*row+col];
312     
313             //转成对应的2进制 
314             int n[4]={0};
315             int f=0;
316             while(a){
317                 n[f]=a%2;
318                 a=a/2;
319                 f++;    
320             }
321             
322             new_r3[m*4]=n[3];
323             new_r3[m*4+1]=n[2];
324             new_r3[m*4+2]=n[1];
325             new_r3[m*4+3]=n[0];
326             m++;
327         }
328         
329         cout<<""<<i+1<<"轮s盒"<<"       =";
330         for(int j=0;j<32;j++){
331           if(j%8==0) cout<<" ";
332           cout<<new_r3[j];
333        }
334         cout<<endl;
335         
336         //2.8 P置换
337         int new_r4[32];
338         for(int j=0;j<32;j++){
339             new_r4[j]=new_r3[P[j]-1];
340         } 
341         
342         cout<<"P置换          "<<"=";
343         for(int j=0;j<32;j++){
344           if(j%8==0) cout<<" ";
345           cout<<new_r4[j];
346        }
347         cout<<endl;
348         
349         
350         
351         //2.9 明文左边32位和2.8 new_r4[32] XOR
352         int new_r5[32];
353         for(int j=0;j<32;j++){
354             new_r5[j]=l[j] ^ new_r4[j];
355             //更新左右明文,以便于下次循环 
356             l[j]=new_l[j];
357             r[j]=new_r5[j];
358         } 
359     
360         cout<<"R"<<i+1<<"             =";
361         for(int j=0;j<32;j++){
362           if(j%8==0) cout<<" ";
363           cout<<new_r5[j];
364        }
365         cout<<endl;
366         cout<<"L"<<i+1<<"             =";
367         for(int j=0;j<32;j++){
368           if(j%8==0) cout<<" ";
369           cout<<new_l[j];
370        }
371         cout<<endl;
372         //2.10 更新左右秘钥,以便于下次循环 
373          for(int j=0;j<28;j++){
374              ml[j]=new_ml[j];
375              mr[j]=new_mr[j];
376          } 
377          
378          
379          cout<<"----------------------------------------------------------------------------"<<endl<<endl<<endl; 
380          
381     }
382     
383     //3.  循环加密之后的明文mingwen_1[64]
384     for(int i=0;i<32;i++){
385         mingwen_1[i]=r[i];
386         mingwen_1[i+32]=l[i];
387     } 
388     
389     
390 //    cout<<"逆置换前=";
391 //    for(int i=0;i<64;i++){
392 //        cout<<mingwen_1[i]; 
393 //    } 
394 //    cout<<endl<<endl;
395     
396     //4.  逆置换 
397     int miwen[64];
398     for(int i=0;i<64;i++){
399         miwen[IP[i]-1]=mingwen_1[i];
400     } 
401     
402     
403     //5.输出
404     
405     cout<<"原明文为:"; 
406     for(int i=0;i<64;i++){
407         if(i%64==0) cout<<endl;
408         cout<<mingwen[i];
409     } 
410     cout<<endl<<endl;
411     cout<<"秘钥为:";
412     for(int i=0;i<64;i++){
413         if(i%64==0) cout<<endl;
414         cout<<miyao[i];
415     } 
416     cout<<endl<<endl;
417     cout<<"密文为:";
418     for(int i=0;i<64;i++){
419         if(i%64==0) cout<<endl;
420         cout<<miwen[i];
421     }
422      //是否将密文转换成十六进制?(Y  or  N)
423       
424     cout<<endl<<endl<<"是否将密文转换成十六进制?(Y  or  N):";
425     char YN;
426     cin>>YN; 
427     cout<<endl<<"十六进制密文表示:";
428     if(YN=='Y'){
429         for(int i=0;i<16;i++){
430             int q=miwen[i*4]*8+miwen[i*4+1]*4+miwen[i*4+2]*2+miwen[i*4+3];
431             if(q>=0 && q<= 9){
432                 cout<<q;
433             } 
434             else{
435                 cout<<hex<<uppercase<<q;                
436             }
437         }
438     }
439     cout<<endl<<endl<<"!!!!皆大欢喜,普天同庆!!!!"<<endl;
440     return 0; 
441 }
442  
443 int jiemi(){
444     // 密文 
445     int miwen[64];
446            
447            
448     cout<<"请输入16位十六进制的密文:";
449     string  kk;
450     cin>>kk;
451     int len=kk.length();
452     
453     
454     while(len!=16){
455         cout<<"请重新输入16位十六进制的密文:";
456         cin>>kk; 
457         len=kk.length();
458     }
459     
460     int jishu=0;
461     for(int i=0;i<16;i++){
462         int a;
463         if(kk[i]>='0'&&kk[i]<='9')
464            a=kk[i]-'0';
465         else
466            a=kk[i]-'A'+10;
467            
468         int n[4]={0};
469         int f=0;
470         while(a){
471             n[f]=a%2;
472             a=a/2;
473             f++;
474         }
475         miwen[jishu*4]=n[3];
476         miwen[jishu*4+1]=n[2];
477         miwen[jishu*4+2]=n[1];
478         miwen[jishu*4+3]=n[0];
479         jishu++; 
480     } 
481  
482     //初始置换IP 
483     int IP[64]={58, 50, 42, 34, 26, 18, 10, 2,
484                 60, 52, 44, 36, 28, 20, 12, 4,
485                 62, 54, 46, 38, 30, 22, 14, 6,
486                 64, 56, 48, 40, 32, 24, 16, 8,
487                 57, 49, 41, 33, 25, 17,  9, 1,
488                 59, 51, 43, 35, 27, 19, 11, 3,
489                 61, 53, 45, 37, 29, 21, 13, 5,
490                 63, 55, 47, 39, 31, 23, 15, 7};
491                             
492     // 选择运算E   32位明文扩充为48位                
493     int E[48]={ 32,  1,  2,  3,  4,  5,
494                 4,  5,  6,  7,  8,  9,
495                 8,  9, 10, 11, 12, 13,
496                12, 13, 14, 15, 16, 17,
497                16, 17, 18, 19, 20, 21,
498                20, 21, 22, 23, 24, 25,
499                24, 25, 26, 27, 28, 29,
500                28, 29, 30, 31, 32,  1 }; 
501                                     
502     //64位秘钥     0123456789ABCDEF    56位的秘钥+8位校验码 
503     int miyao[64];
504     cout<<"请输入16位十六进制的秘钥:";
505     string  k_2;
506     cin>>k_2;
507     int len_2=k_2.length();
508  
509     
510     while(len_2!=16){
511         cout<<"请重新输入16位十六进制的秘钥:";
512         cin>>k_2; 
513         len_2=k_2.length();
514     }
515     
516     int jishu_2=0;
517     for(int i=0;i<16;i++){
518         int a;
519         if(k_2[i]>='0'&&k_2[i]<='9')
520            a=k_2[i]-'0';
521         else
522            a=k_2[i]-'A'+10;
523            
524         int n[4]={0};
525         int f=0;
526         while(a){
527             n[f]=a%2;
528             a=a/2;
529             f++;
530         }
531         miyao[jishu_2*4]=n[3];
532         miyao[jishu_2*4+1]=n[2];
533         miyao[jishu_2*4+2]=n[1];
534         miyao[jishu_2*4+3]=n[0];
535         jishu_2++; 
536     }      
537            
538            
539     //置换选择1
540     int IP_1[56]={57, 49, 41, 33, 25, 17,  9,
541                    1, 58, 50, 42, 34, 26, 18,
542                   10,  2, 59, 51, 43, 35, 27,
543                   19, 11,  3, 60, 52, 44, 36,
544                   63, 55, 47, 39, 31, 23, 15,
545                    7, 62, 54, 46, 38, 30, 22,
546                   14,  6, 61, 53, 45, 37, 29,
547                   21, 13,  5, 28, 20, 12,  4};
548      
549     //16次左移对应的位数                 
550     int weiyi[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};     
551     // 置换选择2 秘钥56->48位压缩 
552     int IP_2[48]={14, 17, 11, 24,  1,  5,
553                    3, 28, 15,  6, 21, 10,
554                   23, 19, 12,  4, 26,  8,
555                   16,  7, 27, 20, 13,  2,
556                   41, 52, 31, 37, 47, 55,
557                   30, 40, 51, 45, 33, 48,
558                   44, 49, 39, 56, 34, 53,
559                   46, 42, 50, 36, 29, 32};
560                                 
561      //S盒                
562     int s[8][65]=
563 {
564     {
565         14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
566         0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
567         4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
568         15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13
569     },
570     {
571         15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
572         3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
573         0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
574         13,8,10,1,3,15,4,2,11,6,7,12,10,5,14,9
575     },
576     {
577         10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
578         13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
579         13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
580         1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12
581     },
582     {
583         7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
584         13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
585         10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
586         3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14
587     },
588     {
589         2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
590         14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
591         4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
592         11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3
593     },
594     {
595         12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
596         10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
597         9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
598         4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13
599     },
600     {
601         4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
602         13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
603         1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
604         6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12
605     },
606     {
607         13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
608         1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
609         7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
610         2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11
611     }
612 };
613  
614                 
615      //P置换      
616      int P[32]={16,  7, 20, 21, 29, 12, 28, 17,
617                 1, 15, 23, 26,  5, 18, 31, 10,
618                 2,  8, 24, 14, 32, 27,  3,  9,
619                 19, 13, 30,  6, 22, 11,  4, 25 }; 
620                             
621     //1初始置换    
622             
623     //1.1  64密文进行逆置换分左右 
624     int miwen_1[64];
625     int l[32],r[32];
626     for (int i=0;i<64;i++){
627         miwen_1[i]=miwen[IP[i]-1];
628     }   
629     for(int i=0;i<32;i++){
630         r[i]=miwen_1[i];
631         l[i]=miwen_1[i+32];
632     } 
633     cout<<"密文逆置换     =";
634     for(int i=0;i<64;i++){
635         if(i%64==0) cout<<" ";
636         cout<<miwen_1[i];
637     }
638     cout<<endl;
639     
640     
641     //1.2 56位秘钥初始置换分左右 
642     
643     cout<<"秘钥初始置换k0 =";
644     for(int i=0;i<64;i++){
645         if(i%64==0) cout<<" ";
646         cout<<miyao[i];
647     }
648     cout<<endl;
649     
650     int ml_0[28],mr_0[28];
651     int miyao_0[58]; 
652     for(int i=0;i<58;i++){
653         miyao_0[i]=miyao[IP_1[i]-1];
654     } 
655     for(int i=0;i<28;i++){
656         ml_0[i]=miyao_0[i];
657         mr_0[i]=miyao_0[i+28];
658     }
659     
660     // 因为加密过程一共左移了28位,回到了原来的位置,
661     //所以我们要先将原始秘钥左移一次。
662     
663     int ml[28],mr[28];
664     for(int j=0;j<28;j++){
665         ml[j]=ml_0[(j+28+1)%28];
666         mr[j]=mr_0[(j+28+1)%28];
667     }    
668         
669      
670     //2.循环解密                  
671     for (int i=0;i<16;i++){
672         
673         cout<<"-------------------------------第"<<i+1<<"轮循环解密-----------------------------------" <<endl;
674         
675         //2.1密文左右交换 
676         int new_l[32],new_r[48];
677         for(int j=0;j<32;j++){
678             new_r[j]=l[j];
679         }
680         
681         //2.2 左边32位拓展变换成48位
682         for(int j=0;j<48;j++){
683             new_l[j]=new_r[E[j]-1];
684         }
685         
686         //2.3 左右秘钥 右移
687          
688         int new_ml[28],new_mr[28];
689          for(int j=0;j<28;j++){
690              new_ml[j]=ml[(j+28-weiyi[16-i])%28];
691              new_mr[j]=mr[(j+28-weiyi[16-i])%28];
692          }
693     
694         //2.4  重新合并成56位的秘钥
695         int miyao_1[56];
696         for(int j=0;j<28;j++){
697             miyao_1[j]=new_ml[j];
698             miyao_1[j+28]=new_mr[j];
699         } 
700         //2.5  IP_2 56位秘钥压缩成48位的秘钥
701         int k[48];
702         for (int j=0;j<48;j++){
703             k[j]=miyao_1[IP_2[j]-1];
704         } 
705         
706         cout<<"k"<<16-i<<"             =";
707         for(int j=0;j<48;j++){
708           if(j%6==0) cout<<" ";
709           cout<<k[j];
710        }
711         cout<<endl;
712         
713         cout<<"L"<<16-i<<"             "<<"=";
714         for(int j=0;j<48;j++){
715           if(j%6==0) cout<<" ";
716           cout<<new_l[j];
717        }
718         cout<<endl;
719         
720         
721         //2.6   2.2和2.5XOR
722         int new_l2[48];
723         for(int j=0;j<48;j++){
724             new_l2[j]=new_l[j] ^ k[j];
725         } 
726         
727         cout<<"Li^ki         "<<"=";
728         for(int j=0;j<48;j++){
729           if(j%6==0) cout<<" ";
730           cout<<new_l2[j];
731        }
732         cout<<endl;
733         
734         //2.7 s盒 
735         int new_l3[32];
736         int b1,b2,b3,b4,b5,b6;
737         int m=0;
738         for(int j=0;j<8;j++){
739             int row = ((new_l2[j*6])<<1)+(new_l2[j*6+5]);   //第1,6位组成行号
740             int col = ((new_l2[j*6+1])<<3)+((new_l2[j*6+2])<<2)+((new_l2[j*6+3])<<1)+(new_l2[j*6+4]);  //第2,3,4,5位组成列号
741               //找到s盒对应的数 
742             int a=s[j][16*row+col];
743     
744             //转成对应的2进制 
745             int n[4]={0};
746             int f=0;
747             while(a){
748                 n[f]=a%2;
749                 a=a/2;
750                 f++;    
751             }
752             
753             new_l3[m*4]=n[3];
754             new_l3[m*4+1]=n[2];
755             new_l3[m*4+2]=n[1];
756             new_l3[m*4+3]=n[0];
757             m++;
758         }
759         
760         cout<<""<<16-i<<"轮s盒"<<"       =";
761         for(int j=0;j<32;j++){
762           if(j%8==0) cout<<" ";
763           cout<<new_l3[j];
764        }
765         cout<<endl;
766         
767         //2.8 P置换
768         int new_l4[32];
769         for(int j=0;j<32;j++){
770             new_l4[j]=new_l3[P[j]-1];
771         } 
772         
773         cout<<"P置换          "<<"=";
774         for(int j=0;j<32;j++){
775           if(j%8==0) cout<<" ";
776           cout<<new_l4[j];
777        }
778         cout<<endl;
779         
780         //2.9 密文右边32位和2.8 new_l4[32] XOR   
781         int new_l5[32];
782         for(int j=0;j<32;j++){
783             new_l5[j]=r[j] ^ new_l4[j];
784             //更新左右明文,以便于下次循环 
785             r[j]=new_r[j];
786             l[j]=new_l5[j];
787         } 
788     
789         cout<<"L"<<16-i-1<<"            =";
790         for(int j=0;j<32;j++){
791           if(j%8==0) cout<<" ";
792           cout<<new_l5[j];
793        }
794         cout<<endl;
795         cout<<"R"<<16-i-1<<"            =";
796         for(int j=0;j<32;j++){
797           if(j%8==0) cout<<" ";
798           cout<<new_r[j];
799        }
800         cout<<endl;
801         
802         //2.10 更新左右秘钥,以便于下次循环 
803          for(int j=0;j<28;j++){
804              ml[j]=new_ml[j];
805              mr[j]=new_mr[j];
806          } 
807          
808          cout<<"ml"<<16-i<<"=";
809          for(int j=0;j<28;j++){
810              cout<<ml[j];
811          } 
812          cout<<endl;
813          cout<<"mr"<<16-i<<"=";
814          for(int j=0;j<28;j++){
815              cout<<mr[j];
816          } 
817          cout<<endl;
818          
819          cout<<"------------------------------------------------------------------------------"<<endl<<endl<<endl; 
820          
821     }
822     
823     //3.  循环解密之后的密文miwen_1[64]
824     for(int i=0;i<32;i++){
825         miwen_1[i]=l[i];
826         miwen_1[i+32]=r[i];
827     } 
828     //4.  初始置换 
829     int mingwen[64];
830     for(int i=0;i<64;i++){
831         mingwen[IP[i]-1]=miwen_1[i];
832     } 
833             
834     
835     //5.输出
836     
837     cout<<"原密文为:"; 
838     for(int i=0;i<64;i++){
839         if(i%64==0) cout<<endl;
840         cout<<miwen[i];
841     } 
842     cout<<endl<<endl;
843     cout<<"秘钥为:";
844     for(int i=0;i<64;i++){
845         if(i%64==0) cout<<endl;
846         cout<<miyao[i];
847     } 
848     cout<<endl<<endl;
849     cout<<"明文为:";
850     for(int i=0;i<64;i++){
851         if(i%64==0) cout<<endl;
852         cout<<mingwen[i];
853     }
854      //是否将明文转换成十六进制?(Y  or  N)
855       
856     cout<<endl<<endl<<"是否将明文转换成十六进制?(Y  or  N):";
857     char YN;
858     cin>>YN; 
859     cout<<endl<<"十六进制明表示:";
860     if(YN=='Y'){
861         for(int i=0;i<16;i++){
862             int q=mingwen[i*4]*8+mingwen[i*4+1]*4+mingwen[i*4+2]*2+mingwen[i*4+3];
863             if(q>=0 && q<= 9){
864                 cout<<q;
865             } 
866             else{
867                 cout<<hex<<uppercase<<q;                
868             }
869         }
870     }
871     cout<<endl<<endl<<"!!!!皆大欢喜,普天同庆!!!!"<<endl;
872     return 0;
873 } 
874  
875 int main(){
876     
877     
878     while(1){
879     int number;
880     cout<<"===欢迎来到DES加密算法系统==="<<endl;
881     cout<<"                  Author:十七"<<endl; 
882     cout<<"目前支持的操作有:"<<endl;
883     cout<<"  1.加密操作;"<<endl;
884     cout<<"  2.解密操作;"<<endl;
885     cout<<"  0.退出。"<<endl;
886     cout<<"============================="<<endl; 
887     cout<<"请选择您项进行的操作:";
888     cin>>number;
889     cout<<endl;
890      
891     if(number==1){
892         jiami();
893     }
894     else if(number==2){
895         jiemi();
896     } 
897     else{
898         cout<<"您已成功退出系统,如果您对本次服务感到满意,欢迎五星好评^_^"<<endl;
899         return 0;    
900      }
901     } 
902     return 0;
903 } 

运行结果截图:

 ......

 

 ......

猜你喜欢

转载自www.cnblogs.com/msq2000/p/12702859.html