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

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