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

Private GIT Repository
,ew
[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
13 /*#include <cryptopp/hex.h>
14 #include <cryptopp/sha.h>
15 #include <cryptopp/osrng.h>
16 #include <cryptopp/secblock.h>
17 */
18
19
20 extern "C" {
21   int load_RGB_pixmap(char *filename, int *width, int *height, unsigned char**R_data, unsigned char**G_data, unsigned char**B_data);
22   void store_RGB_pixmap(char *filename, unsigned char *R_data, unsigned char *G_data, unsigned char *B_data, int width, int height);
23 }
24
25
26 //using namespace CryptoPP;
27 using namespace std;
28
29
30 int key_size=256;
31 int nb_test=1;
32 int ctr=0;
33
34 const int h=16;
35 const int h2=h*h;
36
37
38
39 typedef unsigned char   uchar;
40
41
42 double TimeStart()
43 {
44   struct timeval tstart;
45   gettimeofday(&tstart,0);
46   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
47 }
48
49 double TimeStop(double t)
50 {
51   struct timeval tend;
52
53   gettimeofday(&tend,0);
54   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
55   return (t);
56 }
57
58
59
60
61
62
63 void inverse_tables(uchar *tab, int size_tab,uchar *inv_perm_tabs) {
64
65   for(int i=0;i<size_tab;i++) {
66     inv_perm_tabs[tab[i]] = i;
67   }
68
69 }
70
71 void inverse_tables_int(int *tab, int size_tab,int *inv_perm_tabs) {
72
73   for(int i=0;i<size_tab;i++) {
74     inv_perm_tabs[tab[i]] = i;
75   }
76
77 }
78
79
80
81 void rc4key(uchar *key, uchar *sc, int size_DK) {
82
83   for(int i=0;i<256;i++) {
84     sc[i]=i;
85   }
86
87
88   uchar j0 = 0;
89   for(int i0=0; i0<256; i0++) {
90     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
91     uchar tmp = sc[i0];
92     sc[i0] = sc[j0 ];
93     sc[j0] = tmp;
94   }
95 }
96
97
98
99 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
100
101   //sc=1:len;
102
103
104   
105   for (int i=0;i<len;i++) {
106     sc[i]=i;
107   }
108   for (int it = 0; it < rp; it++) {
109     int j0 = 1;
110     for(int i0 = 0; i0<len; i0++) {
111       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
112       int tmp = sc[i0];
113       sc[i0] = sc[j0];
114       sc[j0] = tmp;
115     }
116
117   }
118 }
119
120 void prga(uchar *sc, int ldata, uchar *r) {
121   uchar i0=0;
122   uchar j0=0;
123
124   for (int it=0; it<ldata; it++) {
125     i0 = ((i0+1)%255);
126     j0 = (j0 + sc[i0])&0xFF;
127     uchar tmp = sc[i0];
128     sc[i0] = sc[j0];
129     sc[j0] = tmp;
130     r[it]=sc[(sc[i0]+sc[j0])&0xFF];
131   }
132 }
133
134
135
136
137
138 void encrypt_ctr(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, int enc) {
139
140
141   uchar *X=new uchar[h2];
142   uchar *fX=new uchar[h2];
143   int ind1,ind2;
144
145
146    for(int a=0;a<h2;a++) {
147      X[a]=Sbox1[a];
148    }
149
150    
151   for(int it=0;it<len;it++) {
152     if(enc) {
153       ind1=it*h2;
154       ind2=Pbox[it]*h2;
155     }
156     else {
157       ind2=it*h2;
158       ind1=Pbox[it]*h2;
159     }
160        
161
162
163     for(int a=0;a<h2;a++){
164       fX[a]=Sbox1[RM1[X[a]]];
165     }
166     
167
168     for(int a=0;a<h2;a++) {
169       fX[a]=fX[a]^RM1[a];
170     }
171
172  
173     for(int a=0;a<h2;a++) {
174       fX[a]=Sbox2[fX[a]];
175     }
176     
177  
178     for(int a=0;a<h2;a++) {
179       seq_out[ind1+a]=fX[a]^seq_in[ind2+a];
180     }
181     
182     for(int a=0;a<h2;a++) {
183       RM1[a]=RM1[PboxRM[a]];
184     }
185
186
187     
188   }
189
190
191 }
192
193
194
195 void encrypt(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, int debug) {
196
197
198   uchar *X=new uchar[h2];
199   uchar *fX=new uchar[h2];
200   unsigned int *lX=(unsigned int*)X;
201   unsigned int *lseq_in=(unsigned int*)seq_in;
202
203
204   for(int it=0;it<len;it++) {
205     int ind1=it*h2;
206     int ind2=Pbox[it]*h2;
207
208     for(int a=0;a<h2;a+=1) {
209       X[a]=seq_in[ind2+a];
210 /*      X[a+1]=seq_in[ind2+a+1];
211       X[a+2]=seq_in[ind2+a+2];
212       X[a+3]=seq_in[ind2+a+3];
213       /*      X[a+4]=seq_in[ind2+a+4];                                                                                                                                    
214       X[a+5]=seq_in[ind2+a+5];                                                                                                                                            
215       X[a+6]=seq_in[ind2+a+6];                                                                                                                                            
216       X[a+7]=seq_in[ind2+a+7];*/
217     }
218
219     for(int a=0;a<h2;a+=1){
220       fX[a]=Sbox1[X[a]];
221 /*      fX[a+1]=Sbox1[X[a+1]];
222       fX[a+2]=Sbox1[X[a+2]];
223       fX[a+3]=Sbox1[X[a+3]];
224       /*      fX[a+4]=Sbox1[X[a+4]];                                                                                                                                      
225       fX[a+5]=Sbox1[X[a+5]];                                                                                                                                              
226       fX[a+6]=Sbox1[X[a+6]];                                                                                                                                              
227       fX[a+7]=Sbox1[X[a+7]];*/
228     }
229
230
231     for(int a=0;a<h2;a+=1) {
232       fX[a]=fX[a]^RM1[a];
233 /*      fX[a+1]=fX[a+1]^RM1[a+1];
234       fX[a+2]=fX[a+2]^RM1[a+2];
235       fX[a+3]=fX[a+3]^RM1[a+3];
236       /*      fX[a+4]=fX[a+4]^RM1[a+4];                                                                                                                                   
237       fX[a+5]=fX[a+5]^RM1[a+5];                                                                                                                                           
238       fX[a+6]=fX[a+6]^RM1[a+6];                                                                                                                                           
239       fX[a+7]=fX[a+7]^RM1[a+7];*/
240     }
241
242
243     for(int a=0;a<h2;a+=1) {
244       seq_out[ind1+a]=Sbox2[fX[a]];
245 /*      seq_out[ind1+a+1]=Sbox2[fX[a+1]];
246       seq_out[ind1+a+2]=Sbox2[fX[a+2]];
247       seq_out[ind1+a+3]=Sbox2[fX[a+3]];
248       /*      seq_out[ind1+a+4]=Sbox2[fX[a+4]];                                                                                                                           
249       seq_out[ind1+a+5]=Sbox2[fX[a+5]];                                                                                                                                   
250       seq_out[ind1+a+6]=Sbox2[fX[a+6]];                                                                                                                                   
251       seq_out[ind1+a+7]=Sbox2[fX[a+7]];*/
252     }
253
254     for(int a=0;a<h2;a+=1) {
255       RM1[a]=RM1[PboxRM[a]];
256 /*      RM1[a+1]=RM1[PboxRM[a+1]];
257       RM1[a+2]=RM1[PboxRM[a+2]];
258       RM1[a+3]=RM1[PboxRM[a+3]];
259       /*      RM1[a+4]=RM1[PboxRM[a+4]];                                                                                                                                  
260       RM1[a+5]=RM1[PboxRM[a+5]];                                                                                                                                          
261       RM1[a+6]=RM1[PboxRM[a+6]];                                                                                                                                          
262       RM1[a+7]=RM1[PboxRM[a+7]];*/
263     }
264
265
266   }
267
268
269
270
271 }
272
273
274
275 void decrypt(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, int debug) {
276
277
278   uchar *fX=new uchar[h2];
279
280
281   uchar *Inv_Sbox1=new uchar[256];
282   inverse_tables(Sbox1,256,Inv_Sbox1);
283
284   uchar *Inv_Sbox2=new uchar[256];
285   inverse_tables(Sbox2,256,Inv_Sbox2);
286   
287
288
289
290   for(int it=0;it<len;it++) {
291
292     int ind1=it*h2;
293     int ind2=Pbox[it]*h2;
294
295
296
297
298     for(int a=0;a<h2;a++) {
299       fX[a]=seq_in[ind1+a];
300     }
301     for(int a=0;a<h2;a++) {
302       fX[a]=Inv_Sbox2[fX[a]];
303     }
304     for(int a=0;a<h2;a++) {
305       fX[a]=fX[a]^RM1[a];
306     }
307
308     for(int a=0;a<h2;a++) {
309       RM1[a]=RM1[PboxRM[a]];
310     }
311     
312     for(int a=0;a<h2;a++) {
313       seq_out[ind2+a]=Inv_Sbox1[fX[a]];
314     }
315
316      
317   }
318
319
320 }
321
322
323 int main(int argc, char** argv) {
324
325
326   for(int i=1; i<argc; i++){
327     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
328     if(strncmp(argv[i],"ctr",3)==0) ctr = atoi(&(argv[i][3]));          //CTR ? 1  otherwise CBC like
329   }
330
331   printf("nb times %d\n",nb_test);
332   printf("ctr %d\n",ctr);
333   
334 /*
335   if(argc==2)
336     nb_test=atoi(argv[1]);
337   if(nb_test<=0 || nb_test>10000) {
338     printf("nb tests is not correct\n");
339     exit(0);
340   }
341   else
342     printf("nb tests = %d\n\n",nb_test);
343 */
344
345       
346   int seed=time(NULL);
347   cout<<seed<<endl;
348   srand48(seed);
349
350   uchar Secretkey[key_size];
351
352   uchar counter[key_size];
353
354   for(int i=0;i<key_size;i++) {
355     Secretkey[i]=lrand48()&0xFF;
356     counter[i]=lrand48()&0xFF;
357   }
358
359   
360   int size = 64;
361   uchar DK[size];
362
363
364
365
366   int width;
367   int height;
368   uchar *data_R, *data_G, *data_B;
369   load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
370 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
371
372
373
374
375   
376   int imsize=width*height*3;
377   uchar* seq= new uchar[imsize];
378   uchar* seq2= new uchar[imsize];
379
380   int oneD=width*height;
381   for(int i=0;i<oneD;i++) {
382     seq[i]=data_R[i];
383     seq[oneD+i]=data_G[i];
384     seq[2*oneD+i]=data_B[i];
385   }
386
387
388
389   
390
391   int total_len=imsize;
392   int rp=1;
393   int len= total_len/h2;
394
395
396   
397   uchar *mix=new uchar[256];
398
399
400
401     
402   for (int i = 0; i < 256 ; i++) {
403     mix[i]=Secretkey[i]^counter[i];
404   }
405
406   
407   cout<<"hash "<<endl;
408   for (int i = 0; i < 64 ; i++) {
409 //    DK[i]=digest[i];
410     DK[i]=mix[i];
411   }
412
413
414
415   
416   uchar Sbox1[256];
417   rc4key(DK, Sbox1, 16);
418
419   uchar Sbox2[256];
420   rc4key(&DK[16], Sbox2, 16);
421
422
423   
424   uchar sc[256];
425   rc4key(&DK[32], sc, 16);
426   
427   uchar outd[2*(h * h)];
428   prga(sc, 2*(h * h), outd);
429
430
431   uchar RM1[h*h];
432   uchar RM2[h*h];
433   for(int i=0;i<h2;i++){
434     RM1[i]=outd[i];
435     RM2[i]=outd[i+h2];
436   }
437               
438
439
440   
441     
442   
443   uchar keyp[16];
444   for (int i = 48; i < 64; i++)
445     keyp[i-48] = DK[i];
446
447 //  cout<<len<<endl;
448   int *Pbox=new int[len];
449   int *PboxRM=new int[h2];
450
451   rc4keyperm(keyp, len, rp, Pbox, 16);
452
453   printf("len %d\n",len);
454   for(int i=0;i<len;i++) {
455 //    printf("%d \n",Pbox[i]);
456   }
457   
458   rc4keyperm(RM2, h2, rp, PboxRM, h2);
459
460   for(int i=0;i<h2;i++){
461     RM2[i]=RM1[i];
462   }
463   
464  
465  double time=0;
466   double t=TimeStart();
467
468   int i;
469   for(i=0;i<nb_test;i++)
470   {
471 //    encrypt(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0);
472     encrypt_ctr(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1);
473   }
474   
475   time+=TimeStop(t);
476   cout<<"Time encrypt "<<time<<endl;
477
478
479   for(int i=0;i<oneD;i++) {
480     data_R[i]=seq2[i];
481     data_G[i]=seq2[oneD+i];
482     data_B[i]=seq2[2*oneD+i];
483   }
484   store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);             
485   
486
487   time=0;
488   t=TimeStart();
489   for(i=0;i<nb_test;i++) {
490 //    decrypt(seq2,seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0);
491     encrypt_ctr(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0);
492   }
493
494   time+=TimeStop(t);
495   cout<<"Time decrypt "<<time<<endl;
496
497   
498   for(int i=0;i<oneD;i++) {
499     data_R[i]=seq[i];
500     data_G[i]=seq[oneD+i];
501     data_B[i]=seq[2*oneD+i];
502   }
503   store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);             
504   
505
506
507   return 0;
508 }