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

Private GIT Repository
test substi
[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 cbcprng=0;
35 int cbcrm=0;
36 int ecbrm=0;
37 int ecbprng=0;
38
39
40
41 typedef __uint64_t mylong;
42
43
44 typedef unsigned char   uchar;
45
46
47 double TimeStart()
48 {
49   struct timeval tstart;
50   gettimeofday(&tstart,0);
51   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
52 }
53
54 double TimeStop(double t)
55 {
56   struct timeval tend;
57
58   gettimeofday(&tend,0);
59   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
60   return (t);
61 }
62
63
64
65
66 uint xorshift32(const uint t)
67 {
68   /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
69   uint x = t;
70   x ^= x << 13;
71   x ^= x >> 17;
72   x ^= x << 5;
73   return x;
74 }
75
76
77 mylong xorseed;
78
79 mylong xorshift64()
80 {
81         /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
82         mylong x = xorseed;
83         x ^= x >> 12; // a
84         x ^= x << 25; // b
85         x ^= x >> 27; // c
86
87
88         return xorseed=x;
89 }
90
91 /*
92 __uint128_t g_lehmer64_state;
93
94 inline uint64_t splitmix64_stateless(uint64_t index) {
95   uint64_t z = (index + UINT64_C(0x9E3779B97F4A7C15));
96   z = (z ^ (z >> 30)) * UINT64_C(0xBF58476D1CE4E5B9);
97   z = (z ^ (z >> 27)) * UINT64_C(0x94D049BB133111EB);
98   return z ^ (z >> 31);
99 }
100
101
102 inline void lehmer64_seed(uint64_t seed) {
103   g_lehmer64_state = (((__uint128_t)splitmix64_stateless(seed)) << 64) +
104                      splitmix64_stateless(seed + 1);
105 }
106
107 inline uint64_t lehmer64() {
108   g_lehmer64_state *= UINT64_C(0xda942042e4dd58b5);
109   ;
110   return g_lehmer64_state >> 64;
111 }
112
113 */
114
115
116
117 void inverse_tables(uchar *tab, int size_tab,uchar *inv_perm_tabs) {
118
119   for(int i=0;i<size_tab;i++) {
120     inv_perm_tabs[tab[i]] = i;
121   }
122
123 }
124
125 void inverse_tables_int(int *tab, int size_tab,int *inv_perm_tabs) {
126
127   for(int i=0;i<size_tab;i++) {
128     inv_perm_tabs[tab[i]] = i;
129   }
130
131 }
132
133
134
135 void rc4key(uchar *key, uchar *sc, int size_DK) {
136
137   for(int i=0;i<256;i++) {
138     sc[i]=i;
139   }
140
141
142   uchar j0 = 0;
143   for(int i0=0; i0<256; i0++) {
144     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
145     uchar tmp = sc[i0];
146     sc[i0] = sc[j0 ];
147     sc[j0] = tmp;
148   }
149 }
150
151
152
153 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
154
155   //sc=1:len;
156
157
158   
159   for (int i=0;i<len;i++) {
160     sc[i]=i;
161   }
162   for (int it = 0; it < rp; it++) {
163     int j0 = 1;
164     for(int i0 = 0; i0<len; i0++) {
165       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
166       int tmp = sc[i0];
167       sc[i0] = sc[j0];
168       sc[j0] = tmp;
169     }
170
171   }
172 }
173
174 void prga(uchar *sc, int ldata, uchar *r) {
175   uchar i0=0;
176   uchar j0=0;
177
178   for (int it=0; it<ldata; it++) {
179     i0 = ((i0+1)%255);
180     j0 = (j0 + sc[i0])&0xFF;
181     uchar tmp = sc[i0];
182     sc[i0] = sc[j0];
183     sc[j0] = tmp;
184     r[it]=sc[(sc[i0]+sc[j0])&0xFF];
185   }
186 }
187
188
189
190
191
192
193 template<int h>
194 void encrypt_ecb_prng(uchar* seq_in, uchar *seq_out, int len,uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar* IV,mylong myrand, int debug) {
195
196   uchar X[h];
197   uchar Y[h];
198   uchar fX[h];
199   uchar gY[h];
200   uchar RM1[h];
201   uchar RM2[h];
202   uchar tmp[h];
203   mylong *rm1=(mylong*)RM1;
204   mylong *rm2=(mylong*)RM2;
205
206   
207   
208   for(int it=0;it<len/2;it++) {
209     int ind1=Pbox[it]*h;
210     int ind2=Pbox[it+len/2]*h;
211
212     
213     for(int a=0;a<(h>>3);a++) {
214       myrand=xorshift64();
215       rm1[a]=myrand;
216       myrand=xorshift64();
217       rm2[a]=myrand;
218     }  
219
220
221   
222     for(int a=0;a<h;a+=4) {
223       X[a]=seq_in[ind2+a];
224       X[a+1]=seq_in[ind2+a+1];
225       X[a+2]=seq_in[ind2+a+2];
226       X[a+3]=seq_in[ind2+a+3];
227     }
228
229     for(int a=0;a<h;a+=4) {
230       Y[a]=seq_in[ind1+a];
231       Y[a+1]=seq_in[ind1+a+1];
232       Y[a+2]=seq_in[ind1+a+2];
233       Y[a+3]=seq_in[ind1+a+3];
234     }
235
236
237     for(int a=0;a<h;a+=4) {
238       tmp[a]=Sbox1[X[a]^RM1[a]];
239       tmp[a+1]=Sbox1[X[a+1]^RM1[a+1]];
240       tmp[a+2]=Sbox1[X[a+2]^RM1[a+2]];
241       tmp[a+3]=Sbox1[X[a+3]^RM1[a+3]];
242     }
243     
244     for(int a=0;a<h;a+=4) {
245       fX[a]=Sbox2[tmp[a]^Y[a]];
246       fX[a+1]=Sbox2[tmp[a+1]^Y[a+1]];
247       fX[a+2]=Sbox2[tmp[a+2]^Y[a+2]];
248       fX[a+3]=Sbox2[tmp[a+3]^Y[a+3]];
249     }
250
251       
252     /*for(int a=0;a<h;a+=4) {
253       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]]^Y[a]];
254       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]]^Y[a+1]];
255       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]]^Y[a+2]];
256       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]]^Y[a+3]];
257       }
258     */
259
260
261
262     for(int a=0;a<h;a+=4) {
263       tmp[a]=Sbox2[fX[a]^Y[a]];
264       tmp[a+1]=Sbox2[fX[a+1]^Y[a+1]];
265       tmp[a+2]=Sbox2[fX[a+2]^Y[a+2]];
266       tmp[a+3]=Sbox2[fX[a+3]^Y[a+3]];
267
268     }   
269     for(int a=0;a<h;a+=4) {
270       gY[a]=Sbox1[tmp[a]^RM2[a]];
271       gY[a+1]=Sbox1[tmp[a+1]^RM2[a+1]];
272       gY[a+2]=Sbox1[tmp[a+2]^RM2[a+2]];
273       gY[a+3]=Sbox1[tmp[a+3]^RM2[a+3]];
274
275     }   
276     
277     
278     /* for(int a=0;a<h;a+=4) {
279       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]]^RM2[a]];
280       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]]^RM2[a+1]];
281       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]]^RM2[a+2]];
282       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]]^RM2[a+3]];
283
284       } */  
285     
286
287   
288
289
290
291     for(int a=0;a<h;a+=4) {
292       seq_out[ind2+a]=gY[a];
293       seq_out[ind2+a+1]=gY[a+1];
294       seq_out[ind2+a+2]=gY[a+2];
295       seq_out[ind2+a+3]=gY[a+3];
296     }
297
298     for(int a=0;a<h;a+=4) {
299       seq_out[ind1+a]=fX[a];
300       seq_out[ind1+a+1]=fX[a+1];
301       seq_out[ind1+a+2]=fX[a+2];
302       seq_out[ind1+a+3]=fX[a+3];
303     }
304
305
306
307   }
308   
309
310
311
312 }
313
314
315
316
317
318
319
320
321 template<int h>
322 void decrypt_ecb_prng(uchar* seq_in, uchar *seq_out, int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *Inv_Sbox1, uchar *Inv_Sbox2,  uchar* IV,mylong myrand, int debug) {
323
324   uchar invfX[h];
325   uchar invgY[h];
326   uchar fX[h];
327   uchar gY[h];
328   uchar RM1[h];
329   uchar RM2[h];
330   uchar tmp[h];
331   mylong *rm1=(mylong*)RM1;
332   mylong *rm2=(mylong*)RM2;
333
334   
335   for(int it=0;it<len/2;it++) {
336     int ind1=Pbox[it]*h;
337     int ind2=Pbox[it+len/2]*h;
338
339
340     for(int a=0;a<(h>>3);a++) {
341       myrand=xorshift64();
342       rm1[a]=myrand;
343       myrand=xorshift64();
344       rm2[a]=myrand;
345     }
346
347
348     
349     for(int a=0;a<h;a+=4) {
350       gY[a]=seq_in[ind2+a];
351       gY[a+1]=seq_in[ind2+a+1];
352       gY[a+2]=seq_in[ind2+a+2];
353       gY[a+3]=seq_in[ind2+a+3];
354     }
355
356     for(int a=0;a<h;a+=4) {
357       fX[a]=seq_in[ind1+a];
358       fX[a+1]=seq_in[ind1+a+1];
359       fX[a+2]=seq_in[ind1+a+2];
360       fX[a+3]=seq_in[ind1+a+3];
361     }
362
363
364
365
366     for(int a=0;a<h;a+=4) {
367       tmp[a]=Inv_Sbox1[gY[a]]^RM2[a];
368       tmp[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
369       tmp[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
370       tmp[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
371     } 
372
373
374     for(int a=0;a<h;a+=4) {
375       invgY[a]=Inv_Sbox2[tmp[a]]^fX[a];
376       invgY[a+1]=Inv_Sbox2[tmp[a+1]]^fX[a+1];
377       invgY[a+2]=Inv_Sbox2[tmp[a+2]]^fX[a+2];
378       invgY[a+3]=Inv_Sbox2[tmp[a+3]]^fX[a+3];
379     } 
380
381
382
383     /*  for(int a=0;a<h;a+=4) {
384       invgY[a]=Inv_Sbox2[Inv_Sbox1[gY[a]]^RM2[a]]^fX[a];
385       invgY[a+1]=Inv_Sbox2[Inv_Sbox1[gY[a+1]]^RM2[a+1]]^fX[a+1];
386       invgY[a+2]=Inv_Sbox2[Inv_Sbox1[gY[a+2]]^RM2[a+2]]^fX[a+2];
387       invgY[a+3]=Inv_Sbox2[Inv_Sbox1[gY[a+3]]^RM2[a+3]]^fX[a+3];
388       } */    
389
390
391
392
393     for(int a=0;a<h;a+=4) {
394       tmp[a]=Inv_Sbox2[fX[a]]^invgY[a];
395       tmp[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
396       tmp[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
397       tmp[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
398
399     }
400     
401     for(int a=0;a<h;a+=4) {
402       invfX[a]=Inv_Sbox1[tmp[a]]^RM1[a];
403       invfX[a+1]=Inv_Sbox1[tmp[a+1]]^RM1[a+1];
404       invfX[a+2]=Inv_Sbox1[tmp[a+2]]^RM1[a+2];
405       invfX[a+3]=Inv_Sbox1[tmp[a+3]]^RM1[a+3];
406
407     }
408
409     
410     /*  
411     for(int a=0;a<h;a+=4) {
412       invfX[a]=Inv_Sbox1[Inv_Sbox2[fX[a]]^invgY[a]]^RM1[a];
413       invfX[a+1]=Inv_Sbox1[Inv_Sbox2[fX[a+1]]^invgY[a+1]]^RM1[a+1];
414       invfX[a+2]=Inv_Sbox1[Inv_Sbox2[fX[a+2]]^invgY[a+2]]^RM1[a+2];
415       invfX[a+3]=Inv_Sbox1[Inv_Sbox2[fX[a+3]]^invgY[a+3]]^RM1[a+3];
416
417     }
418     */
419
420     for(int a=0;a<h;a+=4) {
421       seq_out[ind2+a]=invfX[a];
422       seq_out[ind2+a+1]=invfX[a+1];
423       seq_out[ind2+a+2]=invfX[a+2];
424       seq_out[ind2+a+3]=invfX[a+3];
425     }
426
427     for(int a=0;a<h;a+=4) {
428       seq_out[ind1+a]=invgY[a];
429       seq_out[ind1+a+1]=invgY[a+1];
430       seq_out[ind1+a+2]=invgY[a+2];
431       seq_out[ind1+a+3]=invgY[a+3];
432     }
433
434
435
436   }
437   
438
439
440
441 }
442
443
444
445
446
447
448 template<int h>
449 void encrypt_ecb_rm(uchar* seq_in, uchar *seq_out, int len,uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *IV, int debug) {
450
451   uchar X[h];
452   uchar Y[h];
453   uchar fX[h];
454   uchar gY[h];
455   uchar IV1[h];
456   uchar IV2[h];
457   uchar *RM1;
458   uchar *RM2;
459   uchar tmp[h];
460
461
462
463   for(int a=0;a<h;a+=4) {
464     IV1[a]=IV[a];
465     IV1[a+1]=IV[a+1];
466     IV1[a+2]=IV[a+2];
467     IV1[a+3]=IV[a+3];
468   }
469
470
471   for(int a=0;a<h;a+=4) {
472     IV2[a]=IV[h+a];
473     IV2[a+1]=IV[h+a+1];
474     IV2[a+2]=IV[h+a+2];
475     IV2[a+3]=IV[h+a+3];
476
477   }
478
479
480
481
482
483   
484   for(int it=0;it<len/2;it++) {
485     int ind1=Pbox[it]*h;
486     int ind2=Pbox[it+len/2]*h;
487
488
489     RM1=&RM[PboxSRM[it]*h];
490     RM2=&RM[h*h+PboxSRM[len/2-it-1]*h];
491     
492
493   
494     for(int a=0;a<h;a+=4) {
495       X[a]=seq_in[ind2+a];
496       X[a+1]=seq_in[ind2+a+1];
497       X[a+2]=seq_in[ind2+a+2];
498       X[a+3]=seq_in[ind2+a+3];
499     }
500
501     for(int a=0;a<h;a+=4) {
502       Y[a]=seq_in[ind1+a];
503       Y[a+1]=seq_in[ind1+a+1];
504       Y[a+2]=seq_in[ind1+a+2];
505       Y[a+3]=seq_in[ind1+a+3];
506     }
507
508
509     for(int a=0;a<h;a+=4) {
510       tmp[a]=Sbox1[X[a]^RM1[a]];
511       tmp[a+1]=Sbox1[X[a+1]^RM1[a+1]];
512       tmp[a+2]=Sbox1[X[a+2]^RM1[a+2]];
513       tmp[a+3]=Sbox1[X[a+3]^RM1[a+3]];
514     }
515     
516     for(int a=0;a<h;a+=4) {
517       fX[a]=Sbox2[tmp[a]^Y[a]];
518       fX[a+1]=Sbox2[tmp[a+1]^Y[a+1]];
519       fX[a+2]=Sbox2[tmp[a+2]^Y[a+2]];
520       fX[a+3]=Sbox2[tmp[a+3]^Y[a+3]];
521     }
522
523       
524     /*for(int a=0;a<h;a+=4) {
525       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]]^Y[a]];
526       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]]^Y[a+1]];
527       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]]^Y[a+2]];
528       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]]^Y[a+3]];
529       }
530     */
531
532
533
534     for(int a=0;a<h;a+=4) {
535       tmp[a]=Sbox2[fX[a]^Y[a]];
536       tmp[a+1]=Sbox2[fX[a+1]^Y[a+1]];
537       tmp[a+2]=Sbox2[fX[a+2]^Y[a+2]];
538       tmp[a+3]=Sbox2[fX[a+3]^Y[a+3]];
539
540     }   
541     for(int a=0;a<h;a+=4) {
542       gY[a]=Sbox1[tmp[a]^RM2[a]];
543       gY[a+1]=Sbox1[tmp[a+1]^RM2[a+1]];
544       gY[a+2]=Sbox1[tmp[a+2]^RM2[a+2]];
545       gY[a+3]=Sbox1[tmp[a+3]^RM2[a+3]];
546
547     }   
548     
549     
550     /* for(int a=0;a<h;a+=4) {
551       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]]^RM2[a]];
552       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]]^RM2[a+1]];
553       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]]^RM2[a+2]];
554       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]]^RM2[a+3]];
555
556       } */  
557     
558
559   
560
561
562
563     for(int a=0;a<h;a+=4) {
564       seq_out[ind2+a]=gY[a];
565       seq_out[ind2+a+1]=gY[a+1];
566       seq_out[ind2+a+2]=gY[a+2];
567       seq_out[ind2+a+3]=gY[a+3];
568     }
569
570     for(int a=0;a<h;a+=4) {
571       seq_out[ind1+a]=fX[a];
572       seq_out[ind1+a+1]=fX[a+1];
573       seq_out[ind1+a+2]=fX[a+2];
574       seq_out[ind1+a+3]=fX[a+3];
575     }
576
577
578
579   }
580   
581
582
583
584 }
585
586
587
588
589
590
591
592
593 template<int h>
594 void decrypt_ecb_rm(uchar* seq_in, uchar *seq_out, int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *Inv_Sbox1, uchar *Inv_Sbox2,  uchar *IV, int debug) {
595
596   uchar invfX[h];
597   uchar invgY[h];
598   uchar fX[h];
599   uchar gY[h];
600   uchar IV1[h];
601   uchar IV2[h];
602   uchar *RM1;
603   uchar *RM2;
604   uchar tmp[h];
605
606   
607
608   for(int a=0;a<h;a+=4) {
609     IV1[a]=IV[a];
610     IV1[a+1]=IV[a+1];
611     IV1[a+2]=IV[a+2];
612     IV1[a+3]=IV[a+3];
613   }
614
615
616   for(int a=0;a<h;a+=4) {
617     IV2[a]=IV[h+a];
618     IV2[a+1]=IV[h+a+1];
619     IV2[a+2]=IV[h+a+2];
620     IV2[a+3]=IV[h+a+3];
621
622   }
623
624
625   
626   for(int it=0;it<len/2;it++) {
627     int ind1=Pbox[it]*h;
628     int ind2=Pbox[it+len/2]*h;
629
630
631     RM1=&RM[PboxSRM[it]*h];
632     RM2=&RM[h*h+PboxSRM[len/2-it-1]*h];
633
634
635     
636     for(int a=0;a<h;a+=4) {
637       gY[a]=seq_in[ind2+a];
638       gY[a+1]=seq_in[ind2+a+1];
639       gY[a+2]=seq_in[ind2+a+2];
640       gY[a+3]=seq_in[ind2+a+3];
641     }
642
643     for(int a=0;a<h;a+=4) {
644       fX[a]=seq_in[ind1+a];
645       fX[a+1]=seq_in[ind1+a+1];
646       fX[a+2]=seq_in[ind1+a+2];
647       fX[a+3]=seq_in[ind1+a+3];
648     }
649
650
651
652
653     for(int a=0;a<h;a+=4) {
654       tmp[a]=Inv_Sbox1[gY[a]]^RM2[a];
655       tmp[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
656       tmp[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
657       tmp[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
658     } 
659
660
661     for(int a=0;a<h;a+=4) {
662       invgY[a]=Inv_Sbox2[tmp[a]]^fX[a];
663       invgY[a+1]=Inv_Sbox2[tmp[a+1]]^fX[a+1];
664       invgY[a+2]=Inv_Sbox2[tmp[a+2]]^fX[a+2];
665       invgY[a+3]=Inv_Sbox2[tmp[a+3]]^fX[a+3];
666     } 
667
668
669
670     /*  for(int a=0;a<h;a+=4) {
671       invgY[a]=Inv_Sbox2[Inv_Sbox1[gY[a]]^RM2[a]]^fX[a];
672       invgY[a+1]=Inv_Sbox2[Inv_Sbox1[gY[a+1]]^RM2[a+1]]^fX[a+1];
673       invgY[a+2]=Inv_Sbox2[Inv_Sbox1[gY[a+2]]^RM2[a+2]]^fX[a+2];
674       invgY[a+3]=Inv_Sbox2[Inv_Sbox1[gY[a+3]]^RM2[a+3]]^fX[a+3];
675       } */    
676
677
678
679
680     for(int a=0;a<h;a+=4) {
681       tmp[a]=Inv_Sbox2[fX[a]]^invgY[a];
682       tmp[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
683       tmp[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
684       tmp[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
685
686     }
687     
688     for(int a=0;a<h;a+=4) {
689       invfX[a]=Inv_Sbox1[tmp[a]]^RM1[a];
690       invfX[a+1]=Inv_Sbox1[tmp[a+1]]^RM1[a+1];
691       invfX[a+2]=Inv_Sbox1[tmp[a+2]]^RM1[a+2];
692       invfX[a+3]=Inv_Sbox1[tmp[a+3]]^RM1[a+3];
693
694     }
695
696     
697     /*  
698     for(int a=0;a<h;a+=4) {
699       invfX[a]=Inv_Sbox1[Inv_Sbox2[fX[a]]^invgY[a]]^RM1[a];
700       invfX[a+1]=Inv_Sbox1[Inv_Sbox2[fX[a+1]]^invgY[a+1]]^RM1[a+1];
701       invfX[a+2]=Inv_Sbox1[Inv_Sbox2[fX[a+2]]^invgY[a+2]]^RM1[a+2];
702       invfX[a+3]=Inv_Sbox1[Inv_Sbox2[fX[a+3]]^invgY[a+3]]^RM1[a+3];
703
704     }
705     */
706
707     for(int a=0;a<h;a+=4) {
708       seq_out[ind2+a]=invfX[a];
709       seq_out[ind2+a+1]=invfX[a+1];
710       seq_out[ind2+a+2]=invfX[a+2];
711       seq_out[ind2+a+3]=invfX[a+3];
712     }
713
714     for(int a=0;a<h;a+=4) {
715       seq_out[ind1+a]=invgY[a];
716       seq_out[ind1+a+1]=invgY[a+1];
717       seq_out[ind1+a+2]=invgY[a+2];
718       seq_out[ind1+a+3]=invgY[a+3];
719     }
720
721
722
723   }
724   
725
726
727
728 }
729
730
731
732
733
734
735
736
737
738 template<int h>
739 void encrypt_cbc_prng(uchar* seq_in, uchar *seq_out, int len,uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *IV,uint myrand, int debug) {
740
741   uchar X[h];
742   uchar Y[h];
743   uchar fX[h];
744   uchar gY[h];
745   uchar IV1[h];
746   uchar IV2[h];
747   uchar RM1[h];
748   uchar RM2[h];
749   uchar tmp[h];
750   mylong *rm1=(mylong*)RM1;
751   mylong *rm2=(mylong*)RM2;
752
753
754   
755   for(int a=0;a<h;a+=4) {
756     IV1[a]=IV[a];
757     IV1[a+1]=IV[a+1];
758     IV1[a+2]=IV[a+2];
759     IV1[a+3]=IV[a+3];
760   }
761
762
763   for(int a=0;a<h;a+=4) {
764     IV2[a]=IV[h+a];
765     IV2[a+1]=IV[h+a+1];
766     IV2[a+2]=IV[h+a+2];
767     IV2[a+3]=IV[h+a+3];
768
769   }
770
771   
772   for(int it=0;it<len/2;it++) {
773     int ind1=Pbox[it]*h;
774     int ind2=Pbox[it+len/2]*h;
775
776     
777     for(int a=0;a<(h>>3);a++) {
778       myrand=xorshift64();
779       rm1[a]=myrand;
780       myrand=xorshift64();
781       rm2[a]=myrand;
782     }  
783
784
785   
786     for(int a=0;a<h;a+=4) {
787       X[a]=seq_in[ind2+a];
788       X[a+1]=seq_in[ind2+a+1];
789       X[a+2]=seq_in[ind2+a+2];
790       X[a+3]=seq_in[ind2+a+3];
791     }
792
793     for(int a=0;a<h;a+=4) {
794       Y[a]=seq_in[ind1+a];
795       Y[a+1]=seq_in[ind1+a+1];
796       Y[a+2]=seq_in[ind1+a+2];
797       Y[a+3]=seq_in[ind1+a+3];
798     }
799
800
801     for(int a=0;a<h;a+=4) {
802       tmp[a]=X[a]^RM1[a]^IV1[a];
803       tmp[a+1]=X[a+1]^RM1[a+1]^IV1[a+1];
804       tmp[a+2]=X[a+2]^RM1[a+2]^IV1[a+2];
805       tmp[a+3]=X[a+3]^RM1[a+3]^IV1[a+3];
806     }
807
808     for(int a=0;a<h;a+=4) {
809       tmp[a]=Sbox1[tmp[a]];
810       tmp[a+1]=Sbox1[tmp[a+1]];
811       tmp[a+2]=Sbox1[tmp[a+2]];
812       tmp[a+3]=Sbox1[tmp[a+3]];
813     }
814
815     
816     /* for(int a=0;a<h;a+=4) {
817       tmp[a]=Sbox1[X[a]^RM1[a]^IV1[a]];
818       tmp[a+1]=Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]];
819       tmp[a+2]=Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]];
820       tmp[a+3]=Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]];
821       }*/
822
823     for(int a=0;a<h;a+=4) {
824       fX[a]=Sbox2[tmp[a]^Y[a]];
825       fX[a+1]=Sbox2[tmp[a+1]^Y[a+1]];
826       fX[a+2]=Sbox2[tmp[a+2]^Y[a+2]];
827       fX[a+3]=Sbox2[tmp[a+3]^Y[a+3]];
828       }
829
830     
831     /*for(int a=0;a<h;a+=4) {
832       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
833       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
834       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
835       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
836       }
837     */
838
839  for(int a=0;a<h;a+=4) {
840       tmp[a]=fX[a]^Y[a]^IV2[a];
841       tmp[a+1]=fX[a+1]^Y[a+1]^IV2[a+1];
842       tmp[a+2]=fX[a+2]^Y[a+2]^IV2[a+2];
843       tmp[a+3]=fX[a+3]^Y[a+3]^IV2[a+3];
844
845     }     
846
847  for(int a=0;a<h;a+=4) {
848       tmp[a]=Sbox2[tmp[a]];
849       tmp[a+1]=Sbox2[tmp[a+1]];
850       tmp[a+2]=Sbox2[tmp[a+2]];
851       tmp[a+3]=Sbox2[tmp[a+3]];
852
853     }     
854
855     /*
856     for(int a=0;a<h;a+=4) {
857       tmp[a]=Sbox2[fX[a]^Y[a]^IV2[a]];
858       tmp[a+1]=Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]];
859       tmp[a+2]=Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]];
860       tmp[a+3]=Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]];
861
862     }     
863     */ 
864
865     for(int a=0;a<h;a+=4) {
866       gY[a]=Sbox1[tmp[a]^RM2[a]];
867       gY[a+1]=Sbox1[tmp[a+1]^RM2[a+1]];
868       gY[a+2]=Sbox1[tmp[a+2]^RM2[a+2]];
869       gY[a+3]=Sbox1[tmp[a+3]^RM2[a+3]];
870
871     }     
872
873
874
875 /*    
876     for(int a=0;a<h;a+=4) {
877       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
878       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
879       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
880       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
881
882     } 
883 */  
884
885     for(int a=0;a<h;a+=4) {
886       seq_out[ind2+a]=gY[a];
887       seq_out[ind2+a+1]=gY[a+1];
888       seq_out[ind2+a+2]=gY[a+2];
889       seq_out[ind2+a+3]=gY[a+3];
890     }
891
892     for(int a=0;a<h;a+=4) {
893       seq_out[ind1+a]=fX[a];
894       seq_out[ind1+a+1]=fX[a+1];
895       seq_out[ind1+a+2]=fX[a+2];
896       seq_out[ind1+a+3]=fX[a+3];
897     }
898     for(int a=0;a<h;a+=4) {
899       IV1[a]=fX[a];
900       IV1[a+1]=fX[a+1];
901       IV1[a+2]=fX[a+2];
902       IV1[a+3]=fX[a+3];
903     }
904
905     for(int a=0;a<h;a+=4) {
906       IV2[a]=gY[a];
907       IV2[a+1]=gY[a+1];
908       IV2[a+2]=gY[a+2];
909       IV2[a+3]=gY[a+3];
910     }
911
912   }
913   
914
915
916
917 }
918
919
920
921
922
923
924
925
926 template<int h>
927 void decrypt_cbc_prng(uchar* seq_in, uchar *seq_out, int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *Inv_Sbox1, uchar *Inv_Sbox2, uchar* IV, uint myrand, int debug) {
928
929   uchar invfX[h];
930   uchar invgY[h];
931   uchar fX[h];
932   uchar gY[h];
933   uchar RM1[h];
934   uchar RM2[h];
935   uchar IV1[h];
936   uchar IV2[h];
937   uchar tmp[h];
938   mylong *rm1=(mylong*)RM1;
939   mylong *rm2=(mylong*)RM2;
940
941
942   
943   for(int a=0;a<h;a+=4) {
944     IV1[a]=IV[a];
945     IV1[a+1]=IV[a+1];
946     IV1[a+2]=IV[a+2];
947     IV1[a+3]=IV[a+3];
948   }
949
950
951   for(int a=0;a<h;a+=4) {
952     IV2[a]=IV[h+a];
953     IV2[a+1]=IV[h+a+1];
954     IV2[a+2]=IV[h+a+2];
955     IV2[a+3]=IV[h+a+3];
956
957   }
958
959   
960   for(int it=0;it<len/2;it++) {
961     int ind1=Pbox[it]*h;
962     int ind2=Pbox[it+len/2]*h;
963
964     
965     for(int a=0;a<(h>>3);a++) {
966       myrand=xorshift64();
967       rm1[a]=myrand;
968       myrand=xorshift64();
969       rm2[a]=myrand;
970     }  
971     
972     for(int a=0;a<h;a+=4) {
973       gY[a]=seq_in[ind2+a];
974       gY[a+1]=seq_in[ind2+a+1];
975       gY[a+2]=seq_in[ind2+a+2];
976       gY[a+3]=seq_in[ind2+a+3];
977     }
978
979     for(int a=0;a<h;a+=4) {
980       fX[a]=seq_in[ind1+a];
981       fX[a+1]=seq_in[ind1+a+1];
982       fX[a+2]=seq_in[ind1+a+2];
983       fX[a+3]=seq_in[ind1+a+3];
984     }
985
986
987     for(int a=0;a<h;a+=4) {
988       tmp[a]=Inv_Sbox1[gY[a]]^RM2[a];
989       tmp[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
990       tmp[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
991       tmp[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
992     }   
993
994
995     for(int a=0;a<h;a+=4) {
996       tmp[a]=Inv_Sbox2[tmp[a]];
997       tmp[a+1]=Inv_Sbox2[tmp[a+1]];
998       tmp[a+2]=Inv_Sbox2[tmp[a+2]];
999       tmp[a+3]=Inv_Sbox2[tmp[a+3]];
1000     }   
1001
1002
1003     
1004     for(int a=0;a<h;a+=4) {
1005       invgY[a]=tmp[a]^fX[a]^IV2[a];
1006       invgY[a+1]=tmp[a+1]^fX[a+1]^IV2[a+1];
1007       invgY[a+2]=tmp[a+2]^fX[a+2]^IV2[a+2];
1008       invgY[a+3]=tmp[a+3]^fX[a+3]^IV2[a+3];
1009     }   
1010
1011
1012 /*
1013  for(int a=0;a<h;a+=4) {
1014       invgY[a]=Inv_Sbox2[Inv_Sbox1[gY[a]]^RM2[a]]^fX[a]^IV2[a];
1015       invgY[a+1]=Inv_Sbox2[Inv_Sbox1[gY[a+1]]^RM2[a+1]]^fX[a+1]^IV2[a+1];
1016       invgY[a+2]=Inv_Sbox2[Inv_Sbox1[gY[a+2]]^RM2[a+2]]^fX[a+2]^IV2[a+2];
1017       invgY[a+3]=Inv_Sbox2[Inv_Sbox1[gY[a+3]]^RM2[a+3]]^fX[a+3]^IV2[a+3];
1018     }   
1019 */
1020
1021     
1022     for(int a=0;a<h;a+=4) {
1023       tmp[a]=Inv_Sbox2[fX[a]]^invgY[a];
1024       tmp[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1025       tmp[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1026       tmp[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1027
1028     }
1029
1030
1031     for(int a=0;a<h;a+=4) {
1032       tmp[a]=Inv_Sbox1[tmp[a]];
1033       tmp[a+1]=Inv_Sbox1[tmp[a+1]];
1034       tmp[a+2]=Inv_Sbox1[tmp[a+2]];
1035       tmp[a+3]=Inv_Sbox1[tmp[a+3]];
1036
1037     }
1038
1039
1040
1041
1042     for(int a=0;a<h;a+=4) {
1043       invfX[a]=tmp[a]^RM1[a]^IV1[a];
1044       invfX[a+1]=tmp[a+1]^RM1[a+1]^IV1[a+1];
1045       invfX[a+2]=tmp[a+2]^RM1[a+2]^IV1[a+2];
1046       invfX[a+3]=tmp[a+3]^RM1[a+3]^IV1[a+3];
1047
1048     }
1049
1050 /*
1051  for(int a=0;a<h;a+=4) {
1052       invfX[a]=Inv_Sbox1[Inv_Sbox2[fX[a]]^invgY[a]]^RM1[a]^IV1[a];
1053       invfX[a+1]=Inv_Sbox1[Inv_Sbox2[fX[a+1]]^invgY[a+1]]^RM1[a+1]^IV1[a+1];
1054       invfX[a+2]=Inv_Sbox1[Inv_Sbox2[fX[a+2]]^invgY[a+2]]^RM1[a+2]^IV1[a+2];
1055       invfX[a+3]=Inv_Sbox1[Inv_Sbox2[fX[a+3]]^invgY[a+3]]^RM1[a+3]^IV1[a+3];
1056
1057     }
1058
1059 */
1060
1061     
1062
1063     for(int a=0;a<h;a+=4) {
1064       seq_out[ind2+a]=invfX[a];
1065       seq_out[ind2+a+1]=invfX[a+1];
1066       seq_out[ind2+a+2]=invfX[a+2];
1067       seq_out[ind2+a+3]=invfX[a+3];
1068     }
1069
1070     for(int a=0;a<h;a+=4) {
1071       seq_out[ind1+a]=invgY[a];
1072       seq_out[ind1+a+1]=invgY[a+1];
1073       seq_out[ind1+a+2]=invgY[a+2];
1074       seq_out[ind1+a+3]=invgY[a+3];
1075     }
1076     for(int a=0;a<h;a+=4) {
1077       IV1[a]=fX[a];
1078       IV1[a+1]=fX[a+1];
1079       IV1[a+2]=fX[a+2];
1080       IV1[a+3]=fX[a+3];
1081     }
1082
1083     for(int a=0;a<h;a+=4) {
1084       IV2[a]=gY[a];
1085       IV2[a+1]=gY[a+1];
1086       IV2[a+2]=gY[a+2];
1087       IV2[a+3]=gY[a+3];
1088     }
1089
1090
1091   }
1092   
1093
1094
1095
1096 }
1097
1098
1099
1100
1101
1102
1103
1104
1105 template<int h>
1106 void encrypt_cbc_rm(uchar* seq_in, uchar *seq_out, int len,uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *IV, int debug) {
1107
1108   uchar X[h];
1109   uchar Y[h];
1110   uchar fX[h];
1111   uchar gY[h];
1112   uchar IV1[h];
1113   uchar IV2[h];
1114   uchar *RM1;
1115   uchar *RM2;
1116   uchar tmp[h];
1117
1118
1119
1120   for(int a=0;a<h;a+=4) {
1121     IV1[a]=IV[a];
1122     IV1[a+1]=IV[a+1];
1123     IV1[a+2]=IV[a+2];
1124     IV1[a+3]=IV[a+3];
1125   }
1126
1127
1128   for(int a=0;a<h;a+=4) {
1129     IV2[a]=IV[h+a];
1130     IV2[a+1]=IV[h+a+1];
1131     IV2[a+2]=IV[h+a+2];
1132     IV2[a+3]=IV[h+a+3];
1133
1134   }
1135
1136
1137   
1138   for(int it=0;it<len/2;it++) {
1139     int ind1=Pbox[it]*h;
1140     int ind2=Pbox[it+len/2]*h;
1141
1142     RM1=&RM[PboxSRM[it]*h];
1143     RM2=&RM[h*h+PboxSRM[len/2-it-1]*h];
1144
1145
1146
1147     
1148
1149     for(int a=0;a<h;a+=4) {
1150       X[a]=seq_in[ind2+a];
1151       X[a+1]=seq_in[ind2+a+1];
1152       X[a+2]=seq_in[ind2+a+2];
1153       X[a+3]=seq_in[ind2+a+3];
1154     }
1155
1156     for(int a=0;a<h;a+=4) {
1157       Y[a]=seq_in[ind1+a];
1158       Y[a+1]=seq_in[ind1+a+1];
1159       Y[a+2]=seq_in[ind1+a+2];
1160       Y[a+3]=seq_in[ind1+a+3];
1161     }
1162
1163
1164     for(int a=0;a<h;a+=4) {
1165       tmp[a]=X[a]^RM1[a]^IV1[a];
1166       tmp[a+1]=X[a+1]^RM1[a+1]^IV1[a+1];
1167       tmp[a+2]=X[a+2]^RM1[a+2]^IV1[a+2];
1168       tmp[a+3]=X[a+3]^RM1[a+3]^IV1[a+3];
1169     }
1170
1171     for(int a=0;a<h;a+=4) {
1172       tmp[a]=Sbox1[tmp[a]];
1173       tmp[a+1]=Sbox1[tmp[a+1]];
1174       tmp[a+2]=Sbox1[tmp[a+2]];
1175       tmp[a+3]=Sbox1[tmp[a+3]];
1176     }
1177
1178     
1179     /*for(int a=0;a<h;a+=4) {
1180       tmp[a]=Sbox1[X[a]^RM1[a]^IV1[a]];
1181       tmp[a+1]=Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]];
1182       tmp[a+2]=Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]];
1183       tmp[a+3]=Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]];
1184       }*/
1185
1186     for(int a=0;a<h;a+=4) {
1187       fX[a]=Sbox2[tmp[a]^Y[a]];
1188       fX[a+1]=Sbox2[tmp[a+1]^Y[a+1]];
1189       fX[a+2]=Sbox2[tmp[a+2]^Y[a+2]];
1190       fX[a+3]=Sbox2[tmp[a+3]^Y[a+3]];
1191     }
1192
1193     /*
1194     for(int a=0;a<h;a+=4) {
1195       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
1196       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
1197       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
1198       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
1199       }*/
1200
1201
1202  for(int a=0;a<h;a+=4) {
1203       tmp[a]=fX[a]^Y[a]^IV2[a];
1204       tmp[a+1]=fX[a+1]^Y[a+1]^IV2[a+1];
1205       tmp[a+2]=fX[a+2]^Y[a+2]^IV2[a+2];
1206       tmp[a+3]=fX[a+3]^Y[a+3]^IV2[a+3];
1207
1208     }     
1209
1210  for(int a=0;a<h;a+=4) {
1211       tmp[a]=Sbox2[tmp[a]];
1212       tmp[a+1]=Sbox2[tmp[a+1]];
1213       tmp[a+2]=Sbox2[tmp[a+2]];
1214       tmp[a+3]=Sbox2[tmp[a+3]];
1215
1216     }     
1217
1218  /*
1219     for(int a=0;a<h;a+=4) {
1220       tmp[a]=Sbox2[fX[a]^Y[a]^IV2[a]];
1221       tmp[a+1]=Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]];
1222       tmp[a+2]=Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]];
1223       tmp[a+3]=Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]];
1224
1225     }     
1226  */
1227
1228     for(int a=0;a<h;a+=4) {
1229       gY[a]=Sbox1[tmp[a]^RM2[a]];
1230       gY[a+1]=Sbox1[tmp[a+1]^RM2[a+1]];
1231       gY[a+2]=Sbox1[tmp[a+2]^RM2[a+2]];
1232       gY[a+3]=Sbox1[tmp[a+3]^RM2[a+3]];
1233
1234     }     
1235
1236
1237
1238     /*
1239     for(int a=0;a<h;a+=4) {
1240       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
1241       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
1242       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
1243       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
1244
1245     } 
1246     */    
1247
1248
1249     
1250     for(int a=0;a<h;a+=4) {
1251       seq_out[ind2+a]=gY[a];
1252       seq_out[ind2+a+1]=gY[a+1];
1253       seq_out[ind2+a+2]=gY[a+2];
1254       seq_out[ind2+a+3]=gY[a+3];
1255     }
1256
1257     for(int a=0;a<h;a+=4) {
1258       seq_out[ind1+a]=fX[a];
1259       seq_out[ind1+a+1]=fX[a+1];
1260       seq_out[ind1+a+2]=fX[a+2];
1261       seq_out[ind1+a+3]=fX[a+3];
1262     }
1263     
1264     for(int a=0;a<h;a+=4) {
1265       IV1[a]=fX[a];
1266       IV1[a+1]=fX[a+1];
1267       IV1[a+2]=fX[a+2];
1268       IV1[a+3]=fX[a+3];
1269     }
1270
1271     for(int a=0;a<h;a+=4) {
1272       IV2[a]=gY[a];
1273       IV2[a+1]=gY[a+1];
1274       IV2[a+2]=gY[a+2];
1275       IV2[a+3]=gY[a+3];
1276     }
1277
1278   }
1279   
1280
1281
1282
1283 }
1284
1285
1286
1287
1288
1289
1290
1291
1292 template<int h>
1293 void decrypt_cbc_rm(uchar* seq_in, uchar *seq_out, int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *Inv_Sbox1, uchar *Inv_Sbox2,   uchar *IV, int debug) {
1294
1295   uchar invfX[h];
1296   uchar invgY[h];
1297   uchar fX[h];
1298   uchar gY[h];
1299   uchar IV1[h];
1300   uchar IV2[h];
1301   uchar *RM1;
1302   uchar *RM2;
1303   uchar tmp[h];
1304
1305
1306   for(int a=0;a<h;a+=4) {
1307     IV1[a]=IV[a];
1308     IV1[a+1]=IV[a+1];
1309     IV1[a+2]=IV[a+2];
1310     IV1[a+3]=IV[a+3];
1311   }
1312
1313
1314   for(int a=0;a<h;a+=4) {
1315     IV2[a]=IV[h+a];
1316     IV2[a+1]=IV[h+a+1];
1317     IV2[a+2]=IV[h+a+2];
1318     IV2[a+3]=IV[h+a+3];
1319
1320   }
1321   
1322   for(int it=0;it<len/2;it++) {
1323     int ind1=Pbox[it]*h;
1324     int ind2=Pbox[it+len/2]*h;
1325
1326
1327     RM1=&RM[PboxSRM[it]*h];
1328     RM2=&RM[h*h+PboxSRM[len/2-it-1]*h];
1329
1330
1331
1332     
1333     for(int a=0;a<h;a+=4) {
1334       gY[a]=seq_in[ind2+a];
1335       gY[a+1]=seq_in[ind2+a+1];
1336       gY[a+2]=seq_in[ind2+a+2];
1337       gY[a+3]=seq_in[ind2+a+3];
1338     }
1339
1340     for(int a=0;a<h;a+=4) {
1341       fX[a]=seq_in[ind1+a];
1342       fX[a+1]=seq_in[ind1+a+1];
1343       fX[a+2]=seq_in[ind1+a+2];
1344       fX[a+3]=seq_in[ind1+a+3];
1345     }
1346
1347
1348     for(int a=0;a<h;a+=4) {
1349       tmp[a]=Inv_Sbox1[gY[a]]^RM2[a];
1350       tmp[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
1351       tmp[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
1352       tmp[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
1353     }   
1354
1355
1356     for(int a=0;a<h;a+=4) {
1357       tmp[a]=Inv_Sbox2[tmp[a]];
1358       tmp[a+1]=Inv_Sbox2[tmp[a+1]];
1359       tmp[a+2]=Inv_Sbox2[tmp[a+2]];
1360       tmp[a+3]=Inv_Sbox2[tmp[a+3]];
1361     }   
1362
1363
1364     
1365     for(int a=0;a<h;a+=4) {
1366       invgY[a]=tmp[a]^fX[a]^IV2[a];
1367       invgY[a+1]=tmp[a+1]^fX[a+1]^IV2[a+1];
1368       invgY[a+2]=tmp[a+2]^fX[a+2]^IV2[a+2];
1369       invgY[a+3]=tmp[a+3]^fX[a+3]^IV2[a+3];
1370     }   
1371
1372
1373     for(int a=0;a<h;a+=4) {
1374       tmp[a]=Inv_Sbox2[fX[a]]^invgY[a];
1375       tmp[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1376       tmp[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1377       tmp[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1378
1379     }
1380
1381
1382     for(int a=0;a<h;a+=4) {
1383       tmp[a]=Inv_Sbox1[tmp[a]];
1384       tmp[a+1]=Inv_Sbox1[tmp[a+1]];
1385       tmp[a+2]=Inv_Sbox1[tmp[a+2]];
1386       tmp[a+3]=Inv_Sbox1[tmp[a+3]];
1387
1388     }
1389
1390
1391
1392
1393     for(int a=0;a<h;a+=4) {
1394       invfX[a]=tmp[a]^RM1[a]^IV1[a];
1395       invfX[a+1]=tmp[a+1]^RM1[a+1]^IV1[a+1];
1396       invfX[a+2]=tmp[a+2]^RM1[a+2]^IV1[a+2];
1397       invfX[a+3]=tmp[a+3]^RM1[a+3]^IV1[a+3];
1398
1399     }
1400
1401
1402     for(int a=0;a<h;a+=4) {
1403       seq_out[ind2+a]=invfX[a];
1404       seq_out[ind2+a+1]=invfX[a+1];
1405       seq_out[ind2+a+2]=invfX[a+2];
1406       seq_out[ind2+a+3]=invfX[a+3];
1407     }
1408
1409     for(int a=0;a<h;a+=4) {
1410       seq_out[ind1+a]=invgY[a];
1411       seq_out[ind1+a+1]=invgY[a+1];
1412       seq_out[ind1+a+2]=invgY[a+2];
1413       seq_out[ind1+a+3]=invgY[a+3];
1414     }
1415     for(int a=0;a<h;a+=4) {
1416       IV1[a]=fX[a];
1417       IV1[a+1]=fX[a+1];
1418       IV1[a+2]=fX[a+2];
1419       IV1[a+3]=fX[a+3];
1420     }
1421
1422     for(int a=0;a<h;a+=4) {
1423       IV2[a]=gY[a];
1424       IV2[a+1]=gY[a+1];
1425       IV2[a+2]=gY[a+2];
1426       IV2[a+3]=gY[a+3];
1427     }
1428
1429
1430   }
1431   
1432
1433
1434
1435 }
1436
1437
1438
1439
1440
1441
1442 int main(int argc, char** argv) {
1443
1444
1445   int h=32;
1446   int lena=0;
1447   int size_buf=1;
1448
1449
1450   
1451   for(int i=1; i<argc; i++){
1452     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
1453     if(strncmp(argv[i],"cbcrm",5)==0) cbcrm=1;       
1454     if(strncmp(argv[i],"cbcprng",7)==0) {cbcprng=1;cbcrm=0;}
1455     if(strncmp(argv[i],"ecbrm",5)==0) ecbrm = 1;
1456     if(strncmp(argv[i],"ecbprng",7)==0) {ecbprng=1; ecbrm=0;}
1457     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
1458     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
1459     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
1460   }
1461
1462 /*  printf("nb times %d\n",nb_test);
1463   printf("cbcrm %d\n",cbcrm);
1464   printf("cbcprng %d\n",cbcprng);
1465   printf("ecbrm %d\n",ecbrm);
1466   printf("ecbprng %d\n",ecbprng);
1467   printf("h %d\n",h);
1468   printf("lena %d\n",lena);
1469   printf("size_buf %d\n",size_buf);
1470 */
1471   
1472
1473       
1474   int seed=time(NULL);
1475 //  cout<<seed<<endl;
1476   srand48(seed);
1477
1478   uchar Secretkey[key_size];
1479
1480   uchar counter[key_size];
1481
1482   for(int i=0;i<key_size;i++) {
1483     Secretkey[i]=lrand48()&0xFF;
1484     counter[i]=lrand48()&0xFF;
1485   }
1486
1487   
1488   int size = 128;
1489   uchar DK[size];
1490
1491
1492
1493
1494   int width;
1495   int height;
1496
1497   uchar *data_R, *data_G, *data_B;
1498   int imsize;
1499   uchar *buffer;
1500
1501
1502
1503
1504   
1505   if(lena==1) {
1506     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
1507 //    load_RGB_pixmap("8192.ppm", &width, &height, &data_R, &data_G, &data_B);
1508     imsize=width*height*3;
1509 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
1510   }
1511   else {
1512     width=height=size_buf;
1513     imsize=width*height*3;
1514     //cout<<"imsize "<<imsize<<endl;
1515     buffer=new uchar[imsize];
1516     for(int i=0;i<imsize;i++) {
1517       buffer[i]=lrand48();
1518     }
1519   }
1520
1521
1522
1523   cout<<"imsize "<<imsize<<endl;
1524   
1525   uchar* seq= new uchar[imsize];
1526   uchar* seq2= new uchar[imsize];
1527
1528   int oneD=width*height;
1529   if(lena) {
1530     for(int i=0;i<oneD;i++) {
1531       seq[i]=data_R[i];
1532       seq[oneD+i]=data_G[i];
1533       seq[2*oneD+i]=data_B[i];
1534     }
1535   }
1536   else {
1537     for(int i=0;i<oneD*3;i++) {
1538       seq[i]=buffer[i];
1539     }
1540   }
1541
1542
1543
1544
1545
1546   int total_len=imsize;
1547   int rp=1;
1548   int len= total_len/h;
1549
1550
1551   
1552   uchar *mix=new uchar[256];
1553
1554
1555
1556     
1557   for (int i = 0; i < 256 ; i++) {
1558     mix[i]=Secretkey[i]^counter[i];
1559     
1560   }
1561   gchar  *sha512;
1562
1563   sha512 = g_compute_checksum_for_string(G_CHECKSUM_SHA512, (const char*) mix, 256);
1564 //  g_print("%s\n", sha512);
1565  
1566
1567
1568
1569
1570
1571
1572
1573   
1574 //  cout<<"hash "<<endl;
1575   for (int i = 0; i < 128 ; i++) {
1576 //    DK[i]=digest[i];
1577     DK[i]=sha512[i];
1578   }
1579   g_free(sha512);
1580
1581
1582   int *Pbox=new int[len];
1583   int *PboxSRM=new int[len/2];
1584   int *PboxSRM2=new int[len/2];
1585   uchar Sbox1[256];
1586   uchar Sbox2[256];  
1587   uchar Inv_Sbox1[256];
1588   uchar Inv_Sbox2[256];
1589   uchar sc[256];  
1590   uchar RM[h*h*2+256];
1591   uchar IV[2*h];
1592
1593   mylong myrand=0;
1594  
1595
1596   double time_encrypt=0;
1597   double time_decrypt=0;
1598   
1599
1600   double t=TimeStart();  
1601
1602   for(int i=0;i<nb_test;i++) {
1603
1604     rc4key(DK, Sbox1, 8);
1605   
1606   
1607     rc4key(&DK[8], Sbox2, 8);
1608     
1609     rc4key(&DK[16], sc, 16);
1610     prga(sc, h*h*2+256, RM);
1611     
1612
1613
1614
1615   
1616     rc4keyperm(&DK[72], len, rp, Pbox, 16);
1617     
1618     
1619     rc4keyperm(&DK[88], len/2, rp, PboxSRM2, 16);
1620     
1621     for(int i=0;i<len/2;i++) {
1622       PboxSRM[i]=PboxSRM2[i]&(h-1);
1623     }
1624     
1625 /*
1626   for(int i=0;i<h*2;i++) {
1627     for(int j=0;j<h;j++)
1628       cout<<(int)RM[i*h+j]<<" ";
1629     cout<<endl;
1630   }
1631 */
1632   }
1633
1634   double time_init=0;
1635   time_init+=TimeStop(t);
1636   cout<<"Time initializaton nb times "<<nb_test<<"   = "<<time_init<<endl;
1637
1638
1639
1640   myrand=0;
1641   for(int i=0;i<64;i++) {
1642     myrand|=DK[i]&1;
1643     myrand<<=1;
1644   }
1645
1646  
1647
1648
1649
1650   
1651   
1652   inverse_tables(Sbox1,256,Inv_Sbox1);
1653   inverse_tables(Sbox2,256,Inv_Sbox2);
1654
1655
1656   xorseed=myrand;
1657 //  lehmer64_seed(myrand);
1658   time_encrypt=0;
1659   t=TimeStart();
1660
1661   int i;
1662   switch(h) {
1663   case 4: 
1664     for(i=0;i<nb_test;i++)
1665     {
1666       if(cbcprng)
1667         encrypt_cbc_prng<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1668       if(cbcrm)
1669         encrypt_cbc_rm<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1670       if(ecbrm)
1671         encrypt_ecb_rm<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1672       if(ecbprng)
1673         encrypt_ecb_prng<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1674     }
1675     break;
1676   case 8: 
1677     for(i=0;i<nb_test;i++)
1678     {
1679       if(cbcprng)
1680         encrypt_cbc_prng<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1681       if(cbcrm)
1682         encrypt_cbc_rm<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1683       if(ecbrm)
1684         encrypt_ecb_rm<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1685       if(ecbprng)
1686         encrypt_ecb_prng<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1687     }
1688     break;
1689   case 16: 
1690     for(i=0;i<nb_test;i++)
1691     {
1692       if(cbcprng)
1693         encrypt_cbc_prng<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1694       if(cbcrm)
1695         encrypt_cbc_rm<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1696       if(ecbrm)
1697         encrypt_ecb_rm<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1698       if(ecbprng)
1699         encrypt_ecb_prng<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1700     }
1701     break;
1702   case 32: 
1703     for(i=0;i<nb_test;i++)
1704     {
1705       if(cbcprng)
1706         encrypt_cbc_prng<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1707       if(cbcrm)
1708         encrypt_cbc_rm<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1709       if(ecbrm)
1710         encrypt_ecb_rm<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1711       if(ecbprng)
1712         encrypt_ecb_prng<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1713     }
1714     break;
1715   case 64: 
1716     for(i=0;i<nb_test;i++)
1717     {
1718       if(cbcprng)
1719         encrypt_cbc_prng<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1720       if(cbcrm)
1721         encrypt_cbc_rm<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1722       if(ecbrm)
1723         encrypt_ecb_rm<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1724       if(ecbprng)
1725         encrypt_ecb_prng<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1726       
1727     }
1728     break;
1729   case 128: 
1730     for(i=0;i<nb_test;i++)
1731     {
1732       if(cbcprng)
1733         encrypt_cbc_prng<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1734       if(cbcrm)
1735         encrypt_cbc_rm<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1736       if(ecbrm)
1737         encrypt_ecb_rm<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1738       if(ecbprng)
1739         encrypt_ecb_prng<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1740       
1741     }
1742     break;
1743   case 256:
1744
1745     for(i=0;i<nb_test;i++)
1746     {
1747       if(cbcprng)
1748         encrypt_cbc_prng<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1749       if(cbcrm)
1750         encrypt_cbc_rm<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1751       if(ecbrm)
1752         encrypt_ecb_rm<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1753       if(ecbprng)
1754         encrypt_ecb_prng<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1755       
1756     }
1757     break;
1758   }
1759
1760
1761   time_encrypt+=TimeStop(t);
1762   cout<<"Time encrypt "<<time_encrypt<<endl;
1763   cout<<(double)imsize*nb_test/time_encrypt<<"\t";
1764
1765
1766   if(lena) {
1767     for(int i=0;i<oneD;i++) {
1768       data_R[i]=seq2[i];
1769       data_G[i]=seq2[oneD+i];
1770       data_B[i]=seq2[2*oneD+i];
1771     }
1772     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
1773   }
1774
1775
1776   xorseed=myrand;
1777   // lehmer64_seed(myrand);
1778   time_decrypt=0;
1779   t=TimeStart();
1780   switch(h) {
1781   case 4:
1782     for(i=0;i<nb_test;i++) {
1783       if(cbcprng)
1784         decrypt_cbc_prng<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1785       if(cbcrm)
1786         decrypt_cbc_rm<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1787       if(ecbrm)
1788         decrypt_ecb_rm<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1789       if(ecbprng)
1790         decrypt_ecb_prng<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1791     }
1792     break;
1793   case 8:
1794     for(i=0;i<nb_test;i++) {
1795       if(cbcprng)
1796         decrypt_cbc_prng<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1797       if(cbcrm)
1798         decrypt_cbc_rm<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1799       if(ecbrm)
1800         decrypt_ecb_rm<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1801       if(ecbprng)
1802         decrypt_ecb_prng<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1803     }
1804     break;
1805   case 16:
1806     for(i=0;i<nb_test;i++) {
1807       if(cbcprng)
1808         decrypt_cbc_prng<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1809       if(cbcrm)
1810         decrypt_cbc_rm<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1811       if(ecbrm)
1812         decrypt_ecb_rm<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1813       if(ecbprng)
1814         decrypt_ecb_prng<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1815     }
1816     break;
1817   case 32:
1818     for(i=0;i<nb_test;i++) {
1819       if(cbcprng)
1820         decrypt_cbc_prng<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1821       if(cbcrm)
1822         decrypt_cbc_rm<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1823       if(ecbrm)
1824         decrypt_ecb_rm<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1825       if(ecbprng)
1826         decrypt_ecb_prng<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1827     }
1828     break;
1829   case 64:
1830     for(i=0;i<nb_test;i++) {
1831       if(cbcprng)
1832         decrypt_cbc_prng<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1833       if(cbcrm)
1834         decrypt_cbc_rm<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1835       if(ecbrm)
1836         decrypt_ecb_rm<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1837       if(ecbprng)
1838         decrypt_ecb_prng<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1839     }
1840     break;
1841   case 128:
1842     for(i=0;i<nb_test;i++) {
1843       if(cbcprng)
1844         decrypt_cbc_prng<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1845       if(cbcrm)
1846         decrypt_cbc_rm<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1847       if(ecbrm)
1848         decrypt_ecb_rm<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1849       if(ecbprng)
1850         decrypt_ecb_prng<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1851     }
1852     break;
1853   case 256:
1854     for(i=0;i<nb_test;i++) {
1855       if(cbcprng)
1856         decrypt_cbc_prng<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1857       if(cbcrm)
1858         decrypt_cbc_rm<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1859       if(ecbrm)
1860         decrypt_ecb_rm<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
1861       if(ecbprng)
1862         decrypt_ecb_prng<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
1863     }
1864     break;
1865   }
1866
1867
1868   
1869   time_decrypt+=TimeStop(t);
1870 //  cout<<"Time decrypt "<<time_decrypt<<endl;
1871   cout<<(double)imsize*nb_test/time_decrypt<<"\t";
1872
1873   if(lena) {
1874     for(int i=0;i<oneD;i++) {
1875       data_R[i]=seq[i];
1876       data_G[i]=seq[oneD+i];
1877       data_B[i]=seq[2*oneD+i];
1878     }
1879     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
1880   }
1881   else {
1882     bool equal=true;
1883     for(int i=0;i<imsize;i++) {
1884       //cout<<(int)buffer[i]<<endl;
1885       if(buffer[i]!=seq[i]) {
1886         equal=false;
1887       }
1888     }
1889     //cout<<"RESULT CORRECT: "<<equal<<endl;
1890   }
1891   
1892
1893   return 0;
1894 }