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

Private GIT Repository
2b4afca29c59012d4c4b97d6ce47fb665b93ccc3
[Cipher_code.git] / Hash / rc4_hash.cpp
1 //gcc pixmap_io.c  -c 
2 //g++ -O3 one_round_hash_new.cpp pixmap_io.o  -o one_round_hash_new -std=c++11   
3
4 //
5
6
7 #include <iostream>
8 #include <list>
9 #include<math.h>
10 #include<stdlib.h>
11 #include<stdio.h>
12 #include<string.h>
13 #include <fstream>
14 #include <sys/time.h>
15
16 /*#include <cryptopp/hex.h>
17 #include <cryptopp/sha.h>
18 #include <cryptopp/osrng.h>
19 #include <cryptopp/secblock.h>
20 */
21
22
23 extern "C" {
24   int load_RGB_pixmap(char *filename, int *width, int *height, unsigned char**R_data, unsigned char**G_data, unsigned char**B_data);
25   void store_RGB_pixmap(char *filename, unsigned char *R_data, unsigned char *G_data, unsigned char *B_data, int width, int height);
26 }
27
28
29 //using namespace CryptoPP;
30 using namespace std;
31
32
33 int key_size=256;
34 int nb_test=1;
35 int ctr=0;
36
37
38
39
40
41
42
43 typedef unsigned char   uchar;
44
45
46 double TimeStart()
47 {
48   struct timeval tstart;
49   gettimeofday(&tstart,0);
50   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
51 }
52
53 double TimeStop(double t)
54 {
55   struct timeval tend;
56
57   gettimeofday(&tend,0);
58   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
59   return (t);
60 }
61
62
63
64
65
66
67
68
69 void rc4key(uchar *key, uchar *sc, int h) {
70
71   for(int i=0;i<256;i++) {
72     sc[i]=i;
73   }
74
75
76   uchar j0 = 0;
77   for(int i0=0; i0<256; i0++) {
78     j0 = (j0 + sc[i0] + key[i0%h] + key[j0%h] );
79     uchar tmp = sc[i0];
80     sc[i0] = sc[j0 ];
81     sc[j0] = tmp;
82   }
83 }
84
85
86
87
88
89
90 void prga(uchar *sc, uchar *block, int h, uchar *r) {
91   uchar i0=0;
92   uchar j0=0;
93
94   for (int it=0; it<h; it++) {
95     i0 = i0+1+block[(i0+1)%h];
96     j0 = j0+1+block[(j0+1)%h];
97     uchar tmp = sc[i0];
98     sc[i0] = sc[j0];
99     sc[j0] = tmp;
100     r[it]=sc[(uchar)(sc[i0]+sc[j0])];
101   }
102 }
103
104
105
106 void myhash(uchar* seq_in, int len, uchar* out, int h) {
107
108
109
110   
111   int ind2;
112
113   uchar X[h];
114   uchar out2[h];
115
116
117   uchar S[256];
118
119   
120   rc4key(out, S, h);
121
122
123 /*  cout<<"S"<<endl;
124   for(int i=0;i<256;i++)
125     cout<<(int)S[i]<<" ";
126   cout<<endl;
127 */
128
129 /*  cout<<"out"<<endl;
130   for(int i=0;i<h;i++)
131     cout<<(int)out[i]<<" ";
132   cout<<endl;
133
134   cout<<len<<endl;
135 */
136   
137   for(int it=0;it<len;it++) {
138    
139     ind2=it*h;
140
141     // Mix with dynamic RM
142     
143     for(int a=0;a<h;a+=4) {
144       X[a]=out[a]^seq_in[ind2+a];
145       X[a+1]=out[a+1]^seq_in[ind2+a+1];
146       X[a+2]=out[a+2]^seq_in[ind2+a+2];
147       X[a+3]=out[a+3]^seq_in[ind2+a+3];
148     }
149
150     
151 /*    for(int i=0;i<h;i++)
152       cout<<(int)X[i]<<endl;
153 */
154     
155     prga(S, X, h, out2);
156
157
158
159     
160     for(int a=0;a<h;a+=4) {
161       out[a]=S[out2[a]^X[a]];
162       out[a+1]=S[out2[a+1]^X[a+1]];
163       out[a+2]=S[out2[a+2]^X[a+2]];
164       out[a+3]=S[out2[a+3]^X[a+3]];
165     }
166     
167     
168
169     
170   }
171
172
173 }
174
175
176
177
178
179   
180
181
182
183   
184 int main(int argc, char** argv) {
185
186
187   int h=16;
188   int lena=0;
189   int size_buf=1;
190   int change=0;
191
192   
193   for(int i=1; i<argc; i++){
194     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
195     if(strncmp(argv[i],"ctr",3)==0) ctr = atoi(&(argv[i][3]));          //CTR ? 1  otherwise CBC like
196     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
197     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
198     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
199     if(strncmp(argv[i],"c",1)==0) change = atoi(&(argv[i][1]));          //Use Lena or buffer
200   }
201
202
203   cout<<size_buf<<endl;
204       
205
206
207   int width;
208   int height;
209
210   uchar *data_R, *data_G, *data_B;
211   int imsize;
212   uchar *buffer;
213   
214   if(lena==1) {
215     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
216     imsize=width*height*3;
217 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
218   }
219   else {
220     imsize=size_buf;
221     buffer=new uchar[imsize];
222     for(int i=0;i<imsize;i++) {
223       buffer[i]=lrand48();
224     }
225   }
226
227
228   
229   
230   uchar* seq= new uchar[imsize];
231   uchar* seq2= new uchar[imsize];
232
233   int oneD;
234   if(lena) {
235     oneD=width*height;
236     for(int i=0;i<oneD;i++) {
237       seq[i]=data_R[i];
238       seq[oneD+i]=data_G[i];
239       seq[2*oneD+i]=data_B[i];
240     }
241   }
242   else {
243     oneD=imsize;
244     for(int i=0;i<oneD;i++) {
245 //      seq[i]=buffer[i];
246       seq[i]=i+1;
247     }
248   }
249
250
251   if(change==1) {
252     
253     seq[14]++;
254   }
255   if(change==2) {
256     
257     seq[15]++;
258   }
259
260
261   
262   
263
264   int total_len=imsize;
265   int rp=1;
266   int len= total_len/h;
267   cout<<len<<endl;
268
269   
270
271
272
273
274
275   uchar res[h];
276   for(int i=0;i<h;i++)
277     res[i]=i+1;
278
279
280
281
282   double time=0;
283
284   cout<<"imsize "<<imsize<<endl;
285 /*
286   cout<<"seq"<<endl;
287   for(int i=0;i<imsize;i++){
288     cout<<(int)seq[i]<<" ";
289   }
290   cout<<endl;
291 */
292   cout<<"res"<<endl;
293   for(int i=0;i<h;i++){
294     cout<<(int)res[i]<<" ";
295   }
296   cout<<endl;
297
298   
299   time=0;
300   double t=TimeStart();
301   for(int i=0;i<nb_test;i++)
302   {
303
304     myhash(seq, len,res,h);
305   }
306
307
308   
309   
310   time+=TimeStop(t);
311   cout<<"Hash Time  "<<time<<endl;
312   cout<<(double)imsize*nb_test/time<<"\t";
313
314   for(int i=0;i<h;i++){
315     cout<<(int)res[i]<<" ";
316   }
317   cout<<endl;
318
319   
320
321   return 0;
322 }