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

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