]> AND Private Git Repository - Cipher_code.git/blob - OneRoundIoT/OneRound/one_round_par2.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
e42a6d5251273cf19c30a20967c9dea7aa64a47f
[Cipher_code.git] / OneRoundIoT / OneRound / one_round_par2.cpp
1 //gcc pixmap_io.c  -c 
2 //g++ -O3 one_round_new.cpp pixmap_io.o  -o one_round_new -std=c++11   
3
4 #include <iostream>
5 #include <list>
6 #include<math.h>
7 #include<stdlib.h>
8 #include<stdio.h>
9 #include<string.h>
10 #include <fstream>
11 #include <sys/time.h>
12 #include <omp.h>
13
14 /*#include <cryptopp/hex.h>
15 #include <cryptopp/sha.h>
16 #include <cryptopp/osrng.h>
17 #include <cryptopp/secblock.h>
18 */
19
20
21 extern "C" {
22   int load_RGB_pixmap(char *filename, int *width, int *height, unsigned char**R_data, unsigned char**G_data, unsigned char**B_data);
23   void store_RGB_pixmap(char *filename, unsigned char *R_data, unsigned char *G_data, unsigned char *B_data, int width, int height);
24 }
25
26
27 //using namespace CryptoPP;
28 using namespace std;
29
30
31 int key_size=256;
32 int nb_test=1;
33 int ctr=0;
34
35
36
37
38
39
40
41 typedef unsigned char   uchar;
42
43
44 double TimeStart()
45 {
46   struct timeval tstart;
47   gettimeofday(&tstart,0);
48   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
49 }
50
51 double TimeStop(double t)
52 {
53   struct timeval tend;
54
55   gettimeofday(&tend,0);
56   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
57   return (t);
58 }
59
60
61
62
63
64
65 void inverse_tables(uchar *tab, int size_tab,uchar *inv_perm_tabs) {
66
67   for(int i=0;i<size_tab;i++) {
68     inv_perm_tabs[tab[i]] = i;
69   }
70
71 }
72
73 void inverse_tables_int(int *tab, int size_tab,int *inv_perm_tabs) {
74
75   for(int i=0;i<size_tab;i++) {
76     inv_perm_tabs[tab[i]] = i;
77   }
78
79 }
80
81
82
83 void rc4key(uchar *key, uchar *sc, int size_DK) {
84
85   for(int i=0;i<256;i++) {
86     sc[i]=i;
87   }
88
89
90   uchar j0 = 0;
91   for(int i0=0; i0<256; i0++) {
92     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
93     uchar tmp = sc[i0];
94     sc[i0] = sc[j0 ];
95     sc[j0] = tmp;
96   }
97 }
98
99
100
101 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
102
103   //sc=1:len;
104
105
106   
107   for (int i=0;i<len;i++) {
108     sc[i]=i;
109   }
110   for (int it = 0; it < rp; it++) {
111     int j0 = 1;
112     for(int i0 = 0; i0<len; i0++) {
113       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
114       int tmp = sc[i0];
115       sc[i0] = sc[j0];
116       sc[j0] = tmp;
117     }
118
119   }
120 }
121
122 void prga(uchar *sc, int ldata, uchar *r) {
123   uchar i0=0;
124   uchar j0=0;
125
126   for (int it=0; it<ldata; it++) {
127     i0 = ((i0+1)&0xFE); //%255);
128     j0 = (j0 + sc[i0])&0xFF;
129     uchar tmp = sc[i0];
130     sc[i0] = sc[j0];
131     sc[j0] = tmp;
132     r[it]=sc[(sc[i0]+sc[j0])&0xFF];
133   }
134 }
135
136 void rotate(uchar *RM1, uchar *RM2, int size, int n)
137 {
138   int i;
139    for (i = 0; i< size-n; i++)
140      RM2[i+n] = RM1[i];
141
142    for (i = 0; i< n; i++)
143      RM2[i] = RM1[size-n-1+i];
144 }
145
146
147 template<int h2>
148 void encrypt_ctr(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, int enc, int num) {
149
150
151   uchar X[h2];
152   uchar fX[h2*num];
153
154
155   
156
157
158   for(int a=0;a<h2;a++) {
159      X[a]=Sbox1[a&0xFF];           //Warning according to the size of h2, we can be outsize of Sbox1[a]
160    }
161
162
163   int loc_len=len/num;
164   
165 #pragma omp parallel for
166   for(int p=0;p<num;p++) {
167
168     int id=omp_get_thread_num();
169     uchar RM2[h2];
170     for(int a=0;a<h2;a++) {
171       RM2[a]=RM1[id*h2+a];           //Warning according to the size of h2, we can be outsize of Sbox1[a]
172     }
173
174   
175     int offset=p*loc_len;
176
177     
178     for(int it=offset;it<offset+loc_len;it++) {
179     int ind1,ind2;
180
181
182     //cout<<id<<" "<<it<<endl;
183     
184     if(enc) {
185       ind1=it*h2;
186       ind2=Pbox[it]*h2;
187     }
188     else {
189       ind2=it*h2;
190       ind1=Pbox[it]*h2;
191     }
192   
193
194     /*for(int a=0;a<h2;a+=4){
195       fX[a]=RM1[X[a]];
196       fX[a+1]=RM1[X[a+1]];
197       fX[a+2]=RM1[X[a+2]];
198       fX[a+3]=RM1[X[a+3]];
199       }*/
200
201     for(int a=0;a<h2;a+=4){
202       fX[id*h2+a]=X[a];
203       fX[id*h2+a+1]=X[a+1];
204       fX[id*h2+a+2]=X[a+2];
205       fX[id*h2+a+3]=X[a+3];
206     }
207
208
209
210     
211     /*   if(it<513) {
212       for(int a=0;a<h2;a++)
213         printf("%d ",fX[a]);
214       printf("\n");
215       }*/
216     
217     *(int*)&fX[id*h2+0]^=it;
218
219     /* if(it<513) {
220       for(int a=0;a<h2;a++)
221         printf("%d ",fX[a]);
222       printf("\n");
223       }*/
224
225
226   
227     
228     /*for(int a=0;a<h2;a+=4) {
229       fX[id*h2+a]=fX[id*h2+a]^RM1[id*h2+a];
230       fX[id*h2+a+1]=fX[id*h2+a+1]^RM1[id*h2+a+1];
231       fX[id*h2+a+2]=fX[id*h2+a+2]^RM1[id*h2+a+2];
232       fX[id*h2+a+3]=fX[id*h2+a+3]^RM1[id*h2+a+3];
233       }*/
234
235
236
237     
238     for(int a=0;a<h2;a+=4) {
239       fX[id*h2+a]=Sbox2[fX[id*h2+a]];
240       fX[id*h2+a+1]=Sbox2[fX[id*h2+a+1]];
241       fX[id*h2+a+2]=Sbox2[fX[id*h2+a+2]];
242       fX[id*h2+a+3]=Sbox2[fX[id*h2+a+3]];
243     }
244
245 //    rotate(RM1, &RM2[id*h2], h2, Pbox[it]%h2);
246     
247     for(int a=0;a<h2;a+=4) {
248       RM2[a]=RM2[PboxRM[a]];
249       RM2[a+1]=RM2[PboxRM[a+1]];
250       RM2[a+2]=RM2[PboxRM[a+2]];
251       RM2[a+3]=RM2[PboxRM[a+3]];
252     }
253     
254     for(int a=0;a<h2;a+=4) {
255       fX[id*h2+a]=fX[id*h2+a]^RM2[id*h2+a];
256       fX[id*h2+a+1]=fX[id*h2+a+1]^RM2[id*h2+a+1];
257       fX[id*h2+a+2]=fX[id*h2+a+2]^RM2[id*h2+a+2];
258       fX[id*h2+a+3]=fX[id*h2+a+3]^RM2[id*h2+a+3];
259     }
260
261
262     
263      for(int a=0;a<h2;a+=4) {
264       fX[id*h2+a]=fX[id*h2+a]^seq_in[ind2+a];
265       fX[id*h2+a+1]=fX[id*h2+a+1]^seq_in[ind2+a+1];
266       fX[id*h2+a+2]=fX[id*h2+a+2]^seq_in[ind2+a+2];
267       fX[id*h2+a+3]=fX[id*h2+a+3]^seq_in[ind2+a+3];
268     }
269
270  
271     for(int a=0;a<h2;a+=4) {
272       seq_out[ind1+a]=fX[id*h2+a];
273       seq_out[ind1+a+1]=fX[id*h2+a+1];
274       seq_out[ind1+a+2]=fX[id*h2+a+2];
275       seq_out[ind1+a+3]=fX[id*h2+a+3];
276     }
277     
278     /*for(int a=0;a<h2;a+=4) {
279       RM1[id*h2+a]=RM1[id*h2+PboxRM[a]];
280       RM1[id*h2+a+1]=RM1[id*h2+PboxRM[a+1]];
281       RM1[id*h2+a+2]=RM1[id*h2+PboxRM[a+2]];
282       RM1[id*h2+a+3]=RM1[id*h2+PboxRM[a+3]];
283     }
284     */
285
286     
287   }
288   }
289
290 }
291
292
293
294
295 template<int h2>
296 void encrypt(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, int debug, int num) {
297
298
299 /*  uchar *X=new uchar[h2];
300   uchar *fX=new uchar[h2];
301   unsigned int *lX=(unsigned int*)X;
302   unsigned int *lseq_in=(unsigned int*)seq_in;
303 */
304   uchar X[h2*num];
305   uchar fX[h2*num];
306   uchar RM2[h2*num];
307 //  unsigned int *lX=(unsigned int*)X;
308 //  unsigned int *lseq_in=(unsigned int*)seq_in;
309   
310 #pragma omp parallel for 
311   for(int it=0;it<len;it++) {
312     int ind1=it*h2;
313     int ind2=Pbox[it]*h2;
314     int id=omp_get_thread_num();
315  
316     for(int a=0;a<h2;a+=4) {
317       X[id*h2+a]=seq_in[ind2+a];
318       X[id*h2+a+1]=seq_in[ind2+a+1];
319       X[id*h2+a+2]=seq_in[ind2+a+2];
320       X[id*h2+a+3]=seq_in[ind2+a+3];
321     }
322
323     for(int a=0;a<h2;a+=4){
324       fX[id*h2+a]=Sbox1[X[id*h2+a]];
325       fX[id*h2+a+1]=Sbox1[X[id*h2+a+1]];
326       fX[id*h2+a+2]=Sbox1[X[id*h2+a+2]];
327       fX[id*h2+a+3]=Sbox1[X[id*h2+a+3]];
328     }
329
330
331 /*    for(int a=0;a<h2;a+=4) {
332       fX[a]=fX[a]^RM1[a];
333       fX[a+1]=fX[a+1]^RM1[a+1];
334       fX[a+2]=fX[a+2]^RM1[a+2];
335       fX[a+3]=fX[a+3]^RM1[a+3];
336       }*/
337     rotate(RM1, &RM2[id*h2], h2, Pbox[it]%h2);
338     for(int a=0;a<h2;a+=4) {
339       fX[id*h2+a]=fX[id*h2+a]^RM2[id*h2+a];
340       fX[id*h2+a+1]=fX[id*h2+a+1]^RM2[id*h2+a+1];
341       fX[id*h2+a+2]=fX[id*h2+a+2]^RM2[id*h2+a+2];
342       fX[id*h2+a+3]=fX[id*h2+a+3]^RM2[id*h2+a+3];
343     }
344
345     for(int a=0;a<h2;a+=4) {
346       seq_out[ind1+a]=Sbox2[fX[id*h2+a]];
347       seq_out[ind1+a+1]=Sbox2[fX[id*h2+a+1]];
348       seq_out[ind1+a+2]=Sbox2[fX[id*h2+a+2]];
349       seq_out[ind1+a+3]=Sbox2[fX[id*h2+a+3]];
350     }
351
352     /* for(int a=0;a<h2;a+=4) {
353       RM1[a]=RM1[PboxRM[a]];
354       RM1[a+1]=RM1[PboxRM[a+1]];
355       RM1[a+2]=RM1[PboxRM[a+2]];
356       RM1[a+3]=RM1[PboxRM[a+3]];
357
358       }*/
359
360
361   }
362
363
364
365
366 }
367
368
369 template<int h2>
370 void decrypt(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Inv_Sbox1, uchar *Inv_Sbox2, int debug, int num) {
371
372
373   /*uchar *fX=new uchar[h2];
374   uchar *Inv_Sbox1=new uchar[256];
375   uchar *Inv_Sbox2=new uchar[256];
376   */
377   uchar fX[h2*num];
378   uchar RM2[h2*num];
379
380 #pragma omp parallel for 
381   for(int it=0;it<len;it++) {
382
383     int ind1=it*h2;
384     int ind2=Pbox[it]*h2;
385     int id=omp_get_thread_num();
386
387
388
389     for(int a=0;a<h2;a+=4) {
390       fX[id*h2+a]=seq_in[ind1+a];
391       fX[id*h2+a+1]=seq_in[ind1+a+1];
392       fX[id*h2+a+2]=seq_in[ind1+a+2];
393       fX[id*h2+a+3]=seq_in[ind1+a+3];
394             
395     }
396     for(int a=0;a<h2;a+=4) {
397       fX[id*h2+a]=Inv_Sbox2[fX[id*h2+a]];
398       fX[id*h2+a+1]=Inv_Sbox2[fX[id*h2+a+1]];
399       fX[id*h2+a+2]=Inv_Sbox2[fX[id*h2+a+2]];
400       fX[id*h2+a+3]=Inv_Sbox2[fX[id*h2+a+3]];
401     }
402     /*for(int a=0;a<h2;a+=4) {
403       fX[a]=fX[a]^RM1[a];
404       fX[a+1]=fX[a+1]^RM1[a+1];
405       fX[a+2]=fX[a+2]^RM1[a+2];
406       fX[a+3]=fX[a+3]^RM1[a+3];
407       }
408
409     for(int a=0;a<h2;a+=4) {
410       RM1[a]=RM1[PboxRM[a]];
411       RM1[a+1]=RM1[PboxRM[a+1]];
412       RM1[a+2]=RM1[PboxRM[a+2]];
413       RM1[a+3]=RM1[PboxRM[a+3]];
414       }*/
415
416
417     rotate(RM1, &RM2[id*h2], h2, Pbox[it]%h2);
418     for(int a=0;a<h2;a+=4) {
419       fX[id*h2+a]=fX[id*h2+a]^RM2[id*h2+a];
420       fX[id*h2+a+1]=fX[id*h2+a+1]^RM2[id*h2+a+1];
421       fX[id*h2+a+2]=fX[id*h2+a+2]^RM2[id*h2+a+2];
422       fX[id*h2+a+3]=fX[id*h2+a+3]^RM2[id*h2+a+3];      
423     }
424
425     
426     for(int a=0;a<h2;a+=4) {
427       seq_out[ind2+a]=Inv_Sbox1[fX[id*h2+a]];
428       seq_out[ind2+a+1]=Inv_Sbox1[fX[id*h2+a+1]];
429       seq_out[ind2+a+2]=Inv_Sbox1[fX[id*h2+a+2]];
430       seq_out[ind2+a+3]=Inv_Sbox1[fX[id*h2+a+3]];
431     }
432
433      
434   }
435
436
437 }
438
439
440 int main(int argc, char** argv) {
441
442
443   int h=32;
444   int lena=0;
445   int size_buf=1;
446
447
448   
449   for(int i=1; i<argc; i++){
450     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
451     if(strncmp(argv[i],"ctr",3)==0) ctr = atoi(&(argv[i][3]));          //CTR ? 1  otherwise CBC like
452     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
453     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
454     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
455   }
456
457 /*  printf("nb times %d\n",nb_test);
458   printf("ctr %d\n",ctr);
459   printf("h %d\n",h);
460   printf("lena %d\n",lena);
461   printf("size_buf %d\n",size_buf);
462 */
463   int h2=h*h;
464   
465
466       
467   int seed=time(NULL);
468 //  cout<<seed<<endl;
469   srand48(seed);
470
471   uchar Secretkey[key_size];
472
473   uchar counter[key_size];
474
475   for(int i=0;i<key_size;i++) {
476     Secretkey[i]=lrand48()&0xFF;
477     counter[i]=lrand48()&0xFF;
478   }
479
480   
481   int size = 64;
482   uchar DK[size];
483
484
485
486
487   int width;
488   int height;
489
490   uchar *data_R, *data_G, *data_B;
491   int imsize;
492   uchar *buffer;
493   
494   if(lena==1) {
495     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
496     imsize=width*height*3;
497 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
498   }
499   else {
500     width=height=size_buf;
501     imsize=width*height;
502     buffer=new uchar[imsize];
503     for(int i=0;i<imsize;i++) {
504       buffer[i]=lrand48();
505     }
506   }
507
508
509
510   
511   
512   uchar* seq= new uchar[imsize];
513   uchar* seq2= new uchar[imsize];
514
515   int oneD=width*height;
516   if(lena) {
517     for(int i=0;i<oneD;i++) {
518       seq[i]=data_R[i];
519       seq[oneD+i]=data_G[i];
520       seq[2*oneD+i]=data_B[i];
521     }
522   }
523   else {
524     for(int i=0;i<oneD;i++) {
525       seq[i]=buffer[i];
526     }
527   }
528
529
530
531   
532
533   int total_len=imsize;
534   int rp=1;
535   int len= total_len/h2;
536
537
538   
539   uchar *mix=new uchar[256];
540
541
542
543     
544   for (int i = 0; i < 256 ; i++) {
545     mix[i]=Secretkey[i]^counter[i];
546   }
547
548   
549 //  cout<<"hash "<<endl;
550   for (int i = 0; i < 64 ; i++) {
551 //    DK[i]=digest[i];
552     DK[i]=mix[i];
553   }
554
555
556
557   
558   uchar Sbox1[256];
559   rc4key(DK, Sbox1, 16);
560
561   uchar Sbox2[256];
562   rc4key(&DK[16], Sbox2, 16);
563   uchar Inv_Sbox1[256];
564   uchar Inv_Sbox2[256];
565   inverse_tables(Sbox1,256,Inv_Sbox1);
566   inverse_tables(Sbox2,256,Inv_Sbox2);
567
568
569
570   
571   uchar sc[256];
572   rc4key(&DK[32], sc, 16);
573
574   int num=omp_get_max_threads();
575   cout<<"num "<<num<<endl;
576   
577   uchar RM1[num*(h * h)];
578   uchar RM2[num*(h * h)];
579   prga(sc, num*(h * h), RM1);
580   for(int i=0;i<num*h2;i++) {
581     RM2[i]=RM1[i];
582   }
583   
584
585
586   
587   
588     
589   
590   uchar keyp[16];
591   for (int i = 48; i < 64; i++)
592     keyp[i-48] = DK[i];
593
594 //  cout<<len<<endl;
595   int *Pbox=new int[len];
596
597
598   
599   int *PboxRM=new int[h2];
600
601   rc4keyperm(keyp, len, rp, Pbox, 16);
602
603 //  printf("len %d\n",len);
604   for(int i=0;i<len;i++) {
605 //    printf("%d \n",Pbox[i]);
606   }
607   
608
609
610  
611   double time=0;
612   double t=TimeStart();
613
614   int i;
615   switch(h) {
616   case 4: 
617     for(i=0;i<nb_test;i++)
618     {
619       if(ctr)
620         encrypt_ctr<4*4>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
621       else
622         encrypt<4*4>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
623       
624     }
625     break;
626   case 8: 
627     for(i=0;i<nb_test;i++)
628     {
629       if(ctr)
630         encrypt_ctr<8*8>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
631       else
632         encrypt<8*8>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
633       
634     }
635     break;
636   case 16: 
637     for(i=0;i<nb_test;i++)
638     {
639       if(ctr)
640         encrypt_ctr<16*16>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
641       else
642         encrypt<16*16>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
643       
644     }
645     break;
646   case 32: 
647     for(i=0;i<nb_test;i++)
648     {
649       if(ctr)
650         encrypt_ctr<32*32>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
651       else
652         encrypt<32*32>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
653       
654     }
655     break;
656   case 64: 
657     for(i=0;i<nb_test;i++)
658     {
659       if(ctr)
660         encrypt_ctr<64*64>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
661       else
662         encrypt<64*64>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
663       
664     }
665     break;
666   case 128: 
667     for(i=0;i<nb_test;i++)
668     {
669       if(ctr)
670         encrypt_ctr<128*128>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
671       else
672         encrypt<128*128>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
673       
674     }
675     break;
676   }
677   time+=TimeStop(t);
678   cout<<"Time encrypt "<<time<<endl;
679
680
681   if(lena) {
682     for(int i=0;i<oneD;i++) {
683       data_R[i]=seq2[i];
684       data_G[i]=seq2[oneD+i];
685       data_B[i]=seq2[2*oneD+i];
686     }
687     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
688   }
689   
690
691
692
693   for(int i=0;i<imsize;i++) {
694     seq[i]=0;
695   }
696
697   
698   time=0;
699   t=TimeStart();
700   switch(h) {
701   case 4:
702     for(i=0;i<nb_test;i++) {
703       if(ctr)
704         encrypt_ctr<4*4>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
705       else
706         decrypt<4*4>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
707     }
708     break;
709   case 8:
710     for(i=0;i<nb_test;i++) {
711       if(ctr)
712         encrypt_ctr<8*8>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
713       else
714         decrypt<8*8>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
715     }
716     break;
717   case 16:
718     for(i=0;i<nb_test;i++) {
719       if(ctr)
720         encrypt_ctr<16*16>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
721       else
722         decrypt<16*16>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
723     }
724     break;
725   case 32:
726     for(i=0;i<nb_test;i++) {
727       if(ctr)
728         encrypt_ctr<32*32>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
729       else
730         decrypt<32*32>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
731     }
732     break;
733   case 64:
734     for(i=0;i<nb_test;i++) {
735       if(ctr)
736         encrypt_ctr<64*64>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
737       else
738         decrypt<64*64>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
739     }
740     break;
741   case 128:
742     for(i=0;i<nb_test;i++) {
743       if(ctr)
744         encrypt_ctr<128*128>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
745       else
746         decrypt<128*128>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
747     }
748     break;  
749
750     
751   }
752
753   time+=TimeStop(t);
754   cout<<"Time decrypt "<<time<<endl;
755
756   if(lena) {
757     for(int i=0;i<oneD;i++) {
758       data_R[i]=seq[i];
759       data_G[i]=seq[oneD+i];
760       data_B[i]=seq[2*oneD+i];
761     }
762     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
763   }
764   else {
765     bool equal=true;
766     for(int i=0;i<imsize;i++) {
767       //cout<<"sol"<<(int)buffer[i]<<" "<<(int)seq[i]<<" "<<endl;
768       if(buffer[i]!=seq[i]) {
769         equal=false;
770       }
771     }
772     cout<<"RESULT CORRECT: "<<equal<<endl;
773   }
774   
775
776
777   return 0;
778 }