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

Private GIT Repository
update of enhance one round
[Cipher_code.git] / OneRoundIoT / OneRound / one_round_new.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 ctr=0;
35
36
37
38
39
40
41
42 typedef unsigned char   uchar;
43
44
45 double TimeStart()
46 {
47   struct timeval tstart;
48   gettimeofday(&tstart,0);
49   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
50 }
51
52 double TimeStop(double t)
53 {
54   struct timeval tend;
55
56   gettimeofday(&tend,0);
57   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
58   return (t);
59 }
60
61
62
63
64 uint xorshift32(const uint t)
65 {
66   /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
67   uint x = t;
68   x ^= x << 13;
69   x ^= x >> 17;
70   x ^= x << 5;
71   return x;
72 }
73
74
75
76 void inverse_tables(uchar *tab, int size_tab,uchar *inv_perm_tabs) {
77
78   for(int i=0;i<size_tab;i++) {
79     inv_perm_tabs[tab[i]] = i;
80   }
81
82 }
83
84 void inverse_tables_int(int *tab, int size_tab,int *inv_perm_tabs) {
85
86   for(int i=0;i<size_tab;i++) {
87     inv_perm_tabs[tab[i]] = i;
88   }
89
90 }
91
92
93
94 void rc4key(uchar *key, uchar *sc, int size_DK) {
95
96   for(int i=0;i<256;i++) {
97     sc[i]=i;
98   }
99
100
101   uchar j0 = 0;
102   for(int i0=0; i0<256; i0++) {
103     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
104     uchar tmp = sc[i0];
105     sc[i0] = sc[j0 ];
106     sc[j0] = tmp;
107   }
108 }
109
110
111
112 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
113
114   //sc=1:len;
115
116
117   
118   for (int i=0;i<len;i++) {
119     sc[i]=i;
120   }
121   for (int it = 0; it < rp; it++) {
122     int j0 = 1;
123     for(int i0 = 0; i0<len; i0++) {
124       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
125       int tmp = sc[i0];
126       sc[i0] = sc[j0];
127       sc[j0] = tmp;
128     }
129
130   }
131 }
132
133 void prga(uchar *sc, int ldata, uchar *r) {
134   uchar i0=0;
135   uchar j0=0;
136
137   for (int it=0; it<ldata; it++) {
138     i0 = ((i0+1)%255);
139     j0 = (j0 + sc[i0])&0xFF;
140     uchar tmp = sc[i0];
141     sc[i0] = sc[j0];
142     sc[j0] = tmp;
143     r[it]=sc[(sc[i0]+sc[j0])&0xFF];
144   }
145 }
146
147
148
149
150
151 template<int h2>
152 void encrypt_ctr(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, uint myrand,int enc) {
153
154   
155   uchar X[h2];
156   uchar fX[h2];
157
158   int ind1,ind2;
159
160   
161
162   for(int a=0;a<h2;a+=4) {
163     myrand=xorshift32(myrand);
164     uint mm=myrand;
165     
166     X[a]=Sbox2[mm&255];
167     mm>>=8;
168     X[a+1]=Sbox1[mm&255];
169     mm>>=8;
170     X[a+2]=Sbox2[mm&255];
171     mm>>=8;
172     X[a+3]=Sbox1[mm&255];
173   }
174
175
176   for(int it=0;it<len;it++) {
177     if(enc) {
178       ind1=it*h2;
179       ind2=Pbox[it]*h2;
180     }
181     else {
182       ind2=it*h2;
183       ind1=Pbox[it]*h2;
184     }
185
186
187     for(int a=0;a<h2;a+=4) {
188
189       myrand=xorshift32(myrand);
190       uint mm=myrand;
191
192       X[a]=X[a]^(mm&255);
193       mm>>=8;
194       X[a+1]=X[a+1]^(mm&255);
195       mm>>=8;
196       X[a+2]=X[a+2]^(mm&255);
197       mm>>=8;
198       X[a+3]=X[a+3]^(mm&255);
199     }
200
201
202
203
204     
205     for(int a=0;a<h2;a+=4) {
206       X[a]=Sbox1[X[a]];
207       X[a+1]=Sbox2[X[a+1]];
208       X[a+2]=Sbox1[X[a+2]];
209       X[a+3]=Sbox2[X[a+3]];
210     }
211
212     for(int a=0;a<h2;a+=4) {
213       X[a]=X[a]^RM1[a];
214       X[a+1]=X[a+1]^RM1[a+1];
215       X[a+2]=X[a+2]^RM1[a+2];
216       X[a+3]=X[a+3]^RM1[a+3];
217     }
218
219     for(int a=0;a<h2;a+=4) {
220       fX[a]=X[a]^seq_in[ind2+a];
221       fX[a+1]=X[a+1]^seq_in[ind2+a+1];
222       fX[a+2]=X[a+2]^seq_in[ind2+a+2];
223       fX[a+3]=X[a+3]^seq_in[ind2+a+3];
224
225     }
226
227
228     for(int a=0;a<h2;a+=4) {
229       seq_out[ind1+a]=fX[a];
230       seq_out[ind1+a+1]=fX[a+1];
231       seq_out[ind1+a+2]=fX[a+2];
232       seq_out[ind1+a+3]=fX[a+3];
233     }
234
235     for(int a=0;a<h2;a+=4) {
236       RM1[a]=RM1[PboxRM[a]];
237       RM1[a+1]=RM1[PboxRM[a+1]];
238       RM1[a+2]=RM1[PboxRM[a+2]];
239       RM1[a+3]=RM1[PboxRM[a+3]];
240     }
241
242
243
244   }
245
246
247 }
248
249
250 template<int h2>
251 void encrypt(uchar* seq_in, uchar *seq_out, int len,uchar* RM1, int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, uint myrand, int debug) {
252
253   uchar X[h2];
254   uchar fX[h2];
255
256
257   for(int it=0;it<len;it++) {
258     int ind1=it*h2;
259     int ind2=Pbox[it]*h2;
260
261     for(int a=0;a<h2;a+=4) {
262       myrand=xorshift32(myrand);
263
264       uint mm=myrand;
265       X[a]=seq_in[ind2+a]^(mm&255);
266       mm>>=8;
267       X[a+1]=seq_in[ind2+a+1]^(mm&255);
268       mm>>=8;
269       X[a+2]=seq_in[ind2+a+2]^(mm&255);
270       mm>>=8;
271       X[a+3]=seq_in[ind2+a+3]^(mm&255);
272     }
273
274     for(int a=0;a<h2;a+=4){
275       fX[a]=Sbox1[X[a]];
276       fX[a+1]=Sbox2[X[a+1]];
277       fX[a+2]=Sbox1[X[a+2]];
278       fX[a+3]=Sbox2[X[a+3]];
279     }
280
281
282     for(int a=0;a<h2;a+=4) {
283       fX[a]=fX[a]^RM1[a];
284       fX[a+1]=fX[a+1]^RM1[a+1];
285       fX[a+2]=fX[a+2]^RM1[a+2];
286       fX[a+3]=fX[a+3]^RM1[a+3];
287     }
288
289
290     for(int a=0;a<h2;a+=4) {
291       seq_out[ind1+a]=Sbox2[fX[a]];
292       seq_out[ind1+a+1]=Sbox1[fX[a+1]];
293       seq_out[ind1+a+2]=Sbox2[fX[a+2]];
294       seq_out[ind1+a+3]=Sbox1[fX[a+3]];
295     }
296
297     for(int a=0;a<h2;a+=4) {
298       RM1[a]=Sbox1[RM1[PboxRM[a]]];
299       RM1[a+1]=Sbox2[RM1[PboxRM[a+1]]];
300       RM1[a+2]=Sbox1[RM1[PboxRM[a+2]]];
301       RM1[a+3]=Sbox2[RM1[PboxRM[a+3]]];
302
303     }
304
305
306   }
307
308
309   
310
311
312
313 }
314
315
316
317
318
319
320
321
322 template<int h2>
323 void decrypt(uchar* seq_in, uchar *seq_out, int len, uchar* RM1, int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, uchar *Inv_Sbox1, uchar *Inv_Sbox2,  uint myrand, int debug) {
324
325
326
327  uchar fX[h2];
328
329
330
331   for(int it=0;it<len;it++) {
332
333     int ind1=it*h2;
334     int ind2=Pbox[it]*h2;
335
336
337
338
339     for(int a=0;a<h2;a+=4) {
340       fX[a]=seq_in[ind1+a];
341       fX[a+1]=seq_in[ind1+a+1];
342       fX[a+2]=seq_in[ind1+a+2];
343       fX[a+3]=seq_in[ind1+a+3];
344
345     }
346     for(int a=0;a<h2;a+=4) {
347       fX[a]=Inv_Sbox2[fX[a]];
348       fX[a+1]=Inv_Sbox1[fX[a+1]];
349       fX[a+2]=Inv_Sbox2[fX[a+2]];
350       fX[a+3]=Inv_Sbox1[fX[a+3]];
351     }
352     for(int a=0;a<h2;a+=4) {
353       fX[a]=fX[a]^RM1[a];
354       fX[a+1]=fX[a+1]^RM1[a+1];
355       fX[a+2]=fX[a+2]^RM1[a+2];
356       fX[a+3]=fX[a+3]^RM1[a+3];
357     }
358
359
360     for(int a=0;a<h2;a+=4) {
361       RM1[a]=Sbox1[RM1[PboxRM[a]]];
362       RM1[a+1]=Sbox2[RM1[PboxRM[a+1]]];
363       RM1[a+2]=Sbox1[RM1[PboxRM[a+2]]];
364       RM1[a+3]=Sbox2[RM1[PboxRM[a+3]]];
365     }
366
367
368     for(int a=0;a<h2;a+=4) {
369       myrand=xorshift32(myrand);
370
371       uint mm=myrand;
372       seq_out[ind2+a]=Inv_Sbox1[fX[a]]^(mm&255);
373       mm>>=8;
374       seq_out[ind2+a+1]=Inv_Sbox2[fX[a+1]]^(mm&255);
375       mm>>=8;
376       seq_out[ind2+a+2]=Inv_Sbox1[fX[a+2]]^(mm&255);
377       mm>>=8;
378       seq_out[ind2+a+3]=Inv_Sbox2[fX[a+3]]^(mm&255);
379     }
380
381
382   }
383
384
385
386 }
387
388
389 int main(int argc, char** argv) {
390
391
392   int h=32;
393   int lena=0;
394   int size_buf=1;
395
396
397   
398   for(int i=1; i<argc; i++){
399     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
400     if(strncmp(argv[i],"ctr",3)==0) ctr = atoi(&(argv[i][3]));          //CTR ? 1  otherwise CBC like
401     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
402     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
403     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
404   }
405
406 /*  printf("nb times %d\n",nb_test);
407   printf("ctr %d\n",ctr);
408   printf("h %d\n",h);
409   printf("lena %d\n",lena);
410   printf("size_buf %d\n",size_buf);
411 */
412   int h2=h*h;
413   
414
415       
416   int seed=time(NULL);
417 //  cout<<seed<<endl;
418   srand48(seed);
419
420   uchar Secretkey[key_size];
421
422   uchar counter[key_size];
423
424   for(int i=0;i<key_size;i++) {
425     Secretkey[i]=lrand48()&0xFF;
426     counter[i]=lrand48()&0xFF;
427   }
428
429   
430   int size = 64;
431   uchar DK[size];
432
433
434
435
436   int width;
437   int height;
438
439   uchar *data_R, *data_G, *data_B;
440   int imsize;
441   uchar *buffer;
442
443
444
445
446   
447   if(lena==1) {
448     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
449 //    load_RGB_pixmap("8192.ppm", &width, &height, &data_R, &data_G, &data_B);
450     imsize=width*height*3;
451 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
452   }
453   else {
454     width=height=size_buf;
455     imsize=width*height;
456     buffer=new uchar[imsize];
457     for(int i=0;i<imsize;i++) {
458       buffer[i]=lrand48();
459     }
460   }
461
462
463
464   
465   
466   uchar* seq= new uchar[imsize];
467   uchar* seq2= new uchar[imsize];
468
469   int oneD=width*height;
470   if(lena) {
471     for(int i=0;i<oneD;i++) {
472       seq[i]=data_R[i];
473       seq[oneD+i]=data_G[i];
474       seq[2*oneD+i]=data_B[i];
475     }
476   }
477   else {
478     for(int i=0;i<oneD;i++) {
479       seq[i]=buffer[i];
480     }
481   }
482
483
484
485   
486
487   int total_len=imsize;
488   int rp=1;
489   int len= total_len/h2;
490
491
492   
493   uchar *mix=new uchar[256];
494
495
496
497     
498   for (int i = 0; i < 256 ; i++) {
499     mix[i]=Secretkey[i]^counter[i];
500     
501   }
502   gchar  *sha512;
503
504   sha512 = g_compute_checksum_for_string(G_CHECKSUM_SHA512, (const char*) mix, 256);
505 //  g_print("%s\n", sha512);
506  
507
508
509
510
511
512
513
514   
515 //  cout<<"hash "<<endl;
516   for (int i = 0; i < 64 ; i++) {
517 //    DK[i]=digest[i];
518     DK[i]=sha512[i];
519   }
520   g_free(sha512);
521
522
523   int *Pbox=new int[len];
524   int *PboxRM=new int[h2];
525   uchar Sbox1[256];
526   uchar Sbox2[256];  
527   uchar Inv_Sbox1[256];
528   uchar Inv_Sbox2[256];
529   uchar sc[256];  
530   uchar RM1[h2];
531   uchar RM1_copy[h2];
532   uchar RMtmp[h2];
533
534
535   uint myrand=0;
536
537
538   double time_encrypt=0;
539   double time_decrypt=0;
540   
541
542   double t=TimeStart();  
543   rc4key(DK, Sbox1, 8);
544   
545   
546   rc4key(&DK[8], Sbox2, 8);
547   
548   rc4key(&DK[16], sc, 16);
549   
550   
551   prga(sc, h2, RM1);
552   
553   
554   rc4keyperm(&DK[32], len, rp, Pbox, 16);
555   
556   
557   rc4keyperm(&DK[48], h2, rp, PboxRM, 16);
558   
559   //time+=TimeStop(t);
560   //cout<<"Time initializaton "<<time<<endl;
561
562
563
564   myrand=0;
565   for(int i=0;i<32;i++) {
566     myrand|=DK[i]&1;
567     myrand<<=1;
568   }
569   uint myrand_copy=myrand;
570
571  
572
573
574
575   
576   for(int i=0;i<h2;i++){
577     RM1_copy[i]=RM1[i];
578   }
579
580   
581   inverse_tables(Sbox1,256,Inv_Sbox1);
582   inverse_tables(Sbox2,256,Inv_Sbox2);
583
584
585
586
587   
588   time_encrypt=0;
589   t=TimeStart();
590
591   int i;
592   switch(h) {
593   case 4: 
594     for(i=0;i<nb_test;i++)
595     {
596       if(ctr)
597         encrypt_ctr<4*4>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,1);
598       else
599         encrypt<4*4>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
600       
601     }
602     break;
603   case 8: 
604     for(i=0;i<nb_test;i++)
605     {
606       if(ctr)
607         encrypt_ctr<8*8>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,1);
608       else
609         encrypt<8*8>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
610       
611     }
612     break;
613   case 16: 
614     for(i=0;i<nb_test;i++)
615     {
616       if(ctr)
617         encrypt_ctr<16*16>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,1);
618       else
619         encrypt<16*16>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
620       
621     }
622     break;
623   case 32: 
624     for(i=0;i<nb_test;i++)
625     {
626       if(ctr)
627         encrypt_ctr<32*32>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,1);
628       else
629         encrypt<32*32>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
630       
631     }
632     break;
633   case 64: 
634     for(i=0;i<nb_test;i++)
635     {
636       if(ctr)
637         encrypt_ctr<64*64>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,1);
638       else
639         encrypt<64*64>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
640       
641     }
642     break;
643   case 128: 
644     for(i=0;i<nb_test;i++)
645     {
646       if(ctr)
647         encrypt_ctr<128*128>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,1);
648       else
649         encrypt<128*128>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
650       
651     }
652     break;
653   }
654   time_encrypt+=TimeStop(t);
655   //cout<<"Time encrypt "<<
656   cout<<(double)imsize*nb_test/time_encrypt<<"\t";
657
658
659   if(lena) {
660     for(int i=0;i<oneD;i++) {
661       data_R[i]=seq2[i];
662       data_G[i]=seq2[oneD+i];
663       data_B[i]=seq2[2*oneD+i];
664     }
665     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
666   }
667   
668
669   time_decrypt=0;
670   t=TimeStart();
671   switch(h) {
672   case 4:
673     for(i=0;i<nb_test;i++) {
674       if(ctr)
675         encrypt_ctr<4*4>(seq2, seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
676       else
677         decrypt<4*4>(seq2,seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
678     }
679     break;
680   case 8:
681     for(i=0;i<nb_test;i++) {
682       if(ctr)
683         encrypt_ctr<8*8>(seq2, seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
684       else
685         decrypt<8*8>(seq2,seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
686     }
687     break;
688   case 16:
689     for(i=0;i<nb_test;i++) {
690       if(ctr)
691         encrypt_ctr<16*16>(seq2, seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
692       else
693         decrypt<16*16>(seq2,seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
694     }
695     break;
696   case 32:
697     for(i=0;i<nb_test;i++) {
698       if(ctr)
699         encrypt_ctr<32*32>(seq2, seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
700       else
701         decrypt<32*32>(seq2,seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
702     }
703     break;
704   case 64:
705     for(i=0;i<nb_test;i++) {
706       if(ctr)
707         encrypt_ctr<64*64>(seq2, seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
708       else
709         decrypt<64*64>(seq2,seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
710     }
711     break;
712   case 128:
713     for(i=0;i<nb_test;i++) {
714       if(ctr)
715         encrypt_ctr<128*128>(seq2, seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,myrand,0);
716       else
717         decrypt<128*128>(seq2,seq,len,RM1_copy,Pbox,PboxRM,Sbox1,Sbox2,Inv_Sbox1,Inv_Sbox2,myrand,0);
718     }
719     break;
720   }
721
722   time_decrypt+=TimeStop(t);
723   //cout<<"Time decrypt "
724   cout<<(double)imsize*nb_test/time_decrypt<<"\t";
725
726   if(lena) {
727     for(int i=0;i<oneD;i++) {
728       data_R[i]=seq[i];
729       data_G[i]=seq[oneD+i];
730       data_B[i]=seq[2*oneD+i];
731     }
732     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
733   }
734   else {
735     bool equal=true;
736     for(int i=0;i<imsize;i++) {
737       //cout<<(int)buffer[i]<<endl;
738       if(buffer[i]!=seq[i]) {
739         equal=false;
740       }
741     }
742 //    cout<<"RESULT CORRECT: "<<equal<<endl;
743   }
744   
745
746
747   return 0;
748 }