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

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