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

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