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

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