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

Private GIT Repository
e3b98582d48350e626cefb76d32bb17954344395
[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, 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,  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 template<int h>
735 void encrypt_ecb(uchar* seq_in, uchar *seq_out, int len,uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uint myrand, int debug) {
736
737   uchar X[h];
738   uchar Y[h];
739   uchar fX[h];
740   uchar gY[h];
741   uchar *RM1;
742   uchar *RM2;
743   
744   for(int it=0;it<len/2;it++) {
745     int ind1=Pbox[it]*h;
746     int ind2=Pbox[it+len/2]*h;
747
748
749
750     RM1=&RM[PboxSRM[it]*h];
751     RM2=&RM[h*h+PboxSRM[it]*h];
752
753     
754     for(int a=0;a<h;a+=4) {
755       X[a]=seq_in[ind2+a];
756       X[a+1]=seq_in[ind2+a+1];
757       X[a+2]=seq_in[ind2+a+2];
758       X[a+3]=seq_in[ind2+a+3];
759     }
760
761     for(int a=0;a<h;a+=4) {
762       Y[a]=seq_in[ind1+a];
763       Y[a+1]=seq_in[ind1+a+1];
764       Y[a+2]=seq_in[ind1+a+2];
765       Y[a+3]=seq_in[ind1+a+3];
766     }
767
768
769     for(int a=0;a<h;a+=4) {
770       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]]^Y[a]];
771       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]]^Y[a+1]];
772       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]]^Y[a+2]];
773       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]]^Y[a+3]];
774     }
775
776     for(int a=0;a<h;a+=4) {
777       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]]^RM2[a]];
778       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]]^RM2[a+1]];
779       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]]^RM2[a+2]];
780       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]]^RM2[a+3]];
781
782     }     
783
784     for(int a=0;a<h;a+=4) {
785       seq_out[ind2+a]=gY[a];
786       seq_out[ind2+a+1]=gY[a+1];
787       seq_out[ind2+a+2]=gY[a+2];
788       seq_out[ind2+a+3]=gY[a+3];
789     }
790
791     for(int a=0;a<h;a+=4) {
792       seq_out[ind1+a]=fX[a];
793       seq_out[ind1+a+1]=fX[a+1];
794       seq_out[ind1+a+2]=fX[a+2];
795       seq_out[ind1+a+3]=fX[a+3];
796     }
797
798
799
800   }
801   
802
803
804
805 }
806
807
808
809
810
811
812
813
814 template<int h>
815 void decrypt_ecb(uchar* seq_in, uchar *seq_out, int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar *Inv_Sbox1, uchar *Inv_Sbox2,  uint myrand, int debug) {
816
817   uchar invfX[h];
818   uchar invgY[h];
819   uchar fX[h];
820   uchar gY[h];
821   uchar *RM1;
822   uchar *RM2;
823   
824   for(int it=0;it<len/2;it++) {
825     int ind1=Pbox[it]*h;
826     int ind2=Pbox[it+len/2]*h;
827
828
829     RM1=&RM[PboxSRM[it]*h];
830     RM2=&RM[h*h+PboxSRM[it]*h];
831
832     
833     for(int a=0;a<h;a+=4) {
834       gY[a]=seq_in[ind2+a];
835       gY[a+1]=seq_in[ind2+a+1];
836       gY[a+2]=seq_in[ind2+a+2];
837       gY[a+3]=seq_in[ind2+a+3];
838     }
839
840     for(int a=0;a<h;a+=4) {
841       fX[a]=seq_in[ind1+a];
842       fX[a+1]=seq_in[ind1+a+1];
843       fX[a+2]=seq_in[ind1+a+2];
844       fX[a+3]=seq_in[ind1+a+3];
845     }
846
847     for(int a=0;a<h;a+=4) {
848       invgY[a]=Inv_Sbox2[Inv_Sbox1[gY[a]]^RM2[a]]^fX[a];
849       invgY[a+1]=Inv_Sbox2[Inv_Sbox1[gY[a+1]]^RM2[a+1]]^fX[a+1];
850       invgY[a+2]=Inv_Sbox2[Inv_Sbox1[gY[a+2]]^RM2[a+2]]^fX[a+2];
851       invgY[a+3]=Inv_Sbox2[Inv_Sbox1[gY[a+3]]^RM2[a+3]]^fX[a+3];
852     }     
853
854
855     
856     for(int a=0;a<h;a+=4) {
857       invfX[a]=Inv_Sbox1[Inv_Sbox2[fX[a]]^invgY[a]]^RM1[a];
858       invfX[a+1]=Inv_Sbox1[Inv_Sbox2[fX[a+1]]^invgY[a+1]]^RM1[a+1];
859       invfX[a+2]=Inv_Sbox1[Inv_Sbox2[fX[a+2]]^invgY[a+2]]^RM1[a+2];
860       invfX[a+3]=Inv_Sbox1[Inv_Sbox2[fX[a+3]]^invgY[a+3]]^RM1[a+3];
861
862     }
863
864
865     for(int a=0;a<h;a+=4) {
866       seq_out[ind2+a]=invfX[a];
867       seq_out[ind2+a+1]=invfX[a+1];
868       seq_out[ind2+a+2]=invfX[a+2];
869       seq_out[ind2+a+3]=invfX[a+3];
870     }
871
872     for(int a=0;a<h;a+=4) {
873       seq_out[ind1+a]=invgY[a];
874       seq_out[ind1+a+1]=invgY[a+1];
875       seq_out[ind1+a+2]=invgY[a+2];
876       seq_out[ind1+a+3]=invgY[a+3];
877     }
878
879
880
881   }
882   
883
884
885
886 }
887
888 */
889
890
891
892
893
894 template<int h>
895 void encrypt_cbc_prng(uchar* seq_in, uchar *seq_out, int len,uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uint myrand, int debug) {
896
897   uchar X[h];
898   uchar Y[h];
899   uchar fX[h];
900   uchar gY[h];
901   uchar IV1[h];
902   uchar IV2[h];
903   uchar *RM1=&RM[0];
904   uchar *RM2=&RM[h];
905   uchar tmp[h];
906   mylong *rm1=(mylong*)RM1;
907   mylong *rm2=(mylong*)RM2;
908
909
910
911   
912   for(int it=0;it<len/2;it++) {
913     int ind1=Pbox[it]*h;
914     int ind2=Pbox[it+len/2]*h;
915
916     
917     for(int a=0;a<(h>>3);a++) {
918       myrand=xorshift64();
919       rm1[a]=myrand;
920       myrand=xorshift64();
921       rm2[a]=myrand;
922     }  
923
924
925   
926     for(int a=0;a<h;a+=4) {
927       X[a]=seq_in[ind2+a];
928       X[a+1]=seq_in[ind2+a+1];
929       X[a+2]=seq_in[ind2+a+2];
930       X[a+3]=seq_in[ind2+a+3];
931     }
932
933     for(int a=0;a<h;a+=4) {
934       Y[a]=seq_in[ind1+a];
935       Y[a+1]=seq_in[ind1+a+1];
936       Y[a+2]=seq_in[ind1+a+2];
937       Y[a+3]=seq_in[ind1+a+3];
938     }
939
940
941     for(int a=0;a<h;a+=4) {
942       tmp[a]=X[a]^RM1[a]^IV1[a];
943       tmp[a+1]=X[a+1]^RM1[a+1]^IV1[a+1];
944       tmp[a+2]=X[a+2]^RM1[a+2]^IV1[a+2];
945       tmp[a+3]=X[a+3]^RM1[a+3]^IV1[a+3];
946     }
947
948     for(int a=0;a<h;a+=4) {
949       tmp[a]=Sbox1[tmp[a]];
950       tmp[a+1]=Sbox1[tmp[a+1]];
951       tmp[a+2]=Sbox1[tmp[a+2]];
952       tmp[a+3]=Sbox1[tmp[a+3]];
953     }
954
955     
956     /*for(int a=0;a<h;a+=4) {
957       tmp[a]=Sbox1[X[a]^RM1[a]^IV1[a]];
958       tmp[a+1]=Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]];
959       tmp[a+2]=Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]];
960       tmp[a+3]=Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]];
961       }*/
962
963     for(int a=0;a<h;a+=4) {
964       fX[a]=Sbox2[tmp[a]^Y[a]];
965       fX[a+1]=Sbox2[tmp[a+1]^Y[a+1]];
966       fX[a+2]=Sbox2[tmp[a+2]^Y[a+2]];
967       fX[a+3]=Sbox2[tmp[a+3]^Y[a+3]];
968     }
969
970     /*
971     for(int a=0;a<h;a+=4) {
972       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
973       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
974       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
975       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
976       }*/
977
978
979  for(int a=0;a<h;a+=4) {
980       tmp[a]=fX[a]^Y[a]^IV2[a];
981       tmp[a+1]=fX[a+1]^Y[a+1]^IV2[a+1];
982       tmp[a+2]=fX[a+2]^Y[a+2]^IV2[a+2];
983       tmp[a+3]=fX[a+3]^Y[a+3]^IV2[a+3];
984
985     }     
986
987  for(int a=0;a<h;a+=4) {
988       tmp[a]=Sbox2[tmp[a]];
989       tmp[a+1]=Sbox2[tmp[a+1]];
990       tmp[a+2]=Sbox2[tmp[a+2]];
991       tmp[a+3]=Sbox2[tmp[a+3]];
992
993     }     
994
995  /*
996     for(int a=0;a<h;a+=4) {
997       tmp[a]=Sbox2[fX[a]^Y[a]^IV2[a]];
998       tmp[a+1]=Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]];
999       tmp[a+2]=Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]];
1000       tmp[a+3]=Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]];
1001
1002     }     
1003  */
1004
1005     for(int a=0;a<h;a+=4) {
1006       gY[a]=Sbox1[tmp[a]^RM2[a]];
1007       gY[a+1]=Sbox1[tmp[a+1]^RM2[a+1]];
1008       gY[a+2]=Sbox1[tmp[a+2]^RM2[a+2]];
1009       gY[a+3]=Sbox1[tmp[a+3]^RM2[a+3]];
1010
1011     }     
1012
1013
1014
1015     /*
1016     for(int a=0;a<h;a+=4) {
1017       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
1018       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
1019       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
1020       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
1021
1022     } 
1023     */    
1024
1025     for(int a=0;a<h;a+=4) {
1026       seq_out[ind2+a]=gY[a];
1027       seq_out[ind2+a+1]=gY[a+1];
1028       seq_out[ind2+a+2]=gY[a+2];
1029       seq_out[ind2+a+3]=gY[a+3];
1030     }
1031
1032     for(int a=0;a<h;a+=4) {
1033       seq_out[ind1+a]=fX[a];
1034       seq_out[ind1+a+1]=fX[a+1];
1035       seq_out[ind1+a+2]=fX[a+2];
1036       seq_out[ind1+a+3]=fX[a+3];
1037     }
1038     for(int a=0;a<h;a+=4) {
1039       IV1[a]=fX[a];
1040       IV1[a+1]=fX[a+1];
1041       IV1[a+2]=fX[a+2];
1042       IV1[a+3]=fX[a+3];
1043     }
1044
1045     for(int a=0;a<h;a+=4) {
1046       IV2[a]=gY[a];
1047       IV2[a+1]=gY[a+1];
1048       IV2[a+2]=gY[a+2];
1049       IV2[a+3]=gY[a+3];
1050     }
1051
1052   }
1053   
1054
1055
1056
1057 }
1058
1059
1060
1061
1062
1063
1064
1065
1066 template<int h>
1067 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,  uint myrand, int debug) {
1068
1069   uchar invfX[h];
1070   uchar invgY[h];
1071   uchar fX[h];
1072   uchar gY[h];
1073   uchar IV1[h];
1074   uchar IV2[h];
1075   uchar *RM1=&RM[0];
1076   uchar *RM2=&RM[h];
1077 //  uchar RM1[h];
1078 //  uchar RM2[h];
1079   uchar tmp[h];
1080   mylong *rm1=(mylong*)RM1;
1081   mylong *rm2=(mylong*)RM2;
1082   
1083   for(int it=0;it<len/2;it++) {
1084     int ind1=Pbox[it]*h;
1085     int ind2=Pbox[it+len/2]*h;
1086
1087     
1088     for(int a=0;a<(h>>3);a++) {
1089       myrand=xorshift64();
1090       rm1[a]=myrand;
1091       myrand=xorshift64();
1092       rm2[a]=myrand;
1093     }  
1094     
1095     for(int a=0;a<h;a+=4) {
1096       gY[a]=seq_in[ind2+a];
1097       gY[a+1]=seq_in[ind2+a+1];
1098       gY[a+2]=seq_in[ind2+a+2];
1099       gY[a+3]=seq_in[ind2+a+3];
1100     }
1101
1102     for(int a=0;a<h;a+=4) {
1103       fX[a]=seq_in[ind1+a];
1104       fX[a+1]=seq_in[ind1+a+1];
1105       fX[a+2]=seq_in[ind1+a+2];
1106       fX[a+3]=seq_in[ind1+a+3];
1107     }
1108
1109
1110     for(int a=0;a<h;a+=4) {
1111       tmp[a]=Inv_Sbox1[gY[a]]^RM2[a];
1112       tmp[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
1113       tmp[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
1114       tmp[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
1115     }   
1116
1117
1118     for(int a=0;a<h;a+=4) {
1119       tmp[a]=Inv_Sbox2[tmp[a]];
1120       tmp[a+1]=Inv_Sbox2[tmp[a+1]];
1121       tmp[a+2]=Inv_Sbox2[tmp[a+2]];
1122       tmp[a+3]=Inv_Sbox2[tmp[a+3]];
1123     }   
1124
1125
1126     
1127     for(int a=0;a<h;a+=4) {
1128       invgY[a]=tmp[a]^fX[a]^IV2[a];
1129       invgY[a+1]=tmp[a+1]^fX[a+1]^IV2[a+1];
1130       invgY[a+2]=tmp[a+2]^fX[a+2]^IV2[a+2];
1131       invgY[a+3]=tmp[a+3]^fX[a+3]^IV2[a+3];
1132     }   
1133
1134
1135     for(int a=0;a<h;a+=4) {
1136       tmp[a]=Inv_Sbox2[fX[a]]^invgY[a];
1137       tmp[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1138       tmp[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1139       tmp[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1140
1141     }
1142
1143
1144     for(int a=0;a<h;a+=4) {
1145       tmp[a]=Inv_Sbox1[tmp[a]];
1146       tmp[a+1]=Inv_Sbox1[tmp[a+1]];
1147       tmp[a+2]=Inv_Sbox1[tmp[a+2]];
1148       tmp[a+3]=Inv_Sbox1[tmp[a+3]];
1149
1150     }
1151
1152
1153
1154
1155     for(int a=0;a<h;a+=4) {
1156       invfX[a]=tmp[a]^RM1[a]^IV1[a];
1157       invfX[a+1]=tmp[a+1]^RM1[a+1]^IV1[a+1];
1158       invfX[a+2]=tmp[a+2]^RM1[a+2]^IV1[a+2];
1159       invfX[a+3]=tmp[a+3]^RM1[a+3]^IV1[a+3];
1160
1161     }
1162
1163
1164     for(int a=0;a<h;a+=4) {
1165       seq_out[ind2+a]=invfX[a];
1166       seq_out[ind2+a+1]=invfX[a+1];
1167       seq_out[ind2+a+2]=invfX[a+2];
1168       seq_out[ind2+a+3]=invfX[a+3];
1169     }
1170
1171     for(int a=0;a<h;a+=4) {
1172       seq_out[ind1+a]=invgY[a];
1173       seq_out[ind1+a+1]=invgY[a+1];
1174       seq_out[ind1+a+2]=invgY[a+2];
1175       seq_out[ind1+a+3]=invgY[a+3];
1176     }
1177     for(int a=0;a<h;a+=4) {
1178       IV1[a]=fX[a];
1179       IV1[a+1]=fX[a+1];
1180       IV1[a+2]=fX[a+2];
1181       IV1[a+3]=fX[a+3];
1182     }
1183
1184     for(int a=0;a<h;a+=4) {
1185       IV2[a]=gY[a];
1186       IV2[a+1]=gY[a+1];
1187       IV2[a+2]=gY[a+2];
1188       IV2[a+3]=gY[a+3];
1189     }
1190
1191
1192   }
1193   
1194
1195
1196
1197 }
1198
1199
1200
1201
1202
1203
1204
1205
1206 template<int h>
1207 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) {
1208
1209   uchar X[h];
1210   uchar Y[h];
1211   uchar fX[h];
1212   uchar gY[h];
1213   uchar IV1[h];
1214   uchar IV2[h];
1215   uchar *RM1;
1216   uchar *RM2;
1217   uchar tmp[h];
1218
1219
1220
1221   for(int a=0;a<h;a+=4) {
1222     IV1[a]=IV[a];
1223     IV1[a+1]=IV[a+1];
1224     IV1[a+2]=IV[a+2];
1225     IV1[a+3]=IV[a+3];
1226   }
1227
1228
1229   for(int a=0;a<h;a+=4) {
1230     IV2[a]=IV[h+a];
1231     IV2[a+1]=IV[h+a+1];
1232     IV2[a+2]=IV[h+a+2];
1233     IV2[a+3]=IV[h+a+3];
1234
1235   }
1236
1237   for(int it=0;it<len/2;it++) {
1238     int ind1=Pbox[it]*h;
1239     int ind2=Pbox[it+len/2]*h;
1240
1241     RM1=&RM[PboxSRM[it]*h];
1242     RM2=&RM[h*h+PboxSRM[len/2-it]*h];
1243
1244     
1245     for(int a=0;a<h;a+=4) {
1246       X[a]=seq_in[ind2+a];
1247       X[a+1]=seq_in[ind2+a+1];
1248       X[a+2]=seq_in[ind2+a+2];
1249       X[a+3]=seq_in[ind2+a+3];
1250     }
1251
1252     for(int a=0;a<h;a+=4) {
1253       Y[a]=seq_in[ind1+a];
1254       Y[a+1]=seq_in[ind1+a+1];
1255       Y[a+2]=seq_in[ind1+a+2];
1256       Y[a+3]=seq_in[ind1+a+3];
1257     }
1258
1259
1260     for(int a=0;a<h;a+=4) {
1261       tmp[a]=X[a]^RM1[a]^IV1[a];
1262       tmp[a+1]=X[a+1]^RM1[a+1]^IV1[a+1];
1263       tmp[a+2]=X[a+2]^RM1[a+2]^IV1[a+2];
1264       tmp[a+3]=X[a+3]^RM1[a+3]^IV1[a+3];
1265     }
1266
1267     for(int a=0;a<h;a+=4) {
1268       tmp[a]=Sbox1[tmp[a]];
1269       tmp[a+1]=Sbox1[tmp[a+1]];
1270       tmp[a+2]=Sbox1[tmp[a+2]];
1271       tmp[a+3]=Sbox1[tmp[a+3]];
1272     }
1273
1274     
1275     /*for(int a=0;a<h;a+=4) {
1276       tmp[a]=Sbox1[X[a]^RM1[a]^IV1[a]];
1277       tmp[a+1]=Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]];
1278       tmp[a+2]=Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]];
1279       tmp[a+3]=Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]];
1280       }*/
1281
1282     for(int a=0;a<h;a+=4) {
1283       fX[a]=Sbox2[tmp[a]^Y[a]];
1284       fX[a+1]=Sbox2[tmp[a+1]^Y[a+1]];
1285       fX[a+2]=Sbox2[tmp[a+2]^Y[a+2]];
1286       fX[a+3]=Sbox2[tmp[a+3]^Y[a+3]];
1287     }
1288
1289     /*
1290     for(int a=0;a<h;a+=4) {
1291       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
1292       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
1293       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
1294       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
1295       }*/
1296
1297
1298  for(int a=0;a<h;a+=4) {
1299       tmp[a]=fX[a]^Y[a]^IV2[a];
1300       tmp[a+1]=fX[a+1]^Y[a+1]^IV2[a+1];
1301       tmp[a+2]=fX[a+2]^Y[a+2]^IV2[a+2];
1302       tmp[a+3]=fX[a+3]^Y[a+3]^IV2[a+3];
1303
1304     }     
1305
1306  for(int a=0;a<h;a+=4) {
1307       tmp[a]=Sbox2[tmp[a]];
1308       tmp[a+1]=Sbox2[tmp[a+1]];
1309       tmp[a+2]=Sbox2[tmp[a+2]];
1310       tmp[a+3]=Sbox2[tmp[a+3]];
1311
1312     }     
1313
1314  /*
1315     for(int a=0;a<h;a+=4) {
1316       tmp[a]=Sbox2[fX[a]^Y[a]^IV2[a]];
1317       tmp[a+1]=Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]];
1318       tmp[a+2]=Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]];
1319       tmp[a+3]=Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]];
1320
1321     }     
1322  */
1323
1324     for(int a=0;a<h;a+=4) {
1325       gY[a]=Sbox1[tmp[a]^RM2[a]];
1326       gY[a+1]=Sbox1[tmp[a+1]^RM2[a+1]];
1327       gY[a+2]=Sbox1[tmp[a+2]^RM2[a+2]];
1328       gY[a+3]=Sbox1[tmp[a+3]^RM2[a+3]];
1329
1330     }     
1331
1332
1333
1334     /*
1335     for(int a=0;a<h;a+=4) {
1336       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
1337       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
1338       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
1339       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
1340
1341     } 
1342     */    
1343
1344     for(int a=0;a<h;a+=4) {
1345       seq_out[ind2+a]=gY[a];
1346       seq_out[ind2+a+1]=gY[a+1];
1347       seq_out[ind2+a+2]=gY[a+2];
1348       seq_out[ind2+a+3]=gY[a+3];
1349     }
1350
1351     for(int a=0;a<h;a+=4) {
1352       seq_out[ind1+a]=fX[a];
1353       seq_out[ind1+a+1]=fX[a+1];
1354       seq_out[ind1+a+2]=fX[a+2];
1355       seq_out[ind1+a+3]=fX[a+3];
1356     }
1357     for(int a=0;a<h;a+=4) {
1358       IV1[a]=fX[a];
1359       IV1[a+1]=fX[a+1];
1360       IV1[a+2]=fX[a+2];
1361       IV1[a+3]=fX[a+3];
1362     }
1363
1364     for(int a=0;a<h;a+=4) {
1365       IV2[a]=gY[a];
1366       IV2[a+1]=gY[a+1];
1367       IV2[a+2]=gY[a+2];
1368       IV2[a+3]=gY[a+3];
1369     }
1370
1371   }
1372   
1373
1374
1375
1376 }
1377
1378
1379
1380
1381
1382
1383
1384
1385 template<int h>
1386 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) {
1387
1388   uchar invfX[h];
1389   uchar invgY[h];
1390   uchar fX[h];
1391   uchar gY[h];
1392   uchar IV1[h];
1393   uchar IV2[h];
1394   uchar *RM1;
1395   uchar *RM2;
1396   uchar tmp[h];
1397
1398
1399   for(int a=0;a<h;a+=4) {
1400     IV1[a]=IV[a];
1401     IV1[a+1]=IV[a+1];
1402     IV1[a+2]=IV[a+2];
1403     IV1[a+3]=IV[a+3];
1404   }
1405
1406
1407   for(int a=0;a<h;a+=4) {
1408     IV2[a]=IV[h+a];
1409     IV2[a+1]=IV[h+a+1];
1410     IV2[a+2]=IV[h+a+2];
1411     IV2[a+3]=IV[h+a+3];
1412
1413   }
1414   
1415   for(int it=0;it<len/2;it++) {
1416     int ind1=Pbox[it]*h;
1417     int ind2=Pbox[it+len/2]*h;
1418
1419
1420     RM1=&RM[PboxSRM[it]*h];
1421     RM2=&RM[h*h+PboxSRM[len/2-it]*h];
1422
1423
1424
1425     
1426     for(int a=0;a<h;a+=4) {
1427       gY[a]=seq_in[ind2+a];
1428       gY[a+1]=seq_in[ind2+a+1];
1429       gY[a+2]=seq_in[ind2+a+2];
1430       gY[a+3]=seq_in[ind2+a+3];
1431     }
1432
1433     for(int a=0;a<h;a+=4) {
1434       fX[a]=seq_in[ind1+a];
1435       fX[a+1]=seq_in[ind1+a+1];
1436       fX[a+2]=seq_in[ind1+a+2];
1437       fX[a+3]=seq_in[ind1+a+3];
1438     }
1439
1440
1441     for(int a=0;a<h;a+=4) {
1442       tmp[a]=Inv_Sbox1[gY[a]]^RM2[a];
1443       tmp[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
1444       tmp[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
1445       tmp[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
1446     }   
1447
1448
1449     for(int a=0;a<h;a+=4) {
1450       tmp[a]=Inv_Sbox2[tmp[a]];
1451       tmp[a+1]=Inv_Sbox2[tmp[a+1]];
1452       tmp[a+2]=Inv_Sbox2[tmp[a+2]];
1453       tmp[a+3]=Inv_Sbox2[tmp[a+3]];
1454     }   
1455
1456
1457     
1458     for(int a=0;a<h;a+=4) {
1459       invgY[a]=tmp[a]^fX[a]^IV2[a];
1460       invgY[a+1]=tmp[a+1]^fX[a+1]^IV2[a+1];
1461       invgY[a+2]=tmp[a+2]^fX[a+2]^IV2[a+2];
1462       invgY[a+3]=tmp[a+3]^fX[a+3]^IV2[a+3];
1463     }   
1464
1465
1466     for(int a=0;a<h;a+=4) {
1467       tmp[a]=Inv_Sbox2[fX[a]]^invgY[a];
1468       tmp[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1469       tmp[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1470       tmp[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1471
1472     }
1473
1474
1475     for(int a=0;a<h;a+=4) {
1476       tmp[a]=Inv_Sbox1[tmp[a]];
1477       tmp[a+1]=Inv_Sbox1[tmp[a+1]];
1478       tmp[a+2]=Inv_Sbox1[tmp[a+2]];
1479       tmp[a+3]=Inv_Sbox1[tmp[a+3]];
1480
1481     }
1482
1483
1484
1485
1486     for(int a=0;a<h;a+=4) {
1487       invfX[a]=tmp[a]^RM1[a]^IV1[a];
1488       invfX[a+1]=tmp[a+1]^RM1[a+1]^IV1[a+1];
1489       invfX[a+2]=tmp[a+2]^RM1[a+2]^IV1[a+2];
1490       invfX[a+3]=tmp[a+3]^RM1[a+3]^IV1[a+3];
1491
1492     }
1493
1494
1495     for(int a=0;a<h;a+=4) {
1496       seq_out[ind2+a]=invfX[a];
1497       seq_out[ind2+a+1]=invfX[a+1];
1498       seq_out[ind2+a+2]=invfX[a+2];
1499       seq_out[ind2+a+3]=invfX[a+3];
1500     }
1501
1502     for(int a=0;a<h;a+=4) {
1503       seq_out[ind1+a]=invgY[a];
1504       seq_out[ind1+a+1]=invgY[a+1];
1505       seq_out[ind1+a+2]=invgY[a+2];
1506       seq_out[ind1+a+3]=invgY[a+3];
1507     }
1508     for(int a=0;a<h;a+=4) {
1509       IV1[a]=fX[a];
1510       IV1[a+1]=fX[a+1];
1511       IV1[a+2]=fX[a+2];
1512       IV1[a+3]=fX[a+3];
1513     }
1514
1515     for(int a=0;a<h;a+=4) {
1516       IV2[a]=gY[a];
1517       IV2[a+1]=gY[a+1];
1518       IV2[a+2]=gY[a+2];
1519       IV2[a+3]=gY[a+3];
1520     }
1521
1522
1523   }
1524   
1525
1526
1527
1528 }
1529
1530
1531
1532
1533
1534 /*
1535
1536 template<int h>
1537 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) {
1538
1539   uchar X[h];
1540   uchar Y[h];
1541   uchar fX[h];
1542   uchar gY[h];
1543   uchar IV1[h];
1544   uchar IV2[h];
1545   uchar *RM1;
1546   uchar *RM2;
1547
1548   int h2=h*h;
1549
1550
1551
1552   
1553   for(int a=0;a<h;a+=4) {
1554     myrand=xorshift32(myrand);
1555     uint mm=myrand;
1556     IV1[a]=(mm&255);
1557     mm>>=8;
1558     IV1[a+1]=(mm&255);
1559     mm>>=8;
1560     IV1[a+2]=(mm&255);
1561     mm>>=8;
1562     IV1[a+3]=(mm&255);
1563   }
1564
1565   for(int a=0;a<h;a+=4) {
1566     myrand=xorshift32(myrand);
1567     uint mm=myrand;
1568     IV2[a]=(mm&255);
1569     mm>>=8;
1570     IV2[a+1]=(mm&255);
1571     mm>>=8;
1572     IV2[a+2]=(mm&255);
1573     mm>>=8;
1574     IV2[a+3]=(mm&255);
1575
1576   }
1577  
1578
1579   
1580   for(int it=0;it<len/2;it++) {
1581     int ind1=Pbox[it]*h;
1582     int ind2=Pbox[it+len/2]*h;
1583
1584
1585
1586     RM1=&RM[PboxSRM[it]*h];
1587     RM2=&RM[h*h+PboxSRM[it]*h];
1588
1589     
1590     for(int a=0;a<h;a+=4) {
1591       X[a]=seq_in[ind2+a];
1592       X[a+1]=seq_in[ind2+a+1];
1593       X[a+2]=seq_in[ind2+a+2];
1594       X[a+3]=seq_in[ind2+a+3];
1595     }
1596
1597     for(int a=0;a<h;a+=4) {
1598       Y[a]=seq_in[ind1+a];
1599       Y[a+1]=seq_in[ind1+a+1];
1600       Y[a+2]=seq_in[ind1+a+2];
1601       Y[a+3]=seq_in[ind1+a+3];
1602     }
1603
1604
1605     for(int a=0;a<h;a+=4) {
1606       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
1607       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
1608       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
1609       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
1610     }
1611
1612     for(int a=0;a<h;a+=4) {
1613       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
1614       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
1615       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
1616       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
1617
1618     }     
1619
1620     for(int a=0;a<h;a+=4) {
1621       seq_out[ind2+a]=gY[a];
1622       seq_out[ind2+a+1]=gY[a+1];
1623       seq_out[ind2+a+2]=gY[a+2];
1624       seq_out[ind2+a+3]=gY[a+3];
1625     }
1626
1627     for(int a=0;a<h;a+=4) {
1628       seq_out[ind1+a]=fX[a];
1629       seq_out[ind1+a+1]=fX[a+1];
1630       seq_out[ind1+a+2]=fX[a+2];
1631       seq_out[ind1+a+3]=fX[a+3];
1632     }
1633     for(int a=0;a<h;a+=4) {
1634       IV1[a]=fX[a];
1635       IV1[a+1]=fX[a+1];
1636       IV1[a+2]=fX[a+2];
1637       IV1[a+3]=fX[a+3];
1638     }
1639
1640     for(int a=0;a<h;a+=4) {
1641       IV2[a]=gY[a];
1642       IV2[a+1]=gY[a+1];
1643       IV2[a+2]=gY[a+2];
1644       IV2[a+3]=gY[a+3];
1645     }
1646
1647   }
1648   
1649
1650
1651
1652 }
1653
1654
1655
1656
1657
1658
1659
1660
1661 template<int h>
1662 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) {
1663
1664   uchar invfX[h];
1665   uchar invgY[h];
1666   uchar fX[h];
1667   uchar gY[h];
1668   uchar IV1[h];
1669   uchar IV2[h];
1670   uchar *RM1;
1671   uchar *RM2;
1672
1673   for(int a=0;a<h;a+=4) {
1674     myrand=xorshift32(myrand);
1675     uint mm=myrand;
1676     IV1[a]=(mm&255);
1677     mm>>=8;
1678     IV1[a+1]=(mm&255);
1679     mm>>=8;
1680     IV1[a+2]=(mm&255);
1681     mm>>=8;
1682     IV1[a+3]=(mm&255);
1683   }
1684
1685   for(int a=0;a<h;a+=4) {
1686     myrand=xorshift32(myrand);
1687     uint mm=myrand;
1688     IV2[a]=(mm&255);
1689     mm>>=8;
1690     IV2[a+1]=(mm&255);
1691     mm>>=8;
1692     IV2[a+2]=(mm&255);
1693     mm>>=8;
1694     IV2[a+3]=(mm&255);
1695
1696   }
1697
1698   
1699  
1700
1701
1702   
1703   for(int it=0;it<len/2;it++) {
1704     int ind1=Pbox[it]*h;
1705     int ind2=Pbox[it+len/2]*h;
1706
1707
1708     RM1=&RM[PboxSRM[it]*h];
1709     RM2=&RM[h*h+PboxSRM[it]*h];
1710
1711     
1712     for(int a=0;a<h;a+=4) {
1713       gY[a]=seq_in[ind2+a];
1714       gY[a+1]=seq_in[ind2+a+1];
1715       gY[a+2]=seq_in[ind2+a+2];
1716       gY[a+3]=seq_in[ind2+a+3];
1717     }
1718
1719     for(int a=0;a<h;a+=4) {
1720       fX[a]=seq_in[ind1+a];
1721       fX[a+1]=seq_in[ind1+a+1];
1722       fX[a+2]=seq_in[ind1+a+2];
1723       fX[a+3]=seq_in[ind1+a+3];
1724     }
1725
1726
1727     for(int a=0;a<h;a+=4) {
1728       invgY[a]=Inv_Sbox1[gY[a]]^RM2[a];
1729       invgY[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
1730       invgY[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
1731       invgY[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
1732     }   
1733
1734
1735     for(int a=0;a<h;a+=4) {
1736       invgY[a]=Inv_Sbox2[invgY[a]]^fX[a]^IV2[a];
1737       invgY[a+1]=Inv_Sbox2[invgY[a+1]]^fX[a+1]^IV2[a+1];
1738       invgY[a+2]=Inv_Sbox2[invgY[a+2]]^fX[a+2]^IV2[a+2];
1739       invgY[a+3]=Inv_Sbox2[invgY[a+3]]^fX[a+3]^IV2[a+3];
1740     }   
1741
1742
1743     for(int a=0;a<h;a+=4) {
1744       invfX[a]=Inv_Sbox2[fX[a]]^invgY[a];
1745       invfX[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1746       invfX[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1747       invfX[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1748
1749     }
1750
1751     for(int a=0;a<h;a+=4) {
1752       invfX[a]=Inv_Sbox1[invfX[a]]^RM1[a]^IV1[a];
1753       invfX[a+1]=Inv_Sbox1[invfX[a+1]]^RM1[a+1]^IV1[a+1];
1754       invfX[a+2]=Inv_Sbox1[invfX[a+2]]^RM1[a+2]^IV1[a+2];
1755       invfX[a+3]=Inv_Sbox1[invfX[a+3]]^RM1[a+3]^IV1[a+3];
1756
1757     }
1758
1759
1760     for(int a=0;a<h;a+=4) {
1761       seq_out[ind2+a]=invfX[a];
1762       seq_out[ind2+a+1]=invfX[a+1];
1763       seq_out[ind2+a+2]=invfX[a+2];
1764       seq_out[ind2+a+3]=invfX[a+3];
1765     }
1766
1767     for(int a=0;a<h;a+=4) {
1768       seq_out[ind1+a]=invgY[a];
1769       seq_out[ind1+a+1]=invgY[a+1];
1770       seq_out[ind1+a+2]=invgY[a+2];
1771       seq_out[ind1+a+3]=invgY[a+3];
1772     }
1773     for(int a=0;a<h;a+=4) {
1774       IV1[a]=fX[a];
1775       IV1[a+1]=fX[a+1];
1776       IV1[a+2]=fX[a+2];
1777       IV1[a+3]=fX[a+3];
1778     }
1779
1780     for(int a=0;a<h;a+=4) {
1781       IV2[a]=gY[a];
1782       IV2[a+1]=gY[a+1];
1783       IV2[a+2]=gY[a+2];
1784       IV2[a+3]=gY[a+3];
1785     }
1786
1787
1788   }
1789   
1790
1791
1792
1793 }
1794 */
1795
1796
1797
1798 int main(int argc, char** argv) {
1799
1800
1801   int h=32;
1802   int lena=0;
1803   int size_buf=1;
1804
1805
1806   
1807   for(int i=1; i<argc; i++){
1808     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
1809     if(strncmp(argv[i],"cbcrm",5)==0) cbcrm=1;       
1810     if(strncmp(argv[i],"cbcprng",7)==0) {cbcprng=1;cbcrm=0;}
1811     if(strncmp(argv[i],"ecbrm",5)==0) ecbrm = 1;
1812     if(strncmp(argv[i],"ecbprng",7)==0) {ecbprng=1; ecbrm=0;}
1813     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
1814     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
1815     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
1816   }
1817
1818   printf("nb times %d\n",nb_test);
1819   printf("cbcrm %d\n",cbcrm);
1820   printf("cbcprng %d\n",cbcprng);
1821   printf("ecbrm %d\n",ecbrm);
1822   printf("ecbprng %d\n",ecbprng);
1823   printf("h %d\n",h);
1824   printf("lena %d\n",lena);
1825   printf("size_buf %d\n",size_buf);
1826
1827   
1828
1829       
1830   int seed=time(NULL);
1831 //  cout<<seed<<endl;
1832   srand48(seed);
1833
1834   uchar Secretkey[key_size];
1835
1836   uchar counter[key_size];
1837
1838   for(int i=0;i<key_size;i++) {
1839     Secretkey[i]=lrand48()&0xFF;
1840     counter[i]=lrand48()&0xFF;
1841   }
1842
1843   
1844   int size = 128;
1845   uchar DK[size];
1846
1847
1848
1849
1850   int width;
1851   int height;
1852
1853   uchar *data_R, *data_G, *data_B;
1854   int imsize;
1855   uchar *buffer;
1856
1857
1858
1859
1860   
1861   if(lena==1) {
1862     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
1863 //    load_RGB_pixmap("8192.ppm", &width, &height, &data_R, &data_G, &data_B);
1864     imsize=width*height*3;
1865 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
1866   }
1867   else {
1868     width=height=size_buf;
1869     imsize=width*height;
1870     buffer=new uchar[imsize];
1871     for(int i=0;i<imsize;i++) {
1872       buffer[i]=lrand48();
1873     }
1874   }
1875
1876
1877
1878   
1879   
1880   uchar* seq= new uchar[imsize];
1881   uchar* seq2= new uchar[imsize];
1882
1883   int oneD=width*height;
1884   if(lena) {
1885     for(int i=0;i<oneD;i++) {
1886       seq[i]=data_R[i];
1887       seq[oneD+i]=data_G[i];
1888       seq[2*oneD+i]=data_B[i];
1889     }
1890   }
1891   else {
1892     for(int i=0;i<oneD;i++) {
1893       seq[i]=buffer[i];
1894     }
1895   }
1896
1897
1898
1899   
1900
1901   int total_len=imsize;
1902   int rp=1;
1903   int len= total_len/h;
1904
1905
1906   
1907   uchar *mix=new uchar[256];
1908
1909
1910
1911     
1912   for (int i = 0; i < 256 ; i++) {
1913     mix[i]=Secretkey[i]^counter[i];
1914     
1915   }
1916   gchar  *sha512;
1917
1918   sha512 = g_compute_checksum_for_string(G_CHECKSUM_SHA512, (const char*) mix, 256);
1919 //  g_print("%s\n", sha512);
1920  
1921
1922
1923
1924
1925
1926
1927
1928   
1929 //  cout<<"hash "<<endl;
1930   for (int i = 0; i < 128 ; i++) {
1931 //    DK[i]=digest[i];
1932     DK[i]=sha512[i];
1933   }
1934   g_free(sha512);
1935
1936
1937   int *Pbox=new int[len];
1938   int *PboxSRM=new int[len/2];
1939   int *PboxSRM2=new int[len/2];
1940   uchar Sbox1[256];
1941   uchar Sbox2[256];  
1942   uchar Inv_Sbox1[256];
1943   uchar Inv_Sbox2[256];
1944   uchar sc[256];  
1945   uchar RM[h*h*2+256];
1946   uchar IV[2*h];
1947
1948   mylong myrand=0;
1949  
1950
1951   double time_encrypt=0;
1952   double time_decrypt=0;
1953   
1954
1955   double t=TimeStart();  
1956   rc4key(DK, Sbox1, 8);
1957   
1958   
1959   rc4key(&DK[8], Sbox2, 8);
1960   
1961   rc4key(&DK[16], sc, 16);
1962   prga(sc, h*h*2+256, RM);
1963
1964
1965
1966
1967   
1968   rc4keyperm(&DK[72], len, rp, Pbox, 16);
1969   
1970   
1971   rc4keyperm(&DK[88], len/2, rp, PboxSRM2, 16);
1972
1973   for(int i=0;i<len/2;i++) {
1974     PboxSRM[i]=PboxSRM2[i]&(h-1);
1975   }
1976
1977 /*
1978   for(int i=0;i<h*2;i++) {
1979     for(int j=0;j<h;j++)
1980       cout<<(int)RM[i*h+j]<<" ";
1981     cout<<endl;
1982   }
1983 */
1984
1985
1986   
1987   //time+=TimeStop(t);
1988   //cout<<"Time initializaton "<<time<<endl;
1989
1990
1991
1992   myrand=0;
1993   for(int i=0;i<64;i++) {
1994     myrand|=DK[i]&1;
1995     myrand<<=1;
1996   }
1997
1998  
1999
2000
2001
2002   
2003   
2004   inverse_tables(Sbox1,256,Inv_Sbox1);
2005   inverse_tables(Sbox2,256,Inv_Sbox2);
2006
2007
2008   xorseed=myrand;
2009 //  lehmer64_seed(myrand);
2010   time_encrypt=0;
2011   t=TimeStart();
2012
2013   int i;
2014   switch(h) {
2015   case 4: 
2016     for(i=0;i<nb_test;i++)
2017     {
2018       if(cbcprng)
2019         encrypt_cbc_prng<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2020       if(cbcrm)
2021         encrypt_cbc_rm<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2022       if(ecbrm)
2023         encrypt_ecb_rm<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2024       if(ecbprng)
2025         encrypt_ecb_prng<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2026     }
2027     break;
2028   case 8: 
2029     for(i=0;i<nb_test;i++)
2030     {
2031       if(cbcprng)
2032         encrypt_cbc_prng<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2033       if(cbcrm)
2034         encrypt_cbc_rm<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2035       if(ecbrm)
2036         encrypt_ecb_rm<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2037       if(ecbprng)
2038         encrypt_ecb_prng<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2039     }
2040     break;
2041   case 16: 
2042     for(i=0;i<nb_test;i++)
2043     {
2044       if(cbcprng)
2045         encrypt_cbc_prng<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2046       if(cbcrm)
2047         encrypt_cbc_rm<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2048       if(ecbrm)
2049         encrypt_ecb_rm<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2050       if(ecbprng)
2051         encrypt_ecb_prng<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2052     }
2053     break;
2054   case 32: 
2055     for(i=0;i<nb_test;i++)
2056     {
2057       if(cbcprng)
2058         encrypt_cbc_prng<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2059       if(cbcrm)
2060         encrypt_cbc_rm<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2061       if(ecbrm)
2062         encrypt_ecb_rm<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2063       if(ecbprng)
2064         encrypt_ecb_prng<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2065     }
2066     break;
2067   case 64: 
2068     for(i=0;i<nb_test;i++)
2069     {
2070       if(cbcprng)
2071         encrypt_cbc_prng<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2072       if(cbcrm)
2073         encrypt_cbc_rm<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2074       if(ecbrm)
2075         encrypt_ecb_rm<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2076       if(ecbprng)
2077         encrypt_ecb_prng<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2078       
2079     }
2080     break;
2081   case 128: 
2082     for(i=0;i<nb_test;i++)
2083     {
2084       if(cbcprng)
2085         encrypt_cbc_prng<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2086       if(cbcrm)
2087         encrypt_cbc_rm<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2088       if(ecbrm)
2089         encrypt_ecb_rm<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2090       if(ecbprng)
2091         encrypt_ecb_prng<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2092       
2093     }
2094     break;
2095   case 256: 
2096     for(i=0;i<nb_test;i++)
2097     {
2098       if(cbcprng)
2099         encrypt_cbc_prng<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2100       if(cbcrm)
2101         encrypt_cbc_rm<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2102       if(ecbrm)
2103         encrypt_ecb_rm<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV,0);
2104       if(ecbprng)
2105         encrypt_ecb_prng<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
2106       
2107     }
2108     break;
2109   }
2110   time_encrypt+=TimeStop(t);
2111   //cout<<"Time encrypt "<<
2112   cout<<(double)imsize*nb_test/time_encrypt<<"\t";
2113
2114
2115   if(lena) {
2116     for(int i=0;i<oneD;i++) {
2117       data_R[i]=seq2[i];
2118       data_G[i]=seq2[oneD+i];
2119       data_B[i]=seq2[2*oneD+i];
2120     }
2121     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
2122   }
2123
2124
2125   xorseed=myrand;
2126   // lehmer64_seed(myrand);
2127   time_decrypt=0;
2128   t=TimeStart();
2129   switch(h) {
2130   case 4:
2131     for(i=0;i<nb_test;i++) {
2132       if(cbcprng)
2133         decrypt_cbc_prng<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2134       if(cbcrm)
2135         decrypt_cbc_rm<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2136       if(ecbrm)
2137         decrypt_ecb_rm<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2138       if(ecbprng)
2139         decrypt_ecb_prng<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2140     }
2141     break;
2142   case 8:
2143     for(i=0;i<nb_test;i++) {
2144       if(cbcprng)
2145         decrypt_cbc_prng<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2146       if(cbcrm)
2147         decrypt_cbc_rm<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2148       if(ecbrm)
2149         decrypt_ecb_rm<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2150       if(ecbprng)
2151         decrypt_ecb_prng<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2152     }
2153     break;
2154   case 16:
2155     for(i=0;i<nb_test;i++) {
2156       if(cbcprng)
2157         decrypt_cbc_prng<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2158       if(cbcrm)
2159         decrypt_cbc_rm<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2160       if(ecbrm)
2161         decrypt_ecb_rm<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2162       if(ecbprng)
2163         decrypt_ecb_prng<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2164     }
2165     break;
2166   case 32:
2167     for(i=0;i<nb_test;i++) {
2168       if(cbcprng)
2169         decrypt_cbc_prng<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2170       if(cbcrm)
2171         decrypt_cbc_rm<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2172       if(ecbrm)
2173         decrypt_ecb_rm<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2174       if(ecbprng)
2175         decrypt_ecb_prng<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2176     }
2177     break;
2178   case 64:
2179     for(i=0;i<nb_test;i++) {
2180       if(cbcprng)
2181         decrypt_cbc_prng<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2182       if(cbcrm)
2183         decrypt_cbc_rm<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2184       if(ecbrm)
2185         decrypt_ecb_rm<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2186       if(ecbprng)
2187         decrypt_ecb_prng<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2188     }
2189     break;
2190   case 128:
2191     for(i=0;i<nb_test;i++) {
2192       if(cbcprng)
2193         decrypt_cbc_prng<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2194       if(cbcrm)
2195         decrypt_cbc_rm<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2196       if(ecbrm)
2197         decrypt_ecb_rm<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2198       if(ecbprng)
2199         decrypt_ecb_prng<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2200     }
2201     break;
2202   case 256:
2203     for(i=0;i<nb_test;i++) {
2204       if(cbcprng)
2205         decrypt_cbc_prng<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2206       if(cbcrm)
2207         decrypt_cbc_rm<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2208       if(ecbrm)
2209         decrypt_ecb_rm<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,IV,0);
2210       if(ecbprng)
2211         decrypt_ecb_prng<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
2212     }
2213     break;
2214   }
2215
2216   time_decrypt+=TimeStop(t);
2217   //cout<<"Time decrypt "
2218   cout<<(double)imsize*nb_test/time_decrypt<<"\t";
2219
2220   if(lena) {
2221     for(int i=0;i<oneD;i++) {
2222       data_R[i]=seq[i];
2223       data_G[i]=seq[oneD+i];
2224       data_B[i]=seq[2*oneD+i];
2225     }
2226     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
2227   }
2228   else {
2229     bool equal=true;
2230     for(int i=0;i<imsize;i++) {
2231       //cout<<(int)buffer[i]<<endl;
2232       if(buffer[i]!=seq[i]) {
2233         equal=false;
2234       }
2235     }
2236 //    cout<<"RESULT CORRECT: "<<equal<<endl;
2237   }
2238   
2239
2240   return 0;
2241 }