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

Private GIT Repository
37ecfafa29d33844b945b2ed30a8b3bcc1eedad6
[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   for(int a=0;a<h;a+=4) {
921     IV1[a]=RM[h+a];
922     IV1[a+1]=RM[h+a+1];
923     IV1[a+2]=RM[h+a+2];
924     IV1[a+3]=RM[h+a+3];
925   }
926
927   for(int a=0;a<h;a+=4) {
928     IV2[a]=RM[h*h+a];
929     IV2[a+1]=RM[h*h+a+1];
930     IV2[a+2]=RM[h*h+a+2];
931     IV2[a+3]=RM[h*h+a+3];
932
933   }
934  
935
936
937   for(int it=0;it<len/2;it++) {
938     int ind1=Pbox[it]*h;
939     int ind2=Pbox[it+len/2]*h;
940
941     RM1=&RM[PboxSRM[it]*h];
942     RM2=&RM[h*h+PboxSRM[it]*h];
943   
944     for(int a=0;a<h;a+=4) {
945       X[a]=seq_in[ind2+a];
946       X[a+1]=seq_in[ind2+a+1];
947       X[a+2]=seq_in[ind2+a+2];
948       X[a+3]=seq_in[ind2+a+3];
949     }
950
951     for(int a=0;a<h;a+=4) {
952       Y[a]=seq_in[ind1+a];
953       Y[a+1]=seq_in[ind1+a+1];
954       Y[a+2]=seq_in[ind1+a+2];
955       Y[a+3]=seq_in[ind1+a+3];
956     }
957
958
959     for(int a=0;a<h;a+=4) {
960       tmp[a]=X[a]^RM1[a]^IV1[a];
961       tmp[a+1]=X[a+1]^RM1[a+1]^IV1[a+1];
962       tmp[a+2]=X[a+2]^RM1[a+2]^IV1[a+2];
963       tmp[a+3]=X[a+3]^RM1[a+3]^IV1[a+3];
964     }
965
966     for(int a=0;a<h;a+=4) {
967       tmp[a]=Sbox1[tmp[a]];
968       tmp[a+1]=Sbox1[tmp[a+1]];
969       tmp[a+2]=Sbox1[tmp[a+2]];
970       tmp[a+3]=Sbox1[tmp[a+3]];
971     }
972
973     
974     /*for(int a=0;a<h;a+=4) {
975       tmp[a]=Sbox1[X[a]^RM1[a]^IV1[a]];
976       tmp[a+1]=Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]];
977       tmp[a+2]=Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]];
978       tmp[a+3]=Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]];
979       }*/
980
981     for(int a=0;a<h;a+=4) {
982       fX[a]=Sbox2[tmp[a]^Y[a]];
983       fX[a+1]=Sbox2[tmp[a+1]^Y[a+1]];
984       fX[a+2]=Sbox2[tmp[a+2]^Y[a+2]];
985       fX[a+3]=Sbox2[tmp[a+3]^Y[a+3]];
986     }
987
988     /*
989     for(int a=0;a<h;a+=4) {
990       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
991       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
992       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
993       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
994       }*/
995
996
997  for(int a=0;a<h;a+=4) {
998       tmp[a]=fX[a]^Y[a]^IV2[a];
999       tmp[a+1]=fX[a+1]^Y[a+1]^IV2[a+1];
1000       tmp[a+2]=fX[a+2]^Y[a+2]^IV2[a+2];
1001       tmp[a+3]=fX[a+3]^Y[a+3]^IV2[a+3];
1002
1003     }     
1004
1005  for(int a=0;a<h;a+=4) {
1006       tmp[a]=Sbox2[tmp[a]];
1007       tmp[a+1]=Sbox2[tmp[a+1]];
1008       tmp[a+2]=Sbox2[tmp[a+2]];
1009       tmp[a+3]=Sbox2[tmp[a+3]];
1010
1011     }     
1012
1013  /*
1014     for(int a=0;a<h;a+=4) {
1015       tmp[a]=Sbox2[fX[a]^Y[a]^IV2[a]];
1016       tmp[a+1]=Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]];
1017       tmp[a+2]=Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]];
1018       tmp[a+3]=Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]];
1019
1020     }     
1021  */
1022
1023     for(int a=0;a<h;a+=4) {
1024       gY[a]=Sbox1[tmp[a]^RM2[a]];
1025       gY[a+1]=Sbox1[tmp[a+1]^RM2[a+1]];
1026       gY[a+2]=Sbox1[tmp[a+2]^RM2[a+2]];
1027       gY[a+3]=Sbox1[tmp[a+3]^RM2[a+3]];
1028
1029     }     
1030
1031
1032
1033     /*
1034     for(int a=0;a<h;a+=4) {
1035       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
1036       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
1037       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
1038       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
1039
1040     } 
1041     */    
1042
1043     for(int a=0;a<h;a+=4) {
1044       seq_out[ind2+a]=gY[a];
1045       seq_out[ind2+a+1]=gY[a+1];
1046       seq_out[ind2+a+2]=gY[a+2];
1047       seq_out[ind2+a+3]=gY[a+3];
1048     }
1049
1050     for(int a=0;a<h;a+=4) {
1051       seq_out[ind1+a]=fX[a];
1052       seq_out[ind1+a+1]=fX[a+1];
1053       seq_out[ind1+a+2]=fX[a+2];
1054       seq_out[ind1+a+3]=fX[a+3];
1055     }
1056     for(int a=0;a<h;a+=4) {
1057       IV1[a]=fX[a];
1058       IV1[a+1]=fX[a+1];
1059       IV1[a+2]=fX[a+2];
1060       IV1[a+3]=fX[a+3];
1061     }
1062
1063     for(int a=0;a<h;a+=4) {
1064       IV2[a]=gY[a];
1065       IV2[a+1]=gY[a+1];
1066       IV2[a+2]=gY[a+2];
1067       IV2[a+3]=gY[a+3];
1068     }
1069
1070   }
1071   
1072
1073
1074
1075 }
1076
1077
1078
1079
1080
1081
1082
1083
1084 template<int h>
1085 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) {
1086
1087   uchar invfX[h];
1088   uchar invgY[h];
1089   uchar fX[h];
1090   uchar gY[h];
1091   uchar IV1[h];
1092   uchar IV2[h];
1093   uchar *RM1;
1094   uchar *RM2;
1095   uchar tmp[h];
1096
1097  for(int a=0;a<h;a+=4) {
1098     IV1[a]=RM[h+a];
1099     IV1[a+1]=RM[h+a+1];
1100     IV1[a+2]=RM[h+a+2];
1101     IV1[a+3]=RM[h+a+3];
1102   }
1103
1104   for(int a=0;a<h;a+=4) {
1105     IV2[a]=RM[h*h+a];
1106     IV2[a+1]=RM[h*h+a+1];
1107     IV2[a+2]=RM[h*h+a+2];
1108     IV2[a+3]=RM[h*h+a+3];
1109
1110   }
1111
1112
1113   
1114   for(int it=0;it<len/2;it++) {
1115     int ind1=Pbox[it]*h;
1116     int ind2=Pbox[it+len/2]*h;
1117
1118
1119     RM1=&RM[PboxSRM[it]*h];
1120     RM2=&RM[h*h+PboxSRM[it]*h];
1121     
1122
1123     
1124     for(int a=0;a<h;a+=4) {
1125       gY[a]=seq_in[ind2+a];
1126       gY[a+1]=seq_in[ind2+a+1];
1127       gY[a+2]=seq_in[ind2+a+2];
1128       gY[a+3]=seq_in[ind2+a+3];
1129     }
1130
1131     for(int a=0;a<h;a+=4) {
1132       fX[a]=seq_in[ind1+a];
1133       fX[a+1]=seq_in[ind1+a+1];
1134       fX[a+2]=seq_in[ind1+a+2];
1135       fX[a+3]=seq_in[ind1+a+3];
1136     }
1137
1138
1139     for(int a=0;a<h;a+=4) {
1140       tmp[a]=Inv_Sbox1[gY[a]]^RM2[a];
1141       tmp[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
1142       tmp[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
1143       tmp[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
1144     }   
1145
1146
1147     for(int a=0;a<h;a+=4) {
1148       tmp[a]=Inv_Sbox2[tmp[a]];
1149       tmp[a+1]=Inv_Sbox2[tmp[a+1]];
1150       tmp[a+2]=Inv_Sbox2[tmp[a+2]];
1151       tmp[a+3]=Inv_Sbox2[tmp[a+3]];
1152     }   
1153
1154
1155     
1156     for(int a=0;a<h;a+=4) {
1157       invgY[a]=tmp[a]^fX[a]^IV2[a];
1158       invgY[a+1]=tmp[a+1]^fX[a+1]^IV2[a+1];
1159       invgY[a+2]=tmp[a+2]^fX[a+2]^IV2[a+2];
1160       invgY[a+3]=tmp[a+3]^fX[a+3]^IV2[a+3];
1161     }   
1162
1163
1164     for(int a=0;a<h;a+=4) {
1165       tmp[a]=Inv_Sbox2[fX[a]]^invgY[a];
1166       tmp[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1167       tmp[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1168       tmp[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1169
1170     }
1171
1172
1173     for(int a=0;a<h;a+=4) {
1174       tmp[a]=Inv_Sbox1[tmp[a]];
1175       tmp[a+1]=Inv_Sbox1[tmp[a+1]];
1176       tmp[a+2]=Inv_Sbox1[tmp[a+2]];
1177       tmp[a+3]=Inv_Sbox1[tmp[a+3]];
1178
1179     }
1180
1181
1182
1183
1184     for(int a=0;a<h;a+=4) {
1185       invfX[a]=tmp[a]^RM1[a]^IV1[a];
1186       invfX[a+1]=tmp[a+1]^RM1[a+1]^IV1[a+1];
1187       invfX[a+2]=tmp[a+2]^RM1[a+2]^IV1[a+2];
1188       invfX[a+3]=tmp[a+3]^RM1[a+3]^IV1[a+3];
1189
1190     }
1191
1192
1193     for(int a=0;a<h;a+=4) {
1194       seq_out[ind2+a]=invfX[a];
1195       seq_out[ind2+a+1]=invfX[a+1];
1196       seq_out[ind2+a+2]=invfX[a+2];
1197       seq_out[ind2+a+3]=invfX[a+3];
1198     }
1199
1200     for(int a=0;a<h;a+=4) {
1201       seq_out[ind1+a]=invgY[a];
1202       seq_out[ind1+a+1]=invgY[a+1];
1203       seq_out[ind1+a+2]=invgY[a+2];
1204       seq_out[ind1+a+3]=invgY[a+3];
1205     }
1206     for(int a=0;a<h;a+=4) {
1207       IV1[a]=fX[a];
1208       IV1[a+1]=fX[a+1];
1209       IV1[a+2]=fX[a+2];
1210       IV1[a+3]=fX[a+3];
1211     }
1212
1213     for(int a=0;a<h;a+=4) {
1214       IV2[a]=gY[a];
1215       IV2[a+1]=gY[a+1];
1216       IV2[a+2]=gY[a+2];
1217       IV2[a+3]=gY[a+3];
1218     }
1219
1220
1221   }
1222   
1223
1224
1225
1226 }
1227
1228
1229
1230
1231
1232 /*
1233
1234 template<int h>
1235 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) {
1236
1237   uchar X[h];
1238   uchar Y[h];
1239   uchar fX[h];
1240   uchar gY[h];
1241   uchar IV1[h];
1242   uchar IV2[h];
1243   uchar *RM1;
1244   uchar *RM2;
1245
1246   int h2=h*h;
1247
1248
1249
1250   
1251   for(int a=0;a<h;a+=4) {
1252     myrand=xorshift32(myrand);
1253     uint mm=myrand;
1254     IV1[a]=(mm&255);
1255     mm>>=8;
1256     IV1[a+1]=(mm&255);
1257     mm>>=8;
1258     IV1[a+2]=(mm&255);
1259     mm>>=8;
1260     IV1[a+3]=(mm&255);
1261   }
1262
1263   for(int a=0;a<h;a+=4) {
1264     myrand=xorshift32(myrand);
1265     uint mm=myrand;
1266     IV2[a]=(mm&255);
1267     mm>>=8;
1268     IV2[a+1]=(mm&255);
1269     mm>>=8;
1270     IV2[a+2]=(mm&255);
1271     mm>>=8;
1272     IV2[a+3]=(mm&255);
1273
1274   }
1275  
1276
1277   
1278   for(int it=0;it<len/2;it++) {
1279     int ind1=Pbox[it]*h;
1280     int ind2=Pbox[it+len/2]*h;
1281
1282
1283
1284     RM1=&RM[PboxSRM[it]*h];
1285     RM2=&RM[h*h+PboxSRM[it]*h];
1286
1287     
1288     for(int a=0;a<h;a+=4) {
1289       X[a]=seq_in[ind2+a];
1290       X[a+1]=seq_in[ind2+a+1];
1291       X[a+2]=seq_in[ind2+a+2];
1292       X[a+3]=seq_in[ind2+a+3];
1293     }
1294
1295     for(int a=0;a<h;a+=4) {
1296       Y[a]=seq_in[ind1+a];
1297       Y[a+1]=seq_in[ind1+a+1];
1298       Y[a+2]=seq_in[ind1+a+2];
1299       Y[a+3]=seq_in[ind1+a+3];
1300     }
1301
1302
1303     for(int a=0;a<h;a+=4) {
1304       fX[a]=Sbox2[Sbox1[X[a]^RM1[a]^IV1[a]]^Y[a]];
1305       fX[a+1]=Sbox2[Sbox1[X[a+1]^RM1[a+1]^IV1[a+1]]^Y[a+1]];
1306       fX[a+2]=Sbox2[Sbox1[X[a+2]^RM1[a+2]^IV1[a+2]]^Y[a+2]];
1307       fX[a+3]=Sbox2[Sbox1[X[a+3]^RM1[a+3]^IV1[a+3]]^Y[a+3]];
1308     }
1309
1310     for(int a=0;a<h;a+=4) {
1311       gY[a]=Sbox1[Sbox2[fX[a]^Y[a]^IV2[a]]^RM2[a]];
1312       gY[a+1]=Sbox1[Sbox2[fX[a+1]^Y[a+1]^IV2[a+1]]^RM2[a+1]];
1313       gY[a+2]=Sbox1[Sbox2[fX[a+2]^Y[a+2]^IV2[a+2]]^RM2[a+2]];
1314       gY[a+3]=Sbox1[Sbox2[fX[a+3]^Y[a+3]^IV2[a+3]]^RM2[a+3]];
1315
1316     }     
1317
1318     for(int a=0;a<h;a+=4) {
1319       seq_out[ind2+a]=gY[a];
1320       seq_out[ind2+a+1]=gY[a+1];
1321       seq_out[ind2+a+2]=gY[a+2];
1322       seq_out[ind2+a+3]=gY[a+3];
1323     }
1324
1325     for(int a=0;a<h;a+=4) {
1326       seq_out[ind1+a]=fX[a];
1327       seq_out[ind1+a+1]=fX[a+1];
1328       seq_out[ind1+a+2]=fX[a+2];
1329       seq_out[ind1+a+3]=fX[a+3];
1330     }
1331     for(int a=0;a<h;a+=4) {
1332       IV1[a]=fX[a];
1333       IV1[a+1]=fX[a+1];
1334       IV1[a+2]=fX[a+2];
1335       IV1[a+3]=fX[a+3];
1336     }
1337
1338     for(int a=0;a<h;a+=4) {
1339       IV2[a]=gY[a];
1340       IV2[a+1]=gY[a+1];
1341       IV2[a+2]=gY[a+2];
1342       IV2[a+3]=gY[a+3];
1343     }
1344
1345   }
1346   
1347
1348
1349
1350 }
1351
1352
1353
1354
1355
1356
1357
1358
1359 template<int h>
1360 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) {
1361
1362   uchar invfX[h];
1363   uchar invgY[h];
1364   uchar fX[h];
1365   uchar gY[h];
1366   uchar IV1[h];
1367   uchar IV2[h];
1368   uchar *RM1;
1369   uchar *RM2;
1370
1371   for(int a=0;a<h;a+=4) {
1372     myrand=xorshift32(myrand);
1373     uint mm=myrand;
1374     IV1[a]=(mm&255);
1375     mm>>=8;
1376     IV1[a+1]=(mm&255);
1377     mm>>=8;
1378     IV1[a+2]=(mm&255);
1379     mm>>=8;
1380     IV1[a+3]=(mm&255);
1381   }
1382
1383   for(int a=0;a<h;a+=4) {
1384     myrand=xorshift32(myrand);
1385     uint mm=myrand;
1386     IV2[a]=(mm&255);
1387     mm>>=8;
1388     IV2[a+1]=(mm&255);
1389     mm>>=8;
1390     IV2[a+2]=(mm&255);
1391     mm>>=8;
1392     IV2[a+3]=(mm&255);
1393
1394   }
1395
1396   
1397  
1398
1399
1400   
1401   for(int it=0;it<len/2;it++) {
1402     int ind1=Pbox[it]*h;
1403     int ind2=Pbox[it+len/2]*h;
1404
1405
1406     RM1=&RM[PboxSRM[it]*h];
1407     RM2=&RM[h*h+PboxSRM[it]*h];
1408
1409     
1410     for(int a=0;a<h;a+=4) {
1411       gY[a]=seq_in[ind2+a];
1412       gY[a+1]=seq_in[ind2+a+1];
1413       gY[a+2]=seq_in[ind2+a+2];
1414       gY[a+3]=seq_in[ind2+a+3];
1415     }
1416
1417     for(int a=0;a<h;a+=4) {
1418       fX[a]=seq_in[ind1+a];
1419       fX[a+1]=seq_in[ind1+a+1];
1420       fX[a+2]=seq_in[ind1+a+2];
1421       fX[a+3]=seq_in[ind1+a+3];
1422     }
1423
1424
1425     for(int a=0;a<h;a+=4) {
1426       invgY[a]=Inv_Sbox1[gY[a]]^RM2[a];
1427       invgY[a+1]=Inv_Sbox1[gY[a+1]]^RM2[a+1];
1428       invgY[a+2]=Inv_Sbox1[gY[a+2]]^RM2[a+2];
1429       invgY[a+3]=Inv_Sbox1[gY[a+3]]^RM2[a+3];
1430     }   
1431
1432
1433     for(int a=0;a<h;a+=4) {
1434       invgY[a]=Inv_Sbox2[invgY[a]]^fX[a]^IV2[a];
1435       invgY[a+1]=Inv_Sbox2[invgY[a+1]]^fX[a+1]^IV2[a+1];
1436       invgY[a+2]=Inv_Sbox2[invgY[a+2]]^fX[a+2]^IV2[a+2];
1437       invgY[a+3]=Inv_Sbox2[invgY[a+3]]^fX[a+3]^IV2[a+3];
1438     }   
1439
1440
1441     for(int a=0;a<h;a+=4) {
1442       invfX[a]=Inv_Sbox2[fX[a]]^invgY[a];
1443       invfX[a+1]=Inv_Sbox2[fX[a+1]]^invgY[a+1];
1444       invfX[a+2]=Inv_Sbox2[fX[a+2]]^invgY[a+2];
1445       invfX[a+3]=Inv_Sbox2[fX[a+3]]^invgY[a+3];
1446
1447     }
1448
1449     for(int a=0;a<h;a+=4) {
1450       invfX[a]=Inv_Sbox1[invfX[a]]^RM1[a]^IV1[a];
1451       invfX[a+1]=Inv_Sbox1[invfX[a+1]]^RM1[a+1]^IV1[a+1];
1452       invfX[a+2]=Inv_Sbox1[invfX[a+2]]^RM1[a+2]^IV1[a+2];
1453       invfX[a+3]=Inv_Sbox1[invfX[a+3]]^RM1[a+3]^IV1[a+3];
1454
1455     }
1456
1457
1458     for(int a=0;a<h;a+=4) {
1459       seq_out[ind2+a]=invfX[a];
1460       seq_out[ind2+a+1]=invfX[a+1];
1461       seq_out[ind2+a+2]=invfX[a+2];
1462       seq_out[ind2+a+3]=invfX[a+3];
1463     }
1464
1465     for(int a=0;a<h;a+=4) {
1466       seq_out[ind1+a]=invgY[a];
1467       seq_out[ind1+a+1]=invgY[a+1];
1468       seq_out[ind1+a+2]=invgY[a+2];
1469       seq_out[ind1+a+3]=invgY[a+3];
1470     }
1471     for(int a=0;a<h;a+=4) {
1472       IV1[a]=fX[a];
1473       IV1[a+1]=fX[a+1];
1474       IV1[a+2]=fX[a+2];
1475       IV1[a+3]=fX[a+3];
1476     }
1477
1478     for(int a=0;a<h;a+=4) {
1479       IV2[a]=gY[a];
1480       IV2[a+1]=gY[a+1];
1481       IV2[a+2]=gY[a+2];
1482       IV2[a+3]=gY[a+3];
1483     }
1484
1485
1486   }
1487   
1488
1489
1490
1491 }
1492 */
1493
1494
1495
1496 int main(int argc, char** argv) {
1497
1498
1499   int h=32;
1500   int lena=0;
1501   int size_buf=1;
1502
1503
1504   
1505   for(int i=1; i<argc; i++){
1506     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
1507     if(strncmp(argv[i],"cbc",3)==0) cbc=1;       
1508     if(strncmp(argv[i],"cbcprng",7)==0) {cbcprng=1;cbc=0;}
1509     if(strncmp(argv[i],"ecb",3)==0) ecb = 1;
1510     if(strncmp(argv[i],"ecbprng",7)==0) {ecbprng=1; ecb=0;}
1511     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
1512     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
1513     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
1514   }
1515
1516   printf("nb times %d\n",nb_test);
1517   printf("cbc %d\n",cbc);
1518   printf("cbcprng %d\n",cbcprng);
1519   printf("ecb %d\n",ecb);
1520   printf("h %d\n",h);
1521   printf("lena %d\n",lena);
1522   printf("size_buf %d\n",size_buf);
1523
1524   int h2=h*h;
1525   
1526
1527       
1528   int seed=time(NULL);
1529 //  cout<<seed<<endl;
1530   srand48(seed);
1531
1532   uchar Secretkey[key_size];
1533
1534   uchar counter[key_size];
1535
1536   for(int i=0;i<key_size;i++) {
1537     Secretkey[i]=lrand48()&0xFF;
1538     counter[i]=lrand48()&0xFF;
1539   }
1540
1541   
1542   int size = 128;
1543   uchar DK[size];
1544
1545
1546
1547
1548   int width;
1549   int height;
1550
1551   uchar *data_R, *data_G, *data_B;
1552   int imsize;
1553   uchar *buffer;
1554
1555
1556
1557
1558   
1559   if(lena==1) {
1560     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
1561 //    load_RGB_pixmap("8192.ppm", &width, &height, &data_R, &data_G, &data_B);
1562     imsize=width*height*3;
1563 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
1564   }
1565   else {
1566     width=height=size_buf;
1567     imsize=width*height;
1568     buffer=new uchar[imsize];
1569     for(int i=0;i<imsize;i++) {
1570       buffer[i]=lrand48();
1571     }
1572   }
1573
1574
1575
1576   
1577   
1578   uchar* seq= new uchar[imsize];
1579   uchar* seq2= new uchar[imsize];
1580
1581   int oneD=width*height;
1582   if(lena) {
1583     for(int i=0;i<oneD;i++) {
1584       seq[i]=data_R[i];
1585       seq[oneD+i]=data_G[i];
1586       seq[2*oneD+i]=data_B[i];
1587     }
1588   }
1589   else {
1590     for(int i=0;i<oneD;i++) {
1591       seq[i]=buffer[i];
1592     }
1593   }
1594
1595
1596
1597   
1598
1599   int total_len=imsize;
1600   int rp=1;
1601   int len= total_len/h;
1602
1603
1604   
1605   uchar *mix=new uchar[256];
1606
1607
1608
1609     
1610   for (int i = 0; i < 256 ; i++) {
1611     mix[i]=Secretkey[i]^counter[i];
1612     
1613   }
1614   gchar  *sha512;
1615
1616   sha512 = g_compute_checksum_for_string(G_CHECKSUM_SHA512, (const char*) mix, 256);
1617 //  g_print("%s\n", sha512);
1618  
1619
1620
1621
1622
1623
1624
1625
1626   
1627 //  cout<<"hash "<<endl;
1628   for (int i = 0; i < 128 ; i++) {
1629 //    DK[i]=digest[i];
1630     DK[i]=sha512[i];
1631   }
1632   g_free(sha512);
1633
1634
1635   int *Pbox=new int[len];
1636   int *PboxSRM=new int[len/2];
1637   int *PboxSRM2=new int[len/2];
1638   uchar Sbox1[256];
1639   uchar Sbox2[256];  
1640   uchar Inv_Sbox1[256];
1641   uchar Inv_Sbox2[256];
1642   uchar sc[h2*2];  
1643   uchar RM[h2*2];
1644
1645
1646   ulong myrand=0;
1647
1648
1649   double time_encrypt=0;
1650   double time_decrypt=0;
1651   
1652
1653   double t=TimeStart();  
1654   rc4key(DK, Sbox1, 8);
1655   
1656   
1657   rc4key(&DK[8], Sbox2, 8);
1658   
1659   rc4key(&DK[16], sc, 16);
1660   prga(sc, h2*2, RM);
1661
1662
1663
1664
1665   
1666   rc4keyperm(&DK[72], len, rp, Pbox, 16);
1667   
1668   
1669   rc4keyperm(&DK[88], len/2, rp, PboxSRM2, 16);
1670
1671   for(int i=0;i<len/2;i++) {
1672     PboxSRM[i]=PboxSRM2[i]&(h-1);
1673   }
1674
1675 /*
1676   for(int i=0;i<h*2;i++) {
1677     for(int j=0;j<h;j++)
1678       cout<<(int)RM[i*h+j]<<" ";
1679     cout<<endl;
1680   }
1681 */
1682
1683
1684   
1685   //time+=TimeStop(t);
1686   //cout<<"Time initializaton "<<time<<endl;
1687
1688
1689
1690   myrand=0;
1691   for(int i=0;i<64;i++) {
1692     myrand|=DK[i]&1;
1693     myrand<<=1;
1694   }
1695
1696  
1697
1698
1699
1700   
1701   
1702   inverse_tables(Sbox1,256,Inv_Sbox1);
1703   inverse_tables(Sbox2,256,Inv_Sbox2);
1704
1705
1706
1707   lehmer64_seed(myrand);
1708   time_encrypt=0;
1709   t=TimeStart();
1710
1711   int i;
1712   switch(h) {
1713   case 4: 
1714     for(i=0;i<nb_test;i++)
1715     {
1716       if(cbcprng)
1717         encrypt_cbc_prng<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1718       if(cbc)
1719         encrypt_cbc_rm<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1720       if(ecb)
1721         encrypt_ecb<4>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1722     }
1723     break;
1724   case 8: 
1725     for(i=0;i<nb_test;i++)
1726     {
1727       if(cbcprng)
1728         encrypt_cbc_prng<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1729       if(cbc)
1730         encrypt_cbc_rm<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1731       if(ecb)
1732         encrypt_ecb<8>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1733     }
1734     break;
1735   case 16: 
1736     for(i=0;i<nb_test;i++)
1737     {
1738       if(cbcprng)
1739         encrypt_cbc_prng<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1740       if(cbc)
1741         encrypt_cbc_rm<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1742       if(ecb)
1743         encrypt_ecb<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1744     }
1745     break;
1746   case 32: 
1747     for(i=0;i<nb_test;i++)
1748     {
1749       if(cbcprng)
1750         encrypt_cbc_prng<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1751       if(cbc)
1752         encrypt_cbc_rm<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1753       if(ecb)
1754         encrypt_ecb<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1755     }
1756     break;
1757   case 64: 
1758     for(i=0;i<nb_test;i++)
1759     {
1760       if(cbcprng)
1761         encrypt_cbc_prng<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1762       if(cbc)
1763         encrypt_cbc_rm<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1764       if(ecb)
1765         encrypt_ecb<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1766       
1767     }
1768     break;
1769   case 128: 
1770     for(i=0;i<nb_test;i++)
1771     {
1772       if(cbcprng)
1773         encrypt_cbc_prng<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1774       if(cbc)
1775         encrypt_cbc_rm<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1776       if(ecb)
1777         encrypt_ecb<128>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1778       
1779     }
1780     break;
1781   case 256: 
1782     for(i=0;i<nb_test;i++)
1783     {
1784       if(cbcprng)
1785         encrypt_cbc_prng<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1786       if(cbc)
1787         encrypt_cbc_rm<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1788       if(ecb)
1789         encrypt_ecb<256>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,myrand,0);
1790       
1791     }
1792     break;
1793   }
1794   time_encrypt+=TimeStop(t);
1795   //cout<<"Time encrypt "<<
1796   cout<<(double)imsize*nb_test/time_encrypt<<"\t";
1797
1798
1799   if(lena) {
1800     for(int i=0;i<oneD;i++) {
1801       data_R[i]=seq2[i];
1802       data_G[i]=seq2[oneD+i];
1803       data_B[i]=seq2[2*oneD+i];
1804     }
1805     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
1806   }
1807
1808   
1809   lehmer64_seed(myrand);
1810   time_decrypt=0;
1811   t=TimeStart();
1812   switch(h) {
1813   case 4:
1814     for(i=0;i<nb_test;i++) {
1815       if(cbcprng)
1816         decrypt_cbc_prng<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1817       if(cbc)
1818         decrypt_cbc_rm<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1819       if(ecb)
1820         decrypt_ecb<4>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1821     }
1822     break;
1823   case 8:
1824     for(i=0;i<nb_test;i++) {
1825       if(cbcprng)
1826         decrypt_cbc_prng<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1827       if(cbc)
1828         decrypt_cbc_rm<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1829       if(ecb)
1830         decrypt_ecb<8>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1831     }
1832     break;
1833   case 16:
1834     for(i=0;i<nb_test;i++) {
1835       if(cbcprng)
1836         decrypt_cbc_prng<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1837       if(cbc)
1838         decrypt_cbc_rm<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1839       if(ecb)
1840         decrypt_ecb<16>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1841     }
1842     break;
1843   case 32:
1844     for(i=0;i<nb_test;i++) {
1845       if(cbc)
1846         decrypt_cbc_prng<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1847       else
1848         decrypt_ecb<32>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1849     }
1850     break;
1851   case 64:
1852     for(i=0;i<nb_test;i++) {
1853       if(cbcprng)
1854         decrypt_cbc_prng<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1855       if(cbc)
1856         decrypt_cbc_rm<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1857       if(ecb)
1858         decrypt_ecb<64>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1859     }
1860     break;
1861   case 128:
1862     for(i=0;i<nb_test;i++) {
1863       if(cbcprng)
1864         decrypt_cbc_prng<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1865       if(cbc)
1866         decrypt_cbc_rm<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1867       if(ecb)
1868         decrypt_ecb<128>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1869     }
1870     break;
1871   case 256:
1872     for(i=0;i<nb_test;i++) {
1873       if(cbcprng)
1874         decrypt_cbc_prng<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1875       if(cbc)
1876         decrypt_cbc_rm<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1877       if(ecb)
1878         decrypt_ecb<256>(seq2,seq,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
1879     }
1880     break;
1881   }
1882
1883   time_decrypt+=TimeStop(t);
1884   //cout<<"Time decrypt "
1885   cout<<(double)imsize*nb_test/time_decrypt<<"\t";
1886
1887   if(lena) {
1888     for(int i=0;i<oneD;i++) {
1889       data_R[i]=seq[i];
1890       data_G[i]=seq[oneD+i];
1891       data_B[i]=seq[2*oneD+i];
1892     }
1893     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
1894   }
1895   else {
1896     bool equal=true;
1897     for(int i=0;i<imsize;i++) {
1898       //cout<<(int)buffer[i]<<endl;
1899       if(buffer[i]!=seq[i]) {
1900         equal=false;
1901       }
1902     }
1903 //    cout<<"RESULT CORRECT: "<<equal<<endl;
1904   }
1905   
1906
1907
1908   return 0;
1909 }