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