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

Private GIT Repository
add openssl hmac
[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 //    if(it%5==0)
156     prga(S, X, h, out2);
157
158
159
160     
161     for(int a=0;a<h;a+=4) {
162       out[a]=S[out2[a]^X[a]];
163       out[a+1]=S[out2[a+1]^X[a+1]];
164       out[a+2]=S[out2[a+2]^X[a+2]];
165       out[a+3]=S[out2[a+3]^X[a+3]];
166     }
167     
168     
169
170     
171   }
172
173
174 }
175
176
177
178
179
180   
181
182
183
184   
185 int main(int argc, char** argv) {
186
187
188   int h=16;
189   int lena=0;
190   int size_buf=1;
191   int change=0;
192
193   
194   for(int i=1; i<argc; i++){
195     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
196     if(strncmp(argv[i],"ctr",3)==0) ctr = atoi(&(argv[i][3]));          //CTR ? 1  otherwise CBC like
197     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
198     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
199     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
200     if(strncmp(argv[i],"c",1)==0) change = atoi(&(argv[i][1]));          //Use Lena or buffer
201   }
202
203
204   cout<<size_buf<<endl;
205       
206
207
208   int width;
209   int height;
210
211   uchar *data_R, *data_G, *data_B;
212   int imsize;
213   uchar *buffer;
214   
215   if(lena==1) {
216     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
217     imsize=width*height*3;
218 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
219   }
220   else {
221     imsize=size_buf;
222     buffer=new uchar[imsize];
223     for(int i=0;i<imsize;i++) {
224       buffer[i]=lrand48();
225     }
226   }
227
228
229   
230   
231   uchar* seq= new uchar[imsize];
232   uchar* seq2= new uchar[imsize];
233
234   int oneD;
235   if(lena) {
236     oneD=width*height;
237     for(int i=0;i<oneD;i++) {
238       seq[i]=data_R[i];
239       seq[oneD+i]=data_G[i];
240       seq[2*oneD+i]=data_B[i];
241     }
242   }
243   else {
244     oneD=imsize;
245     for(int i=0;i<oneD;i++) {
246 //      seq[i]=buffer[i];
247       seq[i]=i+1;
248     }
249   }
250
251
252   if(change==1) {
253     
254     seq[14]++;
255   }
256   if(change==2) {
257     seq[15]++;
258   }
259   if(change==3 && imsize>=32) {
260     seq[27]++;
261   }
262   if(change==4 && imsize>=128) {
263     seq[67]++;
264   }
265
266
267   
268   
269
270   int total_len=imsize;
271   int rp=1;
272   int len= total_len/h;
273   cout<<len<<endl;
274
275   
276
277
278
279
280
281   uchar res[h];
282   for(int i=0;i<h;i++)
283     res[i]=i+1;
284
285
286
287
288   double time=0;
289
290   cout<<"imsize "<<imsize<<endl;
291 /*
292   cout<<"seq"<<endl;
293   for(int i=0;i<imsize;i++){
294     cout<<(int)seq[i]<<" ";
295   }
296   cout<<endl;
297 */
298   cout<<"res"<<endl;
299   for(int i=0;i<h;i++){
300     cout<<(int)res[i]<<" ";
301   }
302   cout<<endl;
303
304   
305   time=0;
306   double t=TimeStart();
307   for(int i=0;i<nb_test;i++)
308   {
309
310     myhash(seq, len,res,h);
311   }
312
313
314   
315   
316   time+=TimeStop(t);
317   cout<<"Hash Time  "<<time<<endl;
318   cout<<(double)imsize*nb_test/time<<"\t";
319
320   for(int i=0;i<h;i++){
321     cout<<(int)res[i]<<" ";
322   }
323   cout<<endl;
324
325   
326
327   return 0;
328 }