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

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