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

Private GIT Repository
954a1274427d6c63636cd308efd58115452a77a7
[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
324
325
326   
327   for(int a=0;a<h;a+=4) {
328     myrand=xorshift32(myrand);
329     uint mm=myrand;
330     IV1[a]=(mm&255);
331     mm>>=8;
332     IV1[a+1]=(mm&255);
333     mm>>=8;
334     IV1[a+2]=(mm&255);
335     mm>>=8;
336     IV1[a+3]=(mm&255);
337   }
338
339   for(int a=0;a<h;a+=4) {
340     myrand=xorshift32(myrand);
341     uint mm=myrand;
342     IV2[a]=(mm&255);
343     mm>>=8;
344     IV2[a+1]=(mm&255);
345     mm>>=8;
346     IV2[a+2]=(mm&255);
347     mm>>=8;
348     IV2[a+3]=(mm&255);
349
350   }
351  
352
353   
354   for(int it=0;it<len/2;it++) {
355     int ind1=Pbox[it]*h;
356     int ind2=Pbox[it+len/2]*h;
357
358
359
360     RM1=&RM[PboxSRM[it]*h];
361     RM2=&RM[h*h+PboxSRM[it]*h];
362
363     
364     for(int a=0;a<h;a+=4) {
365       X[a]=seq_in[ind2+a];
366       X[a+1]=seq_in[ind2+a+1];
367       X[a+2]=seq_in[ind2+a+2];
368       X[a+3]=seq_in[ind2+a+3];
369     }
370
371     for(int a=0;a<h;a+=4) {
372       Y[a]=seq_in[ind1+a];
373       Y[a+1]=seq_in[ind1+a+1];
374       Y[a+2]=seq_in[ind1+a+2];
375       Y[a+3]=seq_in[ind1+a+3];
376     }
377
378
379     for(int a=0;a<h;a+=4) {
380       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
381       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
382       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
383       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
384     }
385
386     for(int a=0;a<h;a+=4) {
387       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
388       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
389       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
390       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
391
392     }     
393
394     for(int a=0;a<h;a+=4) {
395       seq_out[ind2+a]=gY[a];
396       seq_out[ind2+a+1]=gY[a+1];
397       seq_out[ind2+a+2]=gY[a+2];
398       seq_out[ind2+a+3]=gY[a+3];
399     }
400
401     for(int a=0;a<h;a+=4) {
402       seq_out[ind1+a]=fX[a];
403       seq_out[ind1+a+1]=fX[a+1];
404       seq_out[ind1+a+2]=fX[a+2];
405       seq_out[ind1+a+3]=fX[a+3];
406     }
407     for(int a=0;a<h;a+=4) {
408       IV1[a]=fX[a];
409       IV1[a+1]=fX[a+1];
410       IV1[a+2]=fX[a+2];
411       IV1[a+3]=fX[a+3];
412     }
413
414     for(int a=0;a<h;a+=4) {
415       IV2[a]=gY[a];
416       IV2[a+1]=gY[a+1];
417       IV2[a+2]=gY[a+2];
418       IV2[a+3]=gY[a+3];
419     }
420
421   }
422   
423
424
425
426 }
427
428
429
430
431
432
433
434
435 template<int h>
436 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) {
437
438   uchar invfX[h];
439   uchar invgY[h];
440   uchar fX[h];
441   uchar gY[h];
442   uchar IV1[h];
443   uchar IV2[h];
444   uchar *RM1;
445   uchar *RM2;
446
447   for(int a=0;a<h;a+=4) {
448     myrand=xorshift32(myrand);
449     uint mm=myrand;
450     IV1[a]=(mm&255);
451     mm>>=8;
452     IV1[a+1]=(mm&255);
453     mm>>=8;
454     IV1[a+2]=(mm&255);
455     mm>>=8;
456     IV1[a+3]=(mm&255);
457   }
458
459   for(int a=0;a<h;a+=4) {
460     myrand=xorshift32(myrand);
461     uint mm=myrand;
462     IV2[a]=(mm&255);
463     mm>>=8;
464     IV2[a+1]=(mm&255);
465     mm>>=8;
466     IV2[a+2]=(mm&255);
467     mm>>=8;
468     IV2[a+3]=(mm&255);
469
470   }
471
472   
473  
474
475
476   
477   for(int it=0;it<len/2;it++) {
478     int ind1=Pbox[it]*h;
479     int ind2=Pbox[it+len/2]*h;
480
481
482     RM1=&RM[PboxSRM[it]*h];
483     RM2=&RM[h*h+PboxSRM[it]*h];
484
485     
486     for(int a=0;a<h;a+=4) {
487       gY[a]=seq_in[ind2+a];
488       gY[a+1]=seq_in[ind2+a+1];
489       gY[a+2]=seq_in[ind2+a+2];
490       gY[a+3]=seq_in[ind2+a+3];
491     }
492
493     for(int a=0;a<h;a+=4) {
494       fX[a]=seq_in[ind1+a];
495       fX[a+1]=seq_in[ind1+a+1];
496       fX[a+2]=seq_in[ind1+a+2];
497       fX[a+3]=seq_in[ind1+a+3];
498     }
499
500
501     for(int a=0;a<h;a+=4) {
502       invgY[a]=Inv_Sbox1[gY[a]]^RM2[a];
503       invgY[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
504       invgY[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
505       invgY[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
506     }   
507
508
509     for(int a=0;a<h;a+=4) {
510       invgY[a]=Inv_Sbox2[invgY[a]]^fX[a]^IV2[a];
511       invgY[a+1]=Inv_Sbox2[invgY[a+1]]^fX[a+1]^IV2[a+1];
512       invgY[a+2]=Inv_Sbox2[invgY[a+2]]^fX[a+2]^IV2[a+2];
513       invgY[a+3]=Inv_Sbox2[invgY[a+3]]^fX[a+3]^IV2[a+3];
514     }   
515
516
517     for(int a=0;a<h;a+=4) {
518       invfX[a]=Inv_Sbox2[fX[a]]^invgY[a];
519       invfX[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
520       invfX[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
521       invfX[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
522
523     }
524
525     for(int a=0;a<h;a+=4) {
526       invfX[a]=Inv_Sbox1[invfX[a]]^RM1[a]^IV1[a];
527       invfX[a+1]=Inv_Sbox1[invfX[a+1]]^RM1[a+1]^IV1[a+1];
528       invfX[a+2]=Inv_Sbox1[invfX[a+2]]^RM1[a+2]^IV1[a+2];
529       invfX[a+3]=Inv_Sbox1[invfX[a+3]]^RM1[a+3]^IV1[a+3];
530
531     }
532
533
534     for(int a=0;a<h;a+=4) {
535       seq_out[ind2+a]=invfX[a];
536       seq_out[ind2+a+1]=invfX[a+1];
537       seq_out[ind2+a+2]=invfX[a+2];
538       seq_out[ind2+a+3]=invfX[a+3];
539     }
540
541     for(int a=0;a<h;a+=4) {
542       seq_out[ind1+a]=invgY[a];
543       seq_out[ind1+a+1]=invgY[a+1];
544       seq_out[ind1+a+2]=invgY[a+2];
545       seq_out[ind1+a+3]=invgY[a+3];
546     }
547     for(int a=0;a<h;a+=4) {
548       IV1[a]=fX[a];
549       IV1[a+1]=fX[a+1];
550       IV1[a+2]=fX[a+2];
551       IV1[a+3]=fX[a+3];
552     }
553
554     for(int a=0;a<h;a+=4) {
555       IV2[a]=gY[a];
556       IV2[a+1]=gY[a+1];
557       IV2[a+2]=gY[a+2];
558       IV2[a+3]=gY[a+3];
559     }
560
561
562   }
563   
564
565
566
567 }
568
569
570 int main(int argc, char** argv) {
571
572
573   int h=32;
574   int lena=0;
575   int size_buf=1;
576
577
578   
579   for(int i=1; i<argc; i++){
580     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
581     if(strncmp(argv[i],"cbc",3)==0) cbc = atoi(&(argv[i][3]));          //CBC ? 1  otherwise CBC like
582     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
583     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
584     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
585   }
586
587 /*  printf("nb times %d\n",nb_test);
588   printf("ctr %d\n",ctr);
589   printf("h %d\n",h);
590   printf("lena %d\n",lena);
591   printf("size_buf %d\n",size_buf);
592 */
593   int h2=h*h;
594   
595
596       
597   int seed=time(NULL);
598 //  cout<<seed<<endl;
599   srand48(seed);
600
601   uchar Secretkey[key_size];
602
603   uchar counter[key_size];
604
605   for(int i=0;i<key_size;i++) {
606     Secretkey[i]=lrand48()&0xFF;
607     counter[i]=lrand48()&0xFF;
608   }
609
610   
611   int size = 128;
612   uchar DK[size];
613
614
615
616
617   int width;
618   int height;
619
620   uchar *data_R, *data_G, *data_B;
621   int imsize;
622   uchar *buffer;
623
624
625
626
627   
628   if(lena==1) {
629     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
630 //    load_RGB_pixmap("8192.ppm", &width, &height, &data_R, &data_G, &data_B);
631     imsize=width*height*3;
632 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
633   }
634   else {
635     width=height=size_buf;
636     imsize=width*height;
637     buffer=new uchar[imsize];
638     for(int i=0;i<imsize;i++) {
639       buffer[i]=lrand48();
640     }
641   }
642
643
644
645   
646   
647   uchar* seq= new uchar[imsize];
648   uchar* seq2= new uchar[imsize];
649
650   int oneD=width*height;
651   if(lena) {
652     for(int i=0;i<oneD;i++) {
653       seq[i]=data_R[i];
654       seq[oneD+i]=data_G[i];
655       seq[2*oneD+i]=data_B[i];
656     }
657   }
658   else {
659     for(int i=0;i<oneD;i++) {
660       seq[i]=buffer[i];
661     }
662   }
663
664
665
666   
667
668   int total_len=imsize;
669   int rp=1;
670   int len= total_len/h;
671
672
673   
674   uchar *mix=new uchar[256];
675
676
677
678     
679   for (int i = 0; i < 256 ; i++) {
680     mix[i]=Secretkey[i]^counter[i];
681     
682   }
683   gchar  *sha512;
684
685   sha512 = g_compute_checksum_for_string(G_CHECKSUM_SHA512, (const char*) mix, 256);
686 //  g_print("%s\n", sha512);
687  
688
689
690
691
692
693
694
695   
696 //  cout<<"hash "<<endl;
697   for (int i = 0; i < 128 ; i++) {
698 //    DK[i]=digest[i];
699     DK[i]=sha512[i];
700   }
701   g_free(sha512);
702
703
704   int *Pbox=new int[len];
705   int *PboxSRM=new int[len/2];
706   int *PboxSRM2=new int[len/2];
707   uchar Sbox1[256];
708   uchar Sbox2[256];  
709   uchar Inv_Sbox1[256];
710   uchar Inv_Sbox2[256];
711   uchar sc[256];  
712   uchar RM[h2*2];
713
714
715   uint myrand=0;
716
717
718   double time_encrypt=0;
719   double time_decrypt=0;
720   
721
722   double t=TimeStart();  
723   rc4key(DK, Sbox1, 8);
724   
725   
726   rc4key(&DK[8], Sbox2, 8);
727   
728   rc4key(&DK[16], sc, 16);
729   prga(sc, h2*2, RM);
730
731
732
733
734   
735   rc4keyperm(&DK[72], len, rp, Pbox, 16);
736   
737   
738   rc4keyperm(&DK[88], len/2, rp, PboxSRM2, 16);
739
740   for(int i=0;i<len/2;i++) {
741     PboxSRM[i]=PboxSRM2[i]&(h-1);
742   }
743
744 /*
745   for(int i=0;i<h*2;i++) {
746     for(int j=0;j<h;j++)
747       cout<<(int)RM[i*h+j]<<" ";
748     cout<<endl;
749   }
750 */
751
752
753   
754   //time+=TimeStop(t);
755   //cout<<"Time initializaton "<<time<<endl;
756
757
758
759   myrand=0;
760   for(int i=0;i<32;i++) {
761     myrand|=DK[i]&1;
762     myrand<<=1;
763   }
764   uint myrand_copy=myrand;
765
766  
767
768
769
770   
771   
772   inverse_tables(Sbox1,256,Inv_Sbox1);
773   inverse_tables(Sbox2,256,Inv_Sbox2);
774
775
776
777   
778   time_encrypt=0;
779   t=TimeStart();
780
781   int i;
782   switch(h) {
783   case 4: 
784     for(i=0;i<nb_test;i++)
785     {
786       if(cbc)
787         encrypt_cbc<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
788       else
789         encrypt_ecb<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
790     }
791     break;
792   case 8: 
793     for(i=0;i<nb_test;i++)
794     {
795       if(cbc)
796         encrypt_cbc<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
797       else
798         encrypt_ecb<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
799     }
800     break;
801   case 16: 
802     for(i=0;i<nb_test;i++)
803     {
804       if(cbc)
805         encrypt_cbc<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
806       else
807         encrypt_ecb<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
808     }
809     break;
810   case 32: 
811     for(i=0;i<nb_test;i++)
812     {
813       if(cbc)
814         encrypt_cbc<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
815       else
816         encrypt_ecb<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
817     }
818     break;
819   case 64: 
820     for(i=0;i<nb_test;i++)
821     {
822       if(cbc)
823         encrypt_cbc<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
824       else
825         encrypt_ecb<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
826       
827     }
828     break;
829   case 128: 
830     for(i=0;i<nb_test;i++)
831     {
832       if(cbc)
833         encrypt_cbc<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
834       else
835         encrypt_ecb<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
836       
837     }
838     break;
839   }
840   time_encrypt+=TimeStop(t);
841   //cout<<"Time encrypt "<<
842   cout<<(double)imsize*nb_test/time_encrypt<<"\t";
843
844
845   if(lena) {
846     for(int i=0;i<oneD;i++) {
847       data_R[i]=seq2[i];
848       data_G[i]=seq2[oneD+i];
849       data_B[i]=seq2[2*oneD+i];
850     }
851     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
852   }
853
854   
855
856   time_decrypt=0;
857   t=TimeStart();
858   switch(h) {
859   case 4:
860     for(i=0;i<nb_test;i++) {
861       if(cbc)
862         decrypt_cbc<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
863       else
864         decrypt_ecb<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
865     }
866     break;
867   case 8:
868     for(i=0;i<nb_test;i++) {
869       if(cbc)
870         decrypt_cbc<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
871       else
872         decrypt_ecb<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
873     }
874     break;
875   case 16:
876     for(i=0;i<nb_test;i++) {
877       if(cbc)
878         decrypt_cbc<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
879       else
880         decrypt_ecb<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
881     }
882     break;
883   case 32:
884     for(i=0;i<nb_test;i++) {
885       if(cbc)
886         decrypt_cbc<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
887       else
888         decrypt_ecb<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
889     }
890     break;
891   case 64:
892     for(i=0;i<nb_test;i++) {
893       if(cbc)
894         decrypt_cbc<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
895       else
896         decrypt_ecb<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
897     }
898     break;
899   case 128:
900     for(i=0;i<nb_test;i++) {
901       if(cbc)
902         decrypt_cbc<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
903       else
904         decrypt_ecb<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
905     }
906     break;
907   }
908
909   time_decrypt+=TimeStop(t);
910   //cout<<"Time decrypt "
911   cout<<(double)imsize*nb_test/time_decrypt<<"\t";
912
913   if(lena) {
914     for(int i=0;i<oneD;i++) {
915       data_R[i]=seq[i];
916       data_G[i]=seq[oneD+i];
917       data_B[i]=seq[2*oneD+i];
918     }
919     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
920   }
921   else {
922     bool equal=true;
923     for(int i=0;i<imsize;i++) {
924       //cout<<(int)buffer[i]<<endl;
925       if(buffer[i]!=seq[i]) {
926         equal=false;
927       }
928     }
929 //    cout<<"RESULT CORRECT: "<<equal<<endl;
930   }
931   
932
933
934   return 0;
935 }