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

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