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

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