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

Private GIT Repository
new
[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=&RM[0];
201   uchar *RM2=&RM[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]*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]*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   for(int it=0;it<len/2;it++) {
1137     int ind1=Pbox[it]*h;
1138     int ind2=Pbox[it+len/2]*h;
1139
1140     RM1=&RM[PboxSRM[it]*h];
1141     RM2=&RM[h*h+PboxSRM[len/2-it]*h];
1142
1143     
1144     for(int a=0;a<h;a+=4) {
1145       X[a]=seq_in[ind2+a];
1146       X[a+1]=seq_in[ind2+a+1];
1147       X[a+2]=seq_in[ind2+a+2];
1148       X[a+3]=seq_in[ind2+a+3];
1149     }
1150
1151     for(int a=0;a<h;a+=4) {
1152       Y[a]=seq_in[ind1+a];
1153       Y[a+1]=seq_in[ind1+a+1];
1154       Y[a+2]=seq_in[ind1+a+2];
1155       Y[a+3]=seq_in[ind1+a+3];
1156     }
1157
1158
1159     for(int a=0;a<h;a+=4) {
1160       tmp[a]=X[a]^RM1[a]^IV1[a];
1161       tmp[a+1]=X[a+1]^RM1[a+1]^IV1[a+1];
1162       tmp[a+2]=X[a+2]^RM1[a+2]^IV1[a+2];
1163       tmp[a+3]=X[a+3]^RM1[a+3]^IV1[a+3];
1164     }
1165
1166     for(int a=0;a<h;a+=4) {
1167       tmp[a]=Sbox1[tmp[a]];
1168       tmp[a+1]=Sbox1[tmp[a+1]];
1169       tmp[a+2]=Sbox1[tmp[a+2]];
1170       tmp[a+3]=Sbox1[tmp[a+3]];
1171     }
1172
1173     
1174     /*for(int a=0;a<h;a+=4) {
1175       tmp[a]=Sbox1[X[a]^RM1[a]^IV1[a]];
1176       tmp[a+1]=Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]];
1177       tmp[a+2]=Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]];
1178       tmp[a+3]=Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]];
1179       }*/
1180
1181     for(int a=0;a<h;a+=4) {
1182       fX[a]=Sbox2[tmp[a]^Y[a]];
1183       fX[a+1]=Sbox2[tmp[a+1]^Y[a+1]];
1184       fX[a+2]=Sbox2[tmp[a+2]^Y[a+2]];
1185       fX[a+3]=Sbox2[tmp[a+3]^Y[a+3]];
1186     }
1187
1188     /*
1189     for(int a=0;a<h;a+=4) {
1190       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
1191       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
1192       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
1193       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
1194       }*/
1195
1196
1197  for(int a=0;a<h;a+=4) {
1198       tmp[a]=fX[a]^Y[a]^IV2[a];
1199       tmp[a+1]=fX[a+1]^Y[a+1]^IV2[a+1];
1200       tmp[a+2]=fX[a+2]^Y[a+2]^IV2[a+2];
1201       tmp[a+3]=fX[a+3]^Y[a+3]^IV2[a+3];
1202
1203     }     
1204
1205  for(int a=0;a<h;a+=4) {
1206       tmp[a]=Sbox2[tmp[a]];
1207       tmp[a+1]=Sbox2[tmp[a+1]];
1208       tmp[a+2]=Sbox2[tmp[a+2]];
1209       tmp[a+3]=Sbox2[tmp[a+3]];
1210
1211     }     
1212
1213  /*
1214     for(int a=0;a<h;a+=4) {
1215       tmp[a]=Sbox2[fX[a]^Y[a]^IV2[a]];
1216       tmp[a+1]=Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]];
1217       tmp[a+2]=Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]];
1218       tmp[a+3]=Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]];
1219
1220     }     
1221  */
1222
1223     for(int a=0;a<h;a+=4) {
1224       gY[a]=Sbox1[tmp[a]^RM2[a]];
1225       gY[a+1]=Sbox1[tmp[a+1]^RM2[a+1]];
1226       gY[a+2]=Sbox1[tmp[a+2]^RM2[a+2]];
1227       gY[a+3]=Sbox1[tmp[a+3]^RM2[a+3]];
1228
1229     }     
1230
1231
1232
1233     /*
1234     for(int a=0;a<h;a+=4) {
1235       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
1236       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
1237       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
1238       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
1239
1240     } 
1241     */    
1242
1243     for(int a=0;a<h;a+=4) {
1244       seq_out[ind2+a]=gY[a];
1245       seq_out[ind2+a+1]=gY[a+1];
1246       seq_out[ind2+a+2]=gY[a+2];
1247       seq_out[ind2+a+3]=gY[a+3];
1248     }
1249
1250     for(int a=0;a<h;a+=4) {
1251       seq_out[ind1+a]=fX[a];
1252       seq_out[ind1+a+1]=fX[a+1];
1253       seq_out[ind1+a+2]=fX[a+2];
1254       seq_out[ind1+a+3]=fX[a+3];
1255     }
1256     for(int a=0;a<h;a+=4) {
1257       IV1[a]=fX[a];
1258       IV1[a+1]=fX[a+1];
1259       IV1[a+2]=fX[a+2];
1260       IV1[a+3]=fX[a+3];
1261     }
1262
1263     for(int a=0;a<h;a+=4) {
1264       IV2[a]=gY[a];
1265       IV2[a+1]=gY[a+1];
1266       IV2[a+2]=gY[a+2];
1267       IV2[a+3]=gY[a+3];
1268     }
1269
1270   }
1271   
1272
1273
1274
1275 }
1276
1277
1278
1279
1280
1281
1282
1283
1284 template<int h>
1285 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) {
1286
1287   uchar invfX[h];
1288   uchar invgY[h];
1289   uchar fX[h];
1290   uchar gY[h];
1291   uchar IV1[h];
1292   uchar IV2[h];
1293   uchar *RM1;
1294   uchar *RM2;
1295   uchar tmp[h];
1296
1297
1298   for(int a=0;a<h;a+=4) {
1299     IV1[a]=IV[a];
1300     IV1[a+1]=IV[a+1];
1301     IV1[a+2]=IV[a+2];
1302     IV1[a+3]=IV[a+3];
1303   }
1304
1305
1306   for(int a=0;a<h;a+=4) {
1307     IV2[a]=IV[h+a];
1308     IV2[a+1]=IV[h+a+1];
1309     IV2[a+2]=IV[h+a+2];
1310     IV2[a+3]=IV[h+a+3];
1311
1312   }
1313   
1314   for(int it=0;it<len/2;it++) {
1315     int ind1=Pbox[it]*h;
1316     int ind2=Pbox[it+len/2]*h;
1317
1318
1319     RM1=&RM[PboxSRM[it]*h];
1320     RM2=&RM[h*h+PboxSRM[len/2-it]*h];
1321
1322
1323
1324     
1325     for(int a=0;a<h;a+=4) {
1326       gY[a]=seq_in[ind2+a];
1327       gY[a+1]=seq_in[ind2+a+1];
1328       gY[a+2]=seq_in[ind2+a+2];
1329       gY[a+3]=seq_in[ind2+a+3];
1330     }
1331
1332     for(int a=0;a<h;a+=4) {
1333       fX[a]=seq_in[ind1+a];
1334       fX[a+1]=seq_in[ind1+a+1];
1335       fX[a+2]=seq_in[ind1+a+2];
1336       fX[a+3]=seq_in[ind1+a+3];
1337     }
1338
1339
1340     for(int a=0;a<h;a+=4) {
1341       tmp[a]=Inv_Sbox1[gY[a]]^RM2[a];
1342       tmp[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
1343       tmp[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
1344       tmp[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
1345     }   
1346
1347
1348     for(int a=0;a<h;a+=4) {
1349       tmp[a]=Inv_Sbox2[tmp[a]];
1350       tmp[a+1]=Inv_Sbox2[tmp[a+1]];
1351       tmp[a+2]=Inv_Sbox2[tmp[a+2]];
1352       tmp[a+3]=Inv_Sbox2[tmp[a+3]];
1353     }   
1354
1355
1356     
1357     for(int a=0;a<h;a+=4) {
1358       invgY[a]=tmp[a]^fX[a]^IV2[a];
1359       invgY[a+1]=tmp[a+1]^fX[a+1]^IV2[a+1];
1360       invgY[a+2]=tmp[a+2]^fX[a+2]^IV2[a+2];
1361       invgY[a+3]=tmp[a+3]^fX[a+3]^IV2[a+3];
1362     }   
1363
1364
1365     for(int a=0;a<h;a+=4) {
1366       tmp[a]=Inv_Sbox2[fX[a]]^invgY[a];
1367       tmp[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1368       tmp[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1369       tmp[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1370
1371     }
1372
1373
1374     for(int a=0;a<h;a+=4) {
1375       tmp[a]=Inv_Sbox1[tmp[a]];
1376       tmp[a+1]=Inv_Sbox1[tmp[a+1]];
1377       tmp[a+2]=Inv_Sbox1[tmp[a+2]];
1378       tmp[a+3]=Inv_Sbox1[tmp[a+3]];
1379
1380     }
1381
1382
1383
1384
1385     for(int a=0;a<h;a+=4) {
1386       invfX[a]=tmp[a]^RM1[a]^IV1[a];
1387       invfX[a+1]=tmp[a+1]^RM1[a+1]^IV1[a+1];
1388       invfX[a+2]=tmp[a+2]^RM1[a+2]^IV1[a+2];
1389       invfX[a+3]=tmp[a+3]^RM1[a+3]^IV1[a+3];
1390
1391     }
1392
1393
1394     for(int a=0;a<h;a+=4) {
1395       seq_out[ind2+a]=invfX[a];
1396       seq_out[ind2+a+1]=invfX[a+1];
1397       seq_out[ind2+a+2]=invfX[a+2];
1398       seq_out[ind2+a+3]=invfX[a+3];
1399     }
1400
1401     for(int a=0;a<h;a+=4) {
1402       seq_out[ind1+a]=invgY[a];
1403       seq_out[ind1+a+1]=invgY[a+1];
1404       seq_out[ind1+a+2]=invgY[a+2];
1405       seq_out[ind1+a+3]=invgY[a+3];
1406     }
1407     for(int a=0;a<h;a+=4) {
1408       IV1[a]=fX[a];
1409       IV1[a+1]=fX[a+1];
1410       IV1[a+2]=fX[a+2];
1411       IV1[a+3]=fX[a+3];
1412     }
1413
1414     for(int a=0;a<h;a+=4) {
1415       IV2[a]=gY[a];
1416       IV2[a+1]=gY[a+1];
1417       IV2[a+2]=gY[a+2];
1418       IV2[a+3]=gY[a+3];
1419     }
1420
1421
1422   }
1423   
1424
1425
1426
1427 }
1428
1429
1430
1431
1432
1433 /*
1434
1435 template<int h>
1436 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) {
1437
1438   uchar X[h];
1439   uchar Y[h];
1440   uchar fX[h];
1441   uchar gY[h];
1442   uchar IV1[h];
1443   uchar IV2[h];
1444   uchar *RM1;
1445   uchar *RM2;
1446
1447   int h2=h*h;
1448
1449
1450
1451   
1452   for(int a=0;a<h;a+=4) {
1453     myrand=xorshift32(myrand);
1454     uint mm=myrand;
1455     IV1[a]=(mm&255);
1456     mm>>=8;
1457     IV1[a+1]=(mm&255);
1458     mm>>=8;
1459     IV1[a+2]=(mm&255);
1460     mm>>=8;
1461     IV1[a+3]=(mm&255);
1462   }
1463
1464   for(int a=0;a<h;a+=4) {
1465     myrand=xorshift32(myrand);
1466     uint mm=myrand;
1467     IV2[a]=(mm&255);
1468     mm>>=8;
1469     IV2[a+1]=(mm&255);
1470     mm>>=8;
1471     IV2[a+2]=(mm&255);
1472     mm>>=8;
1473     IV2[a+3]=(mm&255);
1474
1475   }
1476  
1477
1478   
1479   for(int it=0;it<len/2;it++) {
1480     int ind1=Pbox[it]*h;
1481     int ind2=Pbox[it+len/2]*h;
1482
1483
1484
1485     RM1=&RM[PboxSRM[it]*h];
1486     RM2=&RM[h*h+PboxSRM[it]*h];
1487
1488     
1489     for(int a=0;a<h;a+=4) {
1490       X[a]=seq_in[ind2+a];
1491       X[a+1]=seq_in[ind2+a+1];
1492       X[a+2]=seq_in[ind2+a+2];
1493       X[a+3]=seq_in[ind2+a+3];
1494     }
1495
1496     for(int a=0;a<h;a+=4) {
1497       Y[a]=seq_in[ind1+a];
1498       Y[a+1]=seq_in[ind1+a+1];
1499       Y[a+2]=seq_in[ind1+a+2];
1500       Y[a+3]=seq_in[ind1+a+3];
1501     }
1502
1503
1504     for(int a=0;a<h;a+=4) {
1505       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
1506       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
1507       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
1508       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
1509     }
1510
1511     for(int a=0;a<h;a+=4) {
1512       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
1513       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
1514       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
1515       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
1516
1517     }     
1518
1519     for(int a=0;a<h;a+=4) {
1520       seq_out[ind2+a]=gY[a];
1521       seq_out[ind2+a+1]=gY[a+1];
1522       seq_out[ind2+a+2]=gY[a+2];
1523       seq_out[ind2+a+3]=gY[a+3];
1524     }
1525
1526     for(int a=0;a<h;a+=4) {
1527       seq_out[ind1+a]=fX[a];
1528       seq_out[ind1+a+1]=fX[a+1];
1529       seq_out[ind1+a+2]=fX[a+2];
1530       seq_out[ind1+a+3]=fX[a+3];
1531     }
1532     for(int a=0;a<h;a+=4) {
1533       IV1[a]=fX[a];
1534       IV1[a+1]=fX[a+1];
1535       IV1[a+2]=fX[a+2];
1536       IV1[a+3]=fX[a+3];
1537     }
1538
1539     for(int a=0;a<h;a+=4) {
1540       IV2[a]=gY[a];
1541       IV2[a+1]=gY[a+1];
1542       IV2[a+2]=gY[a+2];
1543       IV2[a+3]=gY[a+3];
1544     }
1545
1546   }
1547   
1548
1549
1550
1551 }
1552
1553
1554
1555
1556
1557
1558
1559
1560 template<int h>
1561 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) {
1562
1563   uchar invfX[h];
1564   uchar invgY[h];
1565   uchar fX[h];
1566   uchar gY[h];
1567   uchar IV1[h];
1568   uchar IV2[h];
1569   uchar *RM1;
1570   uchar *RM2;
1571
1572   for(int a=0;a<h;a+=4) {
1573     myrand=xorshift32(myrand);
1574     uint mm=myrand;
1575     IV1[a]=(mm&255);
1576     mm>>=8;
1577     IV1[a+1]=(mm&255);
1578     mm>>=8;
1579     IV1[a+2]=(mm&255);
1580     mm>>=8;
1581     IV1[a+3]=(mm&255);
1582   }
1583
1584   for(int a=0;a<h;a+=4) {
1585     myrand=xorshift32(myrand);
1586     uint mm=myrand;
1587     IV2[a]=(mm&255);
1588     mm>>=8;
1589     IV2[a+1]=(mm&255);
1590     mm>>=8;
1591     IV2[a+2]=(mm&255);
1592     mm>>=8;
1593     IV2[a+3]=(mm&255);
1594
1595   }
1596
1597   
1598  
1599
1600
1601   
1602   for(int it=0;it<len/2;it++) {
1603     int ind1=Pbox[it]*h;
1604     int ind2=Pbox[it+len/2]*h;
1605
1606
1607     RM1=&RM[PboxSRM[it]*h];
1608     RM2=&RM[h*h+PboxSRM[it]*h];
1609
1610     
1611     for(int a=0;a<h;a+=4) {
1612       gY[a]=seq_in[ind2+a];
1613       gY[a+1]=seq_in[ind2+a+1];
1614       gY[a+2]=seq_in[ind2+a+2];
1615       gY[a+3]=seq_in[ind2+a+3];
1616     }
1617
1618     for(int a=0;a<h;a+=4) {
1619       fX[a]=seq_in[ind1+a];
1620       fX[a+1]=seq_in[ind1+a+1];
1621       fX[a+2]=seq_in[ind1+a+2];
1622       fX[a+3]=seq_in[ind1+a+3];
1623     }
1624
1625
1626     for(int a=0;a<h;a+=4) {
1627       invgY[a]=Inv_Sbox1[gY[a]]^RM2[a];
1628       invgY[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
1629       invgY[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
1630       invgY[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
1631     }   
1632
1633
1634     for(int a=0;a<h;a+=4) {
1635       invgY[a]=Inv_Sbox2[invgY[a]]^fX[a]^IV2[a];
1636       invgY[a+1]=Inv_Sbox2[invgY[a+1]]^fX[a+1]^IV2[a+1];
1637       invgY[a+2]=Inv_Sbox2[invgY[a+2]]^fX[a+2]^IV2[a+2];
1638       invgY[a+3]=Inv_Sbox2[invgY[a+3]]^fX[a+3]^IV2[a+3];
1639     }   
1640
1641
1642     for(int a=0;a<h;a+=4) {
1643       invfX[a]=Inv_Sbox2[fX[a]]^invgY[a];
1644       invfX[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1645       invfX[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1646       invfX[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1647
1648     }
1649
1650     for(int a=0;a<h;a+=4) {
1651       invfX[a]=Inv_Sbox1[invfX[a]]^RM1[a]^IV1[a];
1652       invfX[a+1]=Inv_Sbox1[invfX[a+1]]^RM1[a+1]^IV1[a+1];
1653       invfX[a+2]=Inv_Sbox1[invfX[a+2]]^RM1[a+2]^IV1[a+2];
1654       invfX[a+3]=Inv_Sbox1[invfX[a+3]]^RM1[a+3]^IV1[a+3];
1655
1656     }
1657
1658
1659     for(int a=0;a<h;a+=4) {
1660       seq_out[ind2+a]=invfX[a];
1661       seq_out[ind2+a+1]=invfX[a+1];
1662       seq_out[ind2+a+2]=invfX[a+2];
1663       seq_out[ind2+a+3]=invfX[a+3];
1664     }
1665
1666     for(int a=0;a<h;a+=4) {
1667       seq_out[ind1+a]=invgY[a];
1668       seq_out[ind1+a+1]=invgY[a+1];
1669       seq_out[ind1+a+2]=invgY[a+2];
1670       seq_out[ind1+a+3]=invgY[a+3];
1671     }
1672     for(int a=0;a<h;a+=4) {
1673       IV1[a]=fX[a];
1674       IV1[a+1]=fX[a+1];
1675       IV1[a+2]=fX[a+2];
1676       IV1[a+3]=fX[a+3];
1677     }
1678
1679     for(int a=0;a<h;a+=4) {
1680       IV2[a]=gY[a];
1681       IV2[a+1]=gY[a+1];
1682       IV2[a+2]=gY[a+2];
1683       IV2[a+3]=gY[a+3];
1684     }
1685
1686
1687   }
1688   
1689
1690
1691
1692 }
1693 */
1694
1695
1696
1697 int main(int argc, char** argv) {
1698
1699
1700   int h=32;
1701   int lena=0;
1702   int size_buf=1;
1703
1704
1705   
1706   for(int i=1; i<argc; i++){
1707     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
1708     if(strncmp(argv[i],"cbcrm",5)==0) cbcrm=1;       
1709     if(strncmp(argv[i],"cbcprng",7)==0) {cbcprng=1;cbcrm=0;}
1710     if(strncmp(argv[i],"ecbrm",5)==0) ecbrm = 1;
1711     if(strncmp(argv[i],"ecbprng",7)==0) {ecbprng=1; ecbrm=0;}
1712     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
1713     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
1714     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
1715   }
1716
1717   printf("nb times %d\n",nb_test);
1718   printf("cbcrm %d\n",cbcrm);
1719   printf("cbcprng %d\n",cbcprng);
1720   printf("ecbrm %d\n",ecbrm);
1721   printf("ecbprng %d\n",ecbprng);
1722   printf("h %d\n",h);
1723   printf("lena %d\n",lena);
1724   printf("size_buf %d\n",size_buf);
1725
1726   
1727
1728       
1729   int seed=time(NULL);
1730 //  cout<<seed<<endl;
1731   srand48(seed);
1732
1733   uchar Secretkey[key_size];
1734
1735   uchar counter[key_size];
1736
1737   for(int i=0;i<key_size;i++) {
1738     Secretkey[i]=lrand48()&0xFF;
1739     counter[i]=lrand48()&0xFF;
1740   }
1741
1742   
1743   int size = 128;
1744   uchar DK[size];
1745
1746
1747
1748
1749   int width;
1750   int height;
1751
1752   uchar *data_R, *data_G, *data_B;
1753   int imsize;
1754   uchar *buffer;
1755
1756
1757
1758
1759   
1760   if(lena==1) {
1761     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
1762 //    load_RGB_pixmap("8192.ppm", &width, &height, &data_R, &data_G, &data_B);
1763     imsize=width*height*3;
1764 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
1765   }
1766   else {
1767     width=height=size_buf;
1768     imsize=width*height;
1769     buffer=new uchar[imsize];
1770     for(int i=0;i<imsize;i++) {
1771       buffer[i]=lrand48();
1772     }
1773   }
1774
1775
1776
1777   
1778   
1779   uchar* seq= new uchar[imsize];
1780   uchar* seq2= new uchar[imsize];
1781
1782   int oneD=width*height;
1783   if(lena) {
1784     for(int i=0;i<oneD;i++) {
1785       seq[i]=data_R[i];
1786       seq[oneD+i]=data_G[i];
1787       seq[2*oneD+i]=data_B[i];
1788     }
1789   }
1790   else {
1791     for(int i=0;i<oneD;i++) {
1792       seq[i]=buffer[i];
1793     }
1794   }
1795
1796
1797
1798   
1799
1800   int total_len=imsize;
1801   int rp=1;
1802   int len= total_len/h;
1803
1804
1805   
1806   uchar *mix=new uchar[256];
1807
1808
1809
1810     
1811   for (int i = 0; i < 256 ; i++) {
1812     mix[i]=Secretkey[i]^counter[i];
1813     
1814   }
1815   gchar  *sha512;
1816
1817   sha512 = g_compute_checksum_for_string(G_CHECKSUM_SHA512, (const char*) mix, 256);
1818 //  g_print("%s\n", sha512);
1819  
1820
1821
1822
1823
1824
1825
1826
1827   
1828 //  cout<<"hash "<<endl;
1829   for (int i = 0; i < 128 ; i++) {
1830 //    DK[i]=digest[i];
1831     DK[i]=sha512[i];
1832   }
1833   g_free(sha512);
1834
1835
1836   int *Pbox=new int[len];
1837   int *PboxSRM=new int[len/2];
1838   int *PboxSRM2=new int[len/2];
1839   uchar Sbox1[256];
1840   uchar Sbox2[256];  
1841   uchar Inv_Sbox1[256];
1842   uchar Inv_Sbox2[256];
1843   uchar sc[256];  
1844   uchar RM[h*h*2+256];
1845   uchar IV[2*h];
1846
1847   mylong myrand=0;
1848  
1849
1850   double time_encrypt=0;
1851   double time_decrypt=0;
1852   
1853
1854   double t=TimeStart();  
1855   rc4key(DK, Sbox1, 8);
1856   
1857   
1858   rc4key(&DK[8], Sbox2, 8);
1859   
1860   rc4key(&DK[16], sc, 16);
1861   prga(sc, h*h*2+256, RM);
1862
1863
1864
1865
1866   
1867   rc4keyperm(&DK[72], len, rp, Pbox, 16);
1868   
1869   
1870   rc4keyperm(&DK[88], len/2, rp, PboxSRM2, 16);
1871
1872   for(int i=0;i<len/2;i++) {
1873     PboxSRM[i]=PboxSRM2[i]&(h-1);
1874   }
1875
1876 /*
1877   for(int i=0;i<h*2;i++) {
1878     for(int j=0;j<h;j++)
1879       cout<<(int)RM[i*h+j]<<" ";
1880     cout<<endl;
1881   }
1882 */
1883
1884
1885   
1886   //time+=TimeStop(t);
1887   //cout<<"Time initializaton "<<time<<endl;
1888
1889
1890
1891   myrand=0;
1892   for(int i=0;i<64;i++) {
1893     myrand|=DK[i]&1;
1894     myrand<<=1;
1895   }
1896
1897  
1898
1899
1900
1901   
1902   
1903   inverse_tables(Sbox1,256,Inv_Sbox1);
1904   inverse_tables(Sbox2,256,Inv_Sbox2);
1905
1906
1907   xorseed=myrand;
1908 //  lehmer64_seed(myrand);
1909   time_encrypt=0;
1910   t=TimeStart();
1911
1912   int i;
1913   switch(h) {
1914   case 4: 
1915     for(i=0;i<nb_test;i++)
1916     {
1917       if(cbcprng)
1918         encrypt_cbc_prng<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1919       if(cbcrm)
1920         encrypt_cbc_rm<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1921       if(ecbrm)
1922         encrypt_ecb_rm<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1923       if(ecbprng)
1924         encrypt_ecb_prng<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1925     }
1926     break;
1927   case 8: 
1928     for(i=0;i<nb_test;i++)
1929     {
1930       if(cbcprng)
1931         encrypt_cbc_prng<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1932       if(cbcrm)
1933         encrypt_cbc_rm<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1934       if(ecbrm)
1935         encrypt_ecb_rm<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1936       if(ecbprng)
1937         encrypt_ecb_prng<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1938     }
1939     break;
1940   case 16: 
1941     for(i=0;i<nb_test;i++)
1942     {
1943       if(cbcprng)
1944         encrypt_cbc_prng<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1945       if(cbcrm)
1946         encrypt_cbc_rm<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1947       if(ecbrm)
1948         encrypt_ecb_rm<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1949       if(ecbprng)
1950         encrypt_ecb_prng<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1951     }
1952     break;
1953   case 32: 
1954     for(i=0;i<nb_test;i++)
1955     {
1956       if(cbcprng)
1957         encrypt_cbc_prng<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1958       if(cbcrm)
1959         encrypt_cbc_rm<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1960       if(ecbrm)
1961         encrypt_ecb_rm<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1962       if(ecbprng)
1963         encrypt_ecb_prng<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1964     }
1965     break;
1966   case 64: 
1967     for(i=0;i<nb_test;i++)
1968     {
1969       if(cbcprng)
1970         encrypt_cbc_prng<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1971       if(cbcrm)
1972         encrypt_cbc_rm<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1973       if(ecbrm)
1974         encrypt_ecb_rm<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1975       if(ecbprng)
1976         encrypt_ecb_prng<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1977       
1978     }
1979     break;
1980   case 128: 
1981     for(i=0;i<nb_test;i++)
1982     {
1983       if(cbcprng)
1984         encrypt_cbc_prng<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1985       if(cbcrm)
1986         encrypt_cbc_rm<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1987       if(ecbrm)
1988         encrypt_ecb_rm<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
1989       if(ecbprng)
1990         encrypt_ecb_prng<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1991       
1992     }
1993     break;
1994   case 256: 
1995     for(i=0;i<nb_test;i++)
1996     {
1997       if(cbcprng)
1998         encrypt_cbc_prng<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
1999       if(cbcrm)
2000         encrypt_cbc_rm<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2001       if(ecbrm)
2002         encrypt_ecb_rm<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2003       if(ecbprng)
2004         encrypt_ecb_prng<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,myrand,0);
2005       
2006     }
2007     break;
2008   }
2009   time_encrypt+=TimeStop(t);
2010   //cout<<"Time encrypt "<<
2011   cout<<(double)imsize*nb_test/time_encrypt<<"\t";
2012
2013
2014   if(lena) {
2015     for(int i=0;i<oneD;i++) {
2016       data_R[i]=seq2[i];
2017       data_G[i]=seq2[oneD+i];
2018       data_B[i]=seq2[2*oneD+i];
2019     }
2020     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
2021   }
2022
2023
2024   xorseed=myrand;
2025   // lehmer64_seed(myrand);
2026   time_decrypt=0;
2027   t=TimeStart();
2028   switch(h) {
2029   case 4:
2030     for(i=0;i<nb_test;i++) {
2031       if(cbcprng)
2032         decrypt_cbc_prng<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2033       if(cbcrm)
2034         decrypt_cbc_rm<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2035       if(ecbrm)
2036         decrypt_ecb_rm<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2037       if(ecbprng)
2038         decrypt_ecb_prng<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2039     }
2040     break;
2041   case 8:
2042     for(i=0;i<nb_test;i++) {
2043       if(cbcprng)
2044         decrypt_cbc_prng<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2045       if(cbcrm)
2046         decrypt_cbc_rm<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2047       if(ecbrm)
2048         decrypt_ecb_rm<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2049       if(ecbprng)
2050         decrypt_ecb_prng<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2051     }
2052     break;
2053   case 16:
2054     for(i=0;i<nb_test;i++) {
2055       if(cbcprng)
2056         decrypt_cbc_prng<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2057       if(cbcrm)
2058         decrypt_cbc_rm<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2059       if(ecbrm)
2060         decrypt_ecb_rm<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2061       if(ecbprng)
2062         decrypt_ecb_prng<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2063     }
2064     break;
2065   case 32:
2066     for(i=0;i<nb_test;i++) {
2067       if(cbcprng)
2068         decrypt_cbc_prng<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2069       if(cbcrm)
2070         decrypt_cbc_rm<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2071       if(ecbrm)
2072         decrypt_ecb_rm<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2073       if(ecbprng)
2074         decrypt_ecb_prng<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2075     }
2076     break;
2077   case 64:
2078     for(i=0;i<nb_test;i++) {
2079       if(cbcprng)
2080         decrypt_cbc_prng<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2081       if(cbcrm)
2082         decrypt_cbc_rm<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2083       if(ecbrm)
2084         decrypt_ecb_rm<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2085       if(ecbprng)
2086         decrypt_ecb_prng<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2087     }
2088     break;
2089   case 128:
2090     for(i=0;i<nb_test;i++) {
2091       if(cbcprng)
2092         decrypt_cbc_prng<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2093       if(cbcrm)
2094         decrypt_cbc_rm<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2095       if(ecbrm)
2096         decrypt_ecb_rm<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2097       if(ecbprng)
2098         decrypt_ecb_prng<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2099     }
2100     break;
2101   case 256:
2102     for(i=0;i<nb_test;i++) {
2103       if(cbcprng)
2104         decrypt_cbc_prng<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2105       if(cbcrm)
2106         decrypt_cbc_rm<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2107       if(ecbrm)
2108         decrypt_ecb_rm<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2109       if(ecbprng)
2110         decrypt_ecb_prng<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,myrand,0);
2111     }
2112     break;
2113   }
2114
2115   time_decrypt+=TimeStop(t);
2116   //cout<<"Time decrypt "
2117   cout<<(double)imsize*nb_test/time_decrypt<<"\t";
2118
2119   if(lena) {
2120     for(int i=0;i<oneD;i++) {
2121       data_R[i]=seq[i];
2122       data_G[i]=seq[oneD+i];
2123       data_B[i]=seq[2*oneD+i];
2124     }
2125     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
2126   }
2127   else {
2128     bool equal=true;
2129     for(int i=0;i<imsize;i++) {
2130       //cout<<(int)buffer[i]<<endl;
2131       if(buffer[i]!=seq[i]) {
2132         equal=false;
2133       }
2134     }
2135 //    cout<<"RESULT CORRECT: "<<equal<<endl;
2136   }
2137   
2138
2139   return 0;
2140 }