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

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