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

Private GIT Repository
04986d719c00e3ab367cec79c2f44c494dd15060
[Cipher_code.git] / OneRoundIoT / EnhancedOneRound / enhanced_oneround.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 cbc=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
75
76 void inverse_tables(uchar *tab, int size_tab,uchar *inv_perm_tabs) {
77
78   for(int i=0;i<size_tab;i++) {
79     inv_perm_tabs[tab[i]] = i;
80   }
81
82 }
83
84 void inverse_tables_int(int *tab, int size_tab,int *inv_perm_tabs) {
85
86   for(int i=0;i<size_tab;i++) {
87     inv_perm_tabs[tab[i]] = i;
88   }
89
90 }
91
92
93
94 void rc4key(uchar *key, uchar *sc, int size_DK) {
95
96   for(int i=0;i<256;i++) {
97     sc[i]=i;
98   }
99
100
101   uchar j0 = 0;
102   for(int i0=0; i0<256; i0++) {
103     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
104     uchar tmp = sc[i0];
105     sc[i0] = sc[j0 ];
106     sc[j0] = tmp;
107   }
108 }
109
110
111
112 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
113
114   //sc=1:len;
115
116
117   
118   for (int i=0;i<len;i++) {
119     sc[i]=i;
120   }
121   for (int it = 0; it < rp; it++) {
122     int j0 = 1;
123     for(int i0 = 0; i0<len; i0++) {
124       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
125       int tmp = sc[i0];
126       sc[i0] = sc[j0];
127       sc[j0] = tmp;
128     }
129
130   }
131 }
132
133 void prga(uchar *sc, int ldata, uchar *r) {
134   uchar i0=0;
135   uchar j0=0;
136
137   for (int it=0; it<ldata; it++) {
138     i0 = ((i0+1)&0xFE); //%255);
139     j0 = (j0 + sc[i0])&0xFF;
140     uchar tmp = sc[i0];
141     sc[i0] = sc[j0];
142     sc[j0] = tmp;
143     r[it]=sc[(sc[i0]+sc[j0])&0xFF];
144   }
145 }
146
147
148
149
150
151
152 template<int h>
153 void encrypt_ecb(uchar* seq_in, uchar *seq_out, int len,uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uint myrand, int debug) {
154
155   uchar X[h];
156   uchar Y[h];
157   uchar fX[h];
158   uchar gY[h];
159   uchar *RM1;
160   uchar *RM2;
161   
162   for(int it=0;it<len/2;it++) {
163     int ind1=Pbox[it]*h;
164     int ind2=Pbox[it+len/2]*h;
165
166
167
168     RM1=&RM[PboxSRM[it]*h];
169     RM2=&RM[h*h+PboxSRM[it]*h];
170
171     
172     for(int a=0;a<h;a+=4) {
173       X[a]=seq_in[ind2+a];
174       X[a+1]=seq_in[ind2+a+1];
175       X[a+2]=seq_in[ind2+a+2];
176       X[a+3]=seq_in[ind2+a+3];
177     }
178
179     for(int a=0;a<h;a+=4) {
180       Y[a]=seq_in[ind1+a];
181       Y[a+1]=seq_in[ind1+a+1];
182       Y[a+2]=seq_in[ind1+a+2];
183       Y[a+3]=seq_in[ind1+a+3];
184     }
185
186
187     for(int a=0;a<h;a+=4) {
188       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]]^Y[a]];
189       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]]^Y[a+1]];
190       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]]^Y[a+2]];
191       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]]^Y[a+3]];
192     }
193
194     for(int a=0;a<h;a+=4) {
195       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]]^RM2[a]];
196       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]]^RM2[a+1]];
197       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]]^RM2[a+2]];
198       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]]^RM2[a+3]];
199
200     }     
201
202     for(int a=0;a<h;a+=4) {
203       seq_out[ind2+a]=gY[a];
204       seq_out[ind2+a+1]=gY[a+1];
205       seq_out[ind2+a+2]=gY[a+2];
206       seq_out[ind2+a+3]=gY[a+3];
207     }
208
209     for(int a=0;a<h;a+=4) {
210       seq_out[ind1+a]=fX[a];
211       seq_out[ind1+a+1]=fX[a+1];
212       seq_out[ind1+a+2]=fX[a+2];
213       seq_out[ind1+a+3]=fX[a+3];
214     }
215
216
217
218   }
219   
220
221
222
223 }
224
225
226
227
228
229
230
231
232 template<int h>
233 void decrypt_ecb(uchar* seq_in, uchar *seq_out, int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *Inv_Sbox1, uchar *Inv_Sbox2,  uint myrand, int debug) {
234
235   uchar invfX[h];
236   uchar invgY[h];
237   uchar fX[h];
238   uchar gY[h];
239   uchar *RM1;
240   uchar *RM2;
241   
242   for(int it=0;it<len/2;it++) {
243     int ind1=Pbox[it]*h;
244     int ind2=Pbox[it+len/2]*h;
245
246
247     RM1=&RM[PboxSRM[it]*h];
248     RM2=&RM[h*h+PboxSRM[it]*h];
249
250     
251     for(int a=0;a<h;a+=4) {
252       gY[a]=seq_in[ind2+a];
253       gY[a+1]=seq_in[ind2+a+1];
254       gY[a+2]=seq_in[ind2+a+2];
255       gY[a+3]=seq_in[ind2+a+3];
256     }
257
258     for(int a=0;a<h;a+=4) {
259       fX[a]=seq_in[ind1+a];
260       fX[a+1]=seq_in[ind1+a+1];
261       fX[a+2]=seq_in[ind1+a+2];
262       fX[a+3]=seq_in[ind1+a+3];
263     }
264
265     for(int a=0;a<h;a+=4) {
266       invgY[a]=Inv_Sbox2[Inv_Sbox1[gY[a]]^RM2[a]]^fX[a];
267       invgY[a+1]=Inv_Sbox2[Inv_Sbox1[gY[a+1]]^RM2[a+1]]^fX[a+1];
268       invgY[a+2]=Inv_Sbox2[Inv_Sbox1[gY[a+2]]^RM2[a+2]]^fX[a+2];
269       invgY[a+3]=Inv_Sbox2[Inv_Sbox1[gY[a+3]]^RM2[a+3]]^fX[a+3];
270     }     
271
272
273     
274     for(int a=0;a<h;a+=4) {
275       invfX[a]=Inv_Sbox1[Inv_Sbox2[fX[a]]^invgY[a]]^RM1[a];
276       invfX[a+1]=Inv_Sbox1[Inv_Sbox2[fX[a+1]]^invgY[a+1]]^RM1[a+1];
277       invfX[a+2]=Inv_Sbox1[Inv_Sbox2[fX[a+2]]^invgY[a+2]]^RM1[a+2];
278       invfX[a+3]=Inv_Sbox1[Inv_Sbox2[fX[a+3]]^invgY[a+3]]^RM1[a+3];
279
280     }
281
282
283     for(int a=0;a<h;a+=4) {
284       seq_out[ind2+a]=invfX[a];
285       seq_out[ind2+a+1]=invfX[a+1];
286       seq_out[ind2+a+2]=invfX[a+2];
287       seq_out[ind2+a+3]=invfX[a+3];
288     }
289
290     for(int a=0;a<h;a+=4) {
291       seq_out[ind1+a]=invgY[a];
292       seq_out[ind1+a+1]=invgY[a+1];
293       seq_out[ind1+a+2]=invgY[a+2];
294       seq_out[ind1+a+3]=invgY[a+3];
295     }
296
297
298
299   }
300   
301
302
303
304 }
305
306
307
308
309
310 template<int h>
311 void encrypt_cbc(uchar* seq_in, uchar *seq_out, int len,uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uint myrand, int debug) {
312
313   uchar X[h];
314   uchar Y[h];
315   uchar fX[h];
316   uchar gY[h];
317   uchar IV1[h];
318   uchar IV2[h];
319   uchar *RM1;
320   uchar *RM2;
321
322   int h2=h*h;
323   for(int a=0;a<h;a+=4) {
324     IV1[a]=RM[3*h-a];
325     IV1[a+1]=RM[3*h-a-1];
326     IV1[a+2]=RM[3*h-a-2];
327     IV1[a+3]=RM[3*h-a-3];
328   }
329
330   for(int a=0;a<h;a+=4) {
331     IV2[a]=RM[h2+2*h-a];
332     IV2[a+1]=RM[h2+2*h-a-1];
333     IV2[a+2]=RM[h2+2*h-a-2];
334     IV2[a+3]=RM[h2+2*h-a-3];
335
336   }
337  
338
339   
340   for(int it=0;it<len/2;it++) {
341     int ind1=Pbox[it]*h;
342     int ind2=Pbox[it+len/2]*h;
343
344
345
346     RM1=&RM[PboxSRM[it]*h];
347     RM2=&RM[h*h+PboxSRM[it]*h];
348
349     
350     for(int a=0;a<h;a+=4) {
351       X[a]=seq_in[ind2+a];
352       X[a+1]=seq_in[ind2+a+1];
353       X[a+2]=seq_in[ind2+a+2];
354       X[a+3]=seq_in[ind2+a+3];
355     }
356
357     for(int a=0;a<h;a+=4) {
358       Y[a]=seq_in[ind1+a];
359       Y[a+1]=seq_in[ind1+a+1];
360       Y[a+2]=seq_in[ind1+a+2];
361       Y[a+3]=seq_in[ind1+a+3];
362     }
363
364
365     for(int a=0;a<h;a+=4) {
366       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
367       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
368       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
369       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
370     }
371
372     for(int a=0;a<h;a+=4) {
373       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
374       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
375       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
376       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
377
378     }     
379
380     for(int a=0;a<h;a+=4) {
381       seq_out[ind2+a]=gY[a];
382       seq_out[ind2+a+1]=gY[a+1];
383       seq_out[ind2+a+2]=gY[a+2];
384       seq_out[ind2+a+3]=gY[a+3];
385     }
386
387     for(int a=0;a<h;a+=4) {
388       seq_out[ind1+a]=fX[a];
389       seq_out[ind1+a+1]=fX[a+1];
390       seq_out[ind1+a+2]=fX[a+2];
391       seq_out[ind1+a+3]=fX[a+3];
392     }
393     for(int a=0;a<h;a+=4) {
394       IV1[a]=fX[a];
395       IV1[a+1]=fX[a+1];
396       IV1[a+2]=fX[a+2];
397       IV1[a+3]=fX[a+3];
398     }
399
400     for(int a=0;a<h;a+=4) {
401       IV2[a]=gY[a];
402       IV2[a+1]=gY[a+1];
403       IV2[a+2]=gY[a+2];
404       IV2[a+3]=gY[a+3];
405     }
406
407   }
408   
409
410
411
412 }
413
414
415
416
417
418
419
420
421 template<int h>
422 void decrypt_cbc(uchar* seq_in, uchar *seq_out, int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *Inv_Sbox1, uchar *Inv_Sbox2,  uint myrand, int debug) {
423
424   uchar invfX[h];
425   uchar invgY[h];
426   uchar fX[h];
427   uchar gY[h];
428   uchar IV1[h];
429   uchar IV2[h];
430   uchar *RM1;
431   uchar *RM2;
432
433
434   int h2=h*h;
435   for(int a=0;a<h;a+=4) {
436     IV1[a]=RM[3*h-a];
437     IV1[a+1]=RM[3*h-a-1];
438     IV1[a+2]=RM[3*h-a-2];
439     IV1[a+3]=RM[3*h-a-3];
440   }
441
442   for(int a=0;a<h;a+=4) {
443     IV2[a]=RM[h2+2*h-a];
444     IV2[a+1]=RM[h2+2*h-a-1];
445     IV2[a+2]=RM[h2+2*h-a-2];
446     IV2[a+3]=RM[h2+2*h-a-3];
447
448   }
449
450
451   
452   for(int it=0;it<len/2;it++) {
453     int ind1=Pbox[it]*h;
454     int ind2=Pbox[it+len/2]*h;
455
456
457     RM1=&RM[PboxSRM[it]*h];
458     RM2=&RM[h*h+PboxSRM[it]*h];
459
460     
461     for(int a=0;a<h;a+=4) {
462       gY[a]=seq_in[ind2+a];
463       gY[a+1]=seq_in[ind2+a+1];
464       gY[a+2]=seq_in[ind2+a+2];
465       gY[a+3]=seq_in[ind2+a+3];
466     }
467
468     for(int a=0;a<h;a+=4) {
469       fX[a]=seq_in[ind1+a];
470       fX[a+1]=seq_in[ind1+a+1];
471       fX[a+2]=seq_in[ind1+a+2];
472       fX[a+3]=seq_in[ind1+a+3];
473     }
474
475
476     for(int a=0;a<h;a+=4) {
477       invgY[a]=Inv_Sbox1[gY[a]]^RM2[a];
478       invgY[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
479       invgY[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
480       invgY[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
481     }   
482
483
484     for(int a=0;a<h;a+=4) {
485       invgY[a]=Inv_Sbox2[invgY[a]]^fX[a]^IV2[a];
486       invgY[a+1]=Inv_Sbox2[invgY[a+1]]^fX[a+1]^IV2[a+1];
487       invgY[a+2]=Inv_Sbox2[invgY[a+2]]^fX[a+2]^IV2[a+2];
488       invgY[a+3]=Inv_Sbox2[invgY[a+3]]^fX[a+3]^IV2[a+3];
489     }   
490
491
492     for(int a=0;a<h;a+=4) {
493       invfX[a]=Inv_Sbox2[fX[a]]^invgY[a];
494       invfX[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
495       invfX[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
496       invfX[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
497
498     }
499
500     for(int a=0;a<h;a+=4) {
501       invfX[a]=Inv_Sbox1[invfX[a]]^RM1[a]^IV1[a];
502       invfX[a+1]=Inv_Sbox1[invfX[a+1]]^RM1[a+1]^IV1[a+1];
503       invfX[a+2]=Inv_Sbox1[invfX[a+2]]^RM1[a+2]^IV1[a+2];
504       invfX[a+3]=Inv_Sbox1[invfX[a+3]]^RM1[a+3]^IV1[a+3];
505
506     }
507
508
509     for(int a=0;a<h;a+=4) {
510       seq_out[ind2+a]=invfX[a];
511       seq_out[ind2+a+1]=invfX[a+1];
512       seq_out[ind2+a+2]=invfX[a+2];
513       seq_out[ind2+a+3]=invfX[a+3];
514     }
515
516     for(int a=0;a<h;a+=4) {
517       seq_out[ind1+a]=invgY[a];
518       seq_out[ind1+a+1]=invgY[a+1];
519       seq_out[ind1+a+2]=invgY[a+2];
520       seq_out[ind1+a+3]=invgY[a+3];
521     }
522     for(int a=0;a<h;a+=4) {
523       IV1[a]=fX[a];
524       IV1[a+1]=fX[a+1];
525       IV1[a+2]=fX[a+2];
526       IV1[a+3]=fX[a+3];
527     }
528
529     for(int a=0;a<h;a+=4) {
530       IV2[a]=gY[a];
531       IV2[a+1]=gY[a+1];
532       IV2[a+2]=gY[a+2];
533       IV2[a+3]=gY[a+3];
534     }
535
536
537   }
538   
539
540
541
542 }
543
544
545 int main(int argc, char** argv) {
546
547
548   int h=32;
549   int lena=0;
550   int size_buf=1;
551
552
553   
554   for(int i=1; i<argc; i++){
555     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
556     if(strncmp(argv[i],"cbc",3)==0) cbc = atoi(&(argv[i][3]));          //CBC ? 1  otherwise CBC like
557     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
558     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
559     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
560   }
561
562 /*  printf("nb times %d\n",nb_test);
563   printf("ctr %d\n",ctr);
564   printf("h %d\n",h);
565   printf("lena %d\n",lena);
566   printf("size_buf %d\n",size_buf);
567 */
568   int h2=h*h;
569   
570
571       
572   int seed=time(NULL);
573 //  cout<<seed<<endl;
574   srand48(seed);
575
576   uchar Secretkey[key_size];
577
578   uchar counter[key_size];
579
580   for(int i=0;i<key_size;i++) {
581     Secretkey[i]=lrand48()&0xFF;
582     counter[i]=lrand48()&0xFF;
583   }
584
585   
586   int size = 128;
587   uchar DK[size];
588
589
590
591
592   int width;
593   int height;
594
595   uchar *data_R, *data_G, *data_B;
596   int imsize;
597   uchar *buffer;
598
599
600
601
602   
603   if(lena==1) {
604     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
605 //    load_RGB_pixmap("8192.ppm", &width, &height, &data_R, &data_G, &data_B);
606     imsize=width*height*3;
607 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
608   }
609   else {
610     width=height=size_buf;
611     imsize=width*height;
612     buffer=new uchar[imsize];
613     for(int i=0;i<imsize;i++) {
614       buffer[i]=lrand48();
615     }
616   }
617
618
619
620   
621   
622   uchar* seq= new uchar[imsize];
623   uchar* seq2= new uchar[imsize];
624
625   int oneD=width*height;
626   if(lena) {
627     for(int i=0;i<oneD;i++) {
628       seq[i]=data_R[i];
629       seq[oneD+i]=data_G[i];
630       seq[2*oneD+i]=data_B[i];
631     }
632   }
633   else {
634     for(int i=0;i<oneD;i++) {
635       seq[i]=buffer[i];
636     }
637   }
638
639
640
641   
642
643   int total_len=imsize;
644   int rp=1;
645   int len= total_len/h;
646
647
648   
649   uchar *mix=new uchar[256];
650
651
652
653     
654   for (int i = 0; i < 256 ; i++) {
655     mix[i]=Secretkey[i]^counter[i];
656     
657   }
658   gchar  *sha512;
659
660   sha512 = g_compute_checksum_for_string(G_CHECKSUM_SHA512, (const char*) mix, 256);
661 //  g_print("%s\n", sha512);
662  
663
664
665
666
667
668
669
670   
671 //  cout<<"hash "<<endl;
672   for (int i = 0; i < 128 ; i++) {
673 //    DK[i]=digest[i];
674     DK[i]=sha512[i];
675   }
676   g_free(sha512);
677
678
679   int *Pbox=new int[len];
680   int *PboxSRM=new int[len/2];
681   int *PboxSRM2=new int[len/2];
682   uchar Sbox1[256];
683   uchar Sbox2[256];  
684   uchar Inv_Sbox1[256];
685   uchar Inv_Sbox2[256];
686   uchar sc[256];  
687   uchar RM[h2*2];
688
689
690   uint myrand=0;
691
692
693   double time_encrypt=0;
694   double time_decrypt=0;
695   
696
697   double t=TimeStart();  
698   rc4key(DK, Sbox1, 8);
699   
700   
701   rc4key(&DK[8], Sbox2, 8);
702   
703   rc4key(&DK[16], sc, 16);
704   prga(sc, h2*2, RM);
705
706
707
708
709   
710   rc4keyperm(&DK[72], len, rp, Pbox, 16);
711   
712   
713   rc4keyperm(&DK[88], len/2, rp, PboxSRM2, 16);
714
715   for(int i=0;i<len/2;i++) {
716     PboxSRM[i]=PboxSRM2[i]&(h-1);
717   }
718
719 /*
720   for(int i=0;i<h*2;i++) {
721     for(int j=0;j<h;j++)
722       cout<<(int)RM[i*h+j]<<" ";
723     cout<<endl;
724   }
725 */
726
727
728   
729   //time+=TimeStop(t);
730   //cout<<"Time initializaton "<<time<<endl;
731
732
733
734   myrand=0;
735   for(int i=0;i<32;i++) {
736     myrand|=DK[i]&1;
737     myrand<<=1;
738   }
739   uint myrand_copy=myrand;
740
741  
742
743
744
745   
746   
747   inverse_tables(Sbox1,256,Inv_Sbox1);
748   inverse_tables(Sbox2,256,Inv_Sbox2);
749
750
751
752   
753   time_encrypt=0;
754   t=TimeStart();
755
756   int i;
757   switch(h) {
758   case 4: 
759     for(i=0;i<nb_test;i++)
760     {
761       if(cbc)
762         encrypt_cbc<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
763       else
764         encrypt_ecb<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
765     }
766     break;
767   case 8: 
768     for(i=0;i<nb_test;i++)
769     {
770       if(cbc)
771         encrypt_cbc<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
772       else
773         encrypt_ecb<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
774     }
775     break;
776   case 16: 
777     for(i=0;i<nb_test;i++)
778     {
779       if(cbc)
780         encrypt_cbc<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
781       else
782         encrypt_ecb<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
783     }
784     break;
785   case 32: 
786     for(i=0;i<nb_test;i++)
787     {
788       if(cbc)
789         encrypt_cbc<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
790       else
791         encrypt_ecb<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
792     }
793     break;
794   case 64: 
795     for(i=0;i<nb_test;i++)
796     {
797       if(cbc)
798         encrypt_cbc<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
799       else
800         encrypt_ecb<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
801       
802     }
803     break;
804   case 128: 
805     for(i=0;i<nb_test;i++)
806     {
807       if(cbc)
808         encrypt_cbc<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
809       else
810         encrypt_ecb<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
811       
812     }
813     break;
814   }
815   time_encrypt+=TimeStop(t);
816   //cout<<"Time encrypt "<<
817   cout<<(double)imsize*nb_test/time_encrypt<<"\t";
818
819
820   if(lena) {
821     for(int i=0;i<oneD;i++) {
822       data_R[i]=seq2[i];
823       data_G[i]=seq2[oneD+i];
824       data_B[i]=seq2[2*oneD+i];
825     }
826     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
827   }
828   
829
830   time_decrypt=0;
831   t=TimeStart();
832   switch(h) {
833   case 4:
834     for(i=0;i<nb_test;i++) {
835       if(cbc)
836         decrypt_cbc<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
837       else
838         decrypt_ecb<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
839     }
840     break;
841   case 8:
842     for(i=0;i<nb_test;i++) {
843       if(cbc)
844         decrypt_cbc<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
845       else
846         decrypt_ecb<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
847     }
848     break;
849   case 16:
850     for(i=0;i<nb_test;i++) {
851       if(cbc)
852         decrypt_cbc<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
853       else
854         decrypt_ecb<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
855     }
856     break;
857   case 32:
858     for(i=0;i<nb_test;i++) {
859       if(cbc)
860         decrypt_cbc<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
861       else
862         decrypt_ecb<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
863     }
864     break;
865   case 64:
866     for(i=0;i<nb_test;i++) {
867       if(cbc)
868         decrypt_cbc<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
869       else
870         decrypt_ecb<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
871     }
872     break;
873   case 128:
874     for(i=0;i<nb_test;i++) {
875       if(cbc)
876         decrypt_cbc<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
877       else
878         decrypt_ecb<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
879     }
880     break;
881   }
882
883   time_decrypt+=TimeStop(t);
884   //cout<<"Time decrypt "
885   cout<<(double)imsize*nb_test/time_decrypt<<"\t";
886
887   if(lena) {
888     for(int i=0;i<oneD;i++) {
889       data_R[i]=seq[i];
890       data_G[i]=seq[oneD+i];
891       data_B[i]=seq[2*oneD+i];
892     }
893     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
894   }
895   else {
896     bool equal=true;
897     for(int i=0;i<imsize;i++) {
898       //cout<<(int)buffer[i]<<endl;
899       if(buffer[i]!=seq[i]) {
900         equal=false;
901       }
902     }
903 //    cout<<"RESULT CORRECT: "<<equal<<endl;
904   }
905   
906
907
908   return 0;
909 }