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

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