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