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

Private GIT Repository
8519fe20f46bd1aa1b0b270ddd6a58c4dbe169a8
[Cipher_code.git] / OneRoundIoT / OneRound / one_round_par.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
148 template<int h2>
149 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) {
150
151
152   uchar X[h2];
153   uchar fX[h2*num];
154   uchar RM2[h2*num];
155
156   
157
158
159   for(int a=0;a<h2;a++) {
160      X[a]=Sbox1[a&0xFF];           //Warning according to the size of h2, we can be outsize of Sbox1[a]
161    }
162
163 #pragma omp parallel for 
164   for(int it=0;it<len;it++) {
165     int ind1,ind2;
166     int id=omp_get_thread_num();
167
168     //cout<<id<<" "<<it<<endl;
169     
170     if(enc) {
171       ind1=it*h2;
172       ind2=Pbox[it]*h2;
173     }
174     else {
175       ind2=it*h2;
176       ind1=Pbox[it]*h2;
177     }
178   
179
180     /*for(int a=0;a<h2;a+=4){
181       fX[a]=RM1[X[a]];
182       fX[a+1]=RM1[X[a+1]];
183       fX[a+2]=RM1[X[a+2]];
184       fX[a+3]=RM1[X[a+3]];
185       }*/
186
187     for(int a=0;a<h2;a+=4){
188       fX[id*h2+a]=X[a];
189       fX[id*h2+a+1]=X[a+1];
190       fX[id*h2+a+2]=X[a+2];
191       fX[id*h2+a+3]=X[a+3];
192     }
193
194
195
196     
197     /*   if(it<513) {
198       for(int a=0;a<h2;a++)
199         printf("%d ",fX[a]);
200       printf("\n");
201       }*/
202     
203     *(int*)&fX[id*h2+0]^=it;
204
205     /* if(it<513) {
206       for(int a=0;a<h2;a++)
207         printf("%d ",fX[a]);
208       printf("\n");
209       }*/
210
211
212   
213     
214     /*for(int a=0;a<h2;a+=4) {
215       fX[id*h2+a]=fX[id*h2+a]^RM1[id*h2+a];
216       fX[id*h2+a+1]=fX[id*h2+a+1]^RM1[id*h2+a+1];
217       fX[id*h2+a+2]=fX[id*h2+a+2]^RM1[id*h2+a+2];
218       fX[id*h2+a+3]=fX[id*h2+a+3]^RM1[id*h2+a+3];
219       }*/
220
221
222
223     
224     for(int a=0;a<h2;a+=4) {
225       fX[id*h2+a]=Sbox2[fX[id*h2+a]];
226       fX[id*h2+a+1]=Sbox2[fX[id*h2+a+1]];
227       fX[id*h2+a+2]=Sbox2[fX[id*h2+a+2]];
228       fX[id*h2+a+3]=Sbox2[fX[id*h2+a+3]];
229     }
230
231     rotate(RM1, &RM2[id*h2], h2, Pbox[it]%h2);
232     for(int a=0;a<h2;a+=4) {
233       fX[id*h2+a]=fX[id*h2+a]^RM2[id*h2+a];
234       fX[id*h2+a+1]=fX[id*h2+a+1]^RM2[id*h2+a+1];
235       fX[id*h2+a+2]=fX[id*h2+a+2]^RM2[id*h2+a+2];
236       fX[id*h2+a+3]=fX[id*h2+a+3]^RM2[id*h2+a+3];
237     }
238
239
240     
241      for(int a=0;a<h2;a+=4) {
242       fX[id*h2+a]=fX[id*h2+a]^seq_in[ind2+a];
243       fX[id*h2+a+1]=fX[id*h2+a+1]^seq_in[ind2+a+1];
244       fX[id*h2+a+2]=fX[id*h2+a+2]^seq_in[ind2+a+2];
245       fX[id*h2+a+3]=fX[id*h2+a+3]^seq_in[ind2+a+3];
246     }
247
248  
249     for(int a=0;a<h2;a+=4) {
250       seq_out[ind1+a]=fX[id*h2+a];
251       seq_out[ind1+a+1]=fX[id*h2+a+1];
252       seq_out[ind1+a+2]=fX[id*h2+a+2];
253       seq_out[ind1+a+3]=fX[id*h2+a+3];
254     }
255     
256     /*for(int a=0;a<h2;a+=4) {
257       RM1[id*h2+a]=RM1[id*h2+PboxRM[a]];
258       RM1[id*h2+a+1]=RM1[id*h2+PboxRM[a+1]];
259       RM1[id*h2+a+2]=RM1[id*h2+PboxRM[a+2]];
260       RM1[id*h2+a+3]=RM1[id*h2+PboxRM[a+3]];
261     }
262     */
263
264     
265   }
266
267
268 }
269
270
271
272 template<int h2>
273 void encrypt(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, int debug, int num) {
274
275
276 /*  uchar *X=new uchar[h2];
277   uchar *fX=new uchar[h2];
278   unsigned int *lX=(unsigned int*)X;
279   unsigned int *lseq_in=(unsigned int*)seq_in;
280 */
281   uchar X[h2*num];
282   uchar fX[h2*num];
283   uchar RM2[h2*num];
284 //  unsigned int *lX=(unsigned int*)X;
285 //  unsigned int *lseq_in=(unsigned int*)seq_in;
286   
287 #pragma omp parallel for 
288   for(int it=0;it<len;it++) {
289     int ind1=it*h2;
290     int ind2=Pbox[it]*h2;
291     int id=omp_get_thread_num();
292  
293     for(int a=0;a<h2;a+=4) {
294       X[id*h2+a]=seq_in[ind2+a];
295       X[id*h2+a+1]=seq_in[ind2+a+1];
296       X[id*h2+a+2]=seq_in[ind2+a+2];
297       X[id*h2+a+3]=seq_in[ind2+a+3];
298     }
299
300     for(int a=0;a<h2;a+=4){
301       fX[id*h2+a]=Sbox1[X[id*h2+a]];
302       fX[id*h2+a+1]=Sbox1[X[id*h2+a+1]];
303       fX[id*h2+a+2]=Sbox1[X[id*h2+a+2]];
304       fX[id*h2+a+3]=Sbox1[X[id*h2+a+3]];
305     }
306
307
308 /*    for(int a=0;a<h2;a+=4) {
309       fX[a]=fX[a]^RM1[a];
310       fX[a+1]=fX[a+1]^RM1[a+1];
311       fX[a+2]=fX[a+2]^RM1[a+2];
312       fX[a+3]=fX[a+3]^RM1[a+3];
313       }*/
314     rotate(RM1, &RM2[id*h2], h2, Pbox[it]%h2);
315     for(int a=0;a<h2;a+=4) {
316       fX[id*h2+a]=fX[id*h2+a]^RM2[id*h2+a];
317       fX[id*h2+a+1]=fX[id*h2+a+1]^RM2[id*h2+a+1];
318       fX[id*h2+a+2]=fX[id*h2+a+2]^RM2[id*h2+a+2];
319       fX[id*h2+a+3]=fX[id*h2+a+3]^RM2[id*h2+a+3];
320     }
321
322     for(int a=0;a<h2;a+=4) {
323       seq_out[ind1+a]=Sbox2[fX[id*h2+a]];
324       seq_out[ind1+a+1]=Sbox2[fX[id*h2+a+1]];
325       seq_out[ind1+a+2]=Sbox2[fX[id*h2+a+2]];
326       seq_out[ind1+a+3]=Sbox2[fX[id*h2+a+3]];
327     }
328
329     /* for(int a=0;a<h2;a+=4) {
330       RM1[a]=RM1[PboxRM[a]];
331       RM1[a+1]=RM1[PboxRM[a+1]];
332       RM1[a+2]=RM1[PboxRM[a+2]];
333       RM1[a+3]=RM1[PboxRM[a+3]];
334
335       }*/
336
337
338   }
339
340
341
342
343 }
344
345
346 template<int h2>
347 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) {
348
349
350   /*uchar *fX=new uchar[h2];
351   uchar *Inv_Sbox1=new uchar[256];
352   uchar *Inv_Sbox2=new uchar[256];
353   */
354   uchar fX[h2*num];
355   uchar RM2[h2*num];
356
357 #pragma omp parallel for 
358   for(int it=0;it<len;it++) {
359
360     int ind1=it*h2;
361     int ind2=Pbox[it]*h2;
362     int id=omp_get_thread_num();
363
364
365
366     for(int a=0;a<h2;a+=4) {
367       fX[id*h2+a]=seq_in[ind1+a];
368       fX[id*h2+a+1]=seq_in[ind1+a+1];
369       fX[id*h2+a+2]=seq_in[ind1+a+2];
370       fX[id*h2+a+3]=seq_in[ind1+a+3];
371             
372     }
373     for(int a=0;a<h2;a+=4) {
374       fX[id*h2+a]=Inv_Sbox2[fX[id*h2+a]];
375       fX[id*h2+a+1]=Inv_Sbox2[fX[id*h2+a+1]];
376       fX[id*h2+a+2]=Inv_Sbox2[fX[id*h2+a+2]];
377       fX[id*h2+a+3]=Inv_Sbox2[fX[id*h2+a+3]];
378     }
379     /*for(int a=0;a<h2;a+=4) {
380       fX[a]=fX[a]^RM1[a];
381       fX[a+1]=fX[a+1]^RM1[a+1];
382       fX[a+2]=fX[a+2]^RM1[a+2];
383       fX[a+3]=fX[a+3]^RM1[a+3];
384       }
385
386     for(int a=0;a<h2;a+=4) {
387       RM1[a]=RM1[PboxRM[a]];
388       RM1[a+1]=RM1[PboxRM[a+1]];
389       RM1[a+2]=RM1[PboxRM[a+2]];
390       RM1[a+3]=RM1[PboxRM[a+3]];
391       }*/
392
393
394     rotate(RM1, &RM2[id*h2], h2, Pbox[it]%h2);
395     for(int a=0;a<h2;a+=4) {
396       fX[id*h2+a]=fX[id*h2+a]^RM2[id*h2+a];
397       fX[id*h2+a+1]=fX[id*h2+a+1]^RM2[id*h2+a+1];
398       fX[id*h2+a+2]=fX[id*h2+a+2]^RM2[id*h2+a+2];
399       fX[id*h2+a+3]=fX[id*h2+a+3]^RM2[id*h2+a+3];      
400     }
401
402     
403     for(int a=0;a<h2;a+=4) {
404       seq_out[ind2+a]=Inv_Sbox1[fX[id*h2+a]];
405       seq_out[ind2+a+1]=Inv_Sbox1[fX[id*h2+a+1]];
406       seq_out[ind2+a+2]=Inv_Sbox1[fX[id*h2+a+2]];
407       seq_out[ind2+a+3]=Inv_Sbox1[fX[id*h2+a+3]];
408     }
409
410      
411   }
412
413
414 }
415
416
417 int main(int argc, char** argv) {
418
419
420   int h=32;
421   int lena=0;
422   int size_buf=1;
423
424
425   
426   for(int i=1; i<argc; i++){
427     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
428     if(strncmp(argv[i],"ctr",3)==0) ctr = atoi(&(argv[i][3]));          //CTR ? 1  otherwise CBC like
429     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
430     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
431     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
432   }
433
434 /*  printf("nb times %d\n",nb_test);
435   printf("ctr %d\n",ctr);
436   printf("h %d\n",h);
437   printf("lena %d\n",lena);
438   printf("size_buf %d\n",size_buf);
439 */
440   int h2=h*h;
441   
442
443       
444   int seed=time(NULL);
445 //  cout<<seed<<endl;
446   srand48(seed);
447
448   uchar Secretkey[key_size];
449
450   uchar counter[key_size];
451
452   for(int i=0;i<key_size;i++) {
453     Secretkey[i]=lrand48()&0xFF;
454     counter[i]=lrand48()&0xFF;
455   }
456
457   
458   int size = 64;
459   uchar DK[size];
460
461
462
463
464   int width;
465   int height;
466
467   uchar *data_R, *data_G, *data_B;
468   int imsize;
469   uchar *buffer;
470   
471   if(lena==1) {
472     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
473     imsize=width*height*3;
474 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
475   }
476   else {
477     width=height=size_buf;
478     imsize=width*height;
479     buffer=new uchar[imsize];
480     for(int i=0;i<imsize;i++) {
481       buffer[i]=lrand48();
482     }
483   }
484
485
486
487   
488   
489   uchar* seq= new uchar[imsize];
490   uchar* seq2= new uchar[imsize];
491
492   int oneD=width*height;
493   if(lena) {
494     for(int i=0;i<oneD;i++) {
495       seq[i]=data_R[i];
496       seq[oneD+i]=data_G[i];
497       seq[2*oneD+i]=data_B[i];
498     }
499   }
500   else {
501     for(int i=0;i<oneD;i++) {
502       seq[i]=buffer[i];
503     }
504   }
505
506
507
508   
509
510   int total_len=imsize;
511   int rp=1;
512   int len= total_len/h2;
513
514
515   
516   uchar *mix=new uchar[256];
517
518
519
520     
521   for (int i = 0; i < 256 ; i++) {
522     mix[i]=Secretkey[i]^counter[i];
523   }
524
525   
526 //  cout<<"hash "<<endl;
527   for (int i = 0; i < 64 ; i++) {
528 //    DK[i]=digest[i];
529     DK[i]=mix[i];
530   }
531
532
533
534   
535   uchar Sbox1[256];
536   rc4key(DK, Sbox1, 16);
537
538   uchar Sbox2[256];
539   rc4key(&DK[16], Sbox2, 16);
540   uchar Inv_Sbox1[256];
541   uchar Inv_Sbox2[256];
542   inverse_tables(Sbox1,256,Inv_Sbox1);
543   inverse_tables(Sbox2,256,Inv_Sbox2);
544
545
546
547   
548   uchar sc[256];
549   rc4key(&DK[32], sc, 16);
550   
551   uchar outd[2*(h * h)];
552   prga(sc, 2*(h * h), outd);
553
554   int num=omp_get_max_threads();
555   cout<<"num "<<num<<endl;
556
557   uchar RM1[h*h];
558   uchar RM2[h*h];
559   for(int i=0;i<h2;i++){
560     RM1[i]=outd[i];
561     RM2[i]=outd[i+h2];
562   }
563               
564
565
566   
567     
568   
569   uchar keyp[16];
570   for (int i = 48; i < 64; i++)
571     keyp[i-48] = DK[i];
572
573 //  cout<<len<<endl;
574   int *Pbox=new int[len];
575
576
577   
578   int *PboxRM=new int[h2];
579
580   rc4keyperm(keyp, len, rp, Pbox, 16);
581
582 //  printf("len %d\n",len);
583   for(int i=0;i<len;i++) {
584 //    printf("%d \n",Pbox[i]);
585   }
586   
587   rc4keyperm(RM2, h2, rp, PboxRM, h2);
588
589   for(int i=0;i<h2;i++){
590     RM2[i]=RM1[i];
591   }
592
593  
594   double time=0;
595   double t=TimeStart();
596
597   int i;
598   switch(h) {
599   case 4: 
600     for(i=0;i<nb_test;i++)
601     {
602       if(ctr)
603         encrypt_ctr<4*4>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
604       else
605         encrypt<4*4>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
606       
607     }
608     break;
609   case 8: 
610     for(i=0;i<nb_test;i++)
611     {
612       if(ctr)
613         encrypt_ctr<8*8>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
614       else
615         encrypt<8*8>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
616       
617     }
618     break;
619   case 16: 
620     for(i=0;i<nb_test;i++)
621     {
622       if(ctr)
623         encrypt_ctr<16*16>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
624       else
625         encrypt<16*16>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
626       
627     }
628     break;
629   case 32: 
630     for(i=0;i<nb_test;i++)
631     {
632       if(ctr)
633         encrypt_ctr<32*32>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
634       else
635         encrypt<32*32>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
636       
637     }
638     break;
639   case 64: 
640     for(i=0;i<nb_test;i++)
641     {
642       if(ctr)
643         encrypt_ctr<64*64>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
644       else
645         encrypt<64*64>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
646       
647     }
648     break;
649   case 128: 
650     for(i=0;i<nb_test;i++)
651     {
652       if(ctr)
653         encrypt_ctr<128*128>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
654       else
655         encrypt<128*128>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
656       
657     }
658     break;
659   }
660   time+=TimeStop(t);
661   cout<<"Time encrypt "<<time<<endl;
662
663
664   if(lena) {
665     for(int i=0;i<oneD;i++) {
666       data_R[i]=seq2[i];
667       data_G[i]=seq2[oneD+i];
668       data_B[i]=seq2[2*oneD+i];
669     }
670     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
671   }
672   
673
674
675
676   for(int i=0;i<imsize;i++) {
677     seq[i]=0;
678   }
679
680   
681   time=0;
682   t=TimeStart();
683   switch(h) {
684   case 4:
685     for(i=0;i<nb_test;i++) {
686       if(ctr)
687         encrypt_ctr<4*4>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
688       else
689         decrypt<4*4>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
690     }
691     break;
692   case 8:
693     for(i=0;i<nb_test;i++) {
694       if(ctr)
695         encrypt_ctr<8*8>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
696       else
697         decrypt<8*8>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
698     }
699     break;
700   case 16:
701     for(i=0;i<nb_test;i++) {
702       if(ctr)
703         encrypt_ctr<16*16>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
704       else
705         decrypt<16*16>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
706     }
707     break;
708   case 32:
709     for(i=0;i<nb_test;i++) {
710       if(ctr)
711         encrypt_ctr<32*32>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
712       else
713         decrypt<32*32>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
714     }
715     break;
716   case 64:
717     for(i=0;i<nb_test;i++) {
718       if(ctr)
719         encrypt_ctr<64*64>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
720       else
721         decrypt<64*64>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
722     }
723     break;
724   case 128:
725     for(i=0;i<nb_test;i++) {
726       if(ctr)
727         encrypt_ctr<128*128>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
728       else
729         decrypt<128*128>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
730     }
731     break;  
732
733     
734   }
735
736   time+=TimeStop(t);
737   cout<<"Time decrypt "<<time<<endl;
738
739   if(lena) {
740     for(int i=0;i<oneD;i++) {
741       data_R[i]=seq[i];
742       data_G[i]=seq[oneD+i];
743       data_B[i]=seq[2*oneD+i];
744     }
745     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
746   }
747   else {
748     bool equal=true;
749     for(int i=0;i<imsize;i++) {
750       //cout<<"sol"<<(int)buffer[i]<<" "<<(int)seq[i]<<" "<<endl;
751       if(buffer[i]!=seq[i]) {
752         equal=false;
753       }
754     }
755     cout<<"RESULT CORRECT: "<<equal<<endl;
756   }
757   
758
759
760   return 0;
761 }