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

Private GIT Repository
update of one round with last modifs
[Cipher_code.git] / IDA / ida.cpp
1
2 #include <armadillo>
3 #include <stdlib.h>
4 #include <stdio.h>
5
6 #include <iostream>
7 #include <iterator>     // std::ostream_iterator
8 #include <fstream>
9 #include <vector>
10 #include <iostream>     // std::cout, std::fixed
11 #include <iomanip>
12 #include <math.h>
13
14 using namespace arma;
15 using namespace std;
16 int key_size=256;
17
18
19   const int mm=251;
20
21 typedef unsigned char byte;
22
23
24 template<typename T>
25 T mod(T a, int n)
26 {
27     return a - floor(a/n)*n;
28 }   
29
30 inline int positive_modulo(int i, int n) {
31     return (i % n + n) % n;
32 }
33
34 void Bezout(int rkm2,int rkm1,int *res,int ukm1=0,int vkm1=1,int ukm2=1,int vkm2=0){
35 /*r(k-4)=r(k-3)*q(k-2)+r(k-2) <=> r(k-2)=a*u(k-2)+b*v(k-2)
36
37  
38 r(k-3)=r(k-2)*q(k-1)+r(k-1) <=> r(k-1)=a*u(k-1)+b*v(k-1)
39  
40 r(k-2)=r(k-1)*q(k)+r(k)     <=> r(k)=a*u(k)+b*v(k) avec u(k)=u(k-2)-qk*u(k-1) et v(k)=v(k-2)-qk*v(k-1)*/
41
42     int rk=rkm2%rkm1;
43     int qk=(rkm2-rk)/rkm1;
44     if(rk==0)  {
45         cout<<rkm1<<" = a*"<<ukm1<<"+b*"<<vkm1<<std::endl;
46         *res=ukm1;
47     }
48     else 
49       Bezout(rkm1,rk,res,ukm2-qk*ukm1,vkm2-qk*vkm1,ukm1,vkm1);
50     return;
51 }
52
53
54 void saveFile(Row<byte> data, const char *fileName,long size_file=0) {
55     byte* vec=(byte*)data.memptr();
56 //    cout<<"vec "<<d2.size()<<endl;
57     FILE* pFile = fopen (fileName, "wb");
58     if(size_file==0)
59       size_file=data.size();
60     
61     fwrite (vec , sizeof(byte), size_file, pFile);
62     fclose (pFile);
63
64
65 /*    vector<uint8_t> v =conv_to< vector<uint8_t> >::from(data);
66     ofstream outfile(fileName, ios::out | ofstream::binary);
67
68     copy(v.begin(), v.end(), ostream_iterator<uint8_t>(outfile));
69     outfile.close();
70 */
71     
72 }
73
74 Row<byte> readFile( const char *fileName) {
75   /*ifstream stream(fileName, ios::in | ios::binary | ios::ate);
76   int sizeFile=stream.tellg();
77   stream.seekg(0, ios::beg);
78   vector<uint8_t> vec((istreambuf_iterator<char>(stream)), istreambuf_iterator<char>());
79   Row<byte> d2(vec);
80   */
81
82   
83    FILE* pFile = fopen (fileName, "rb");
84   fseek(pFile, 0L, SEEK_END);
85   int sz = ftell(pFile);
86   rewind(pFile);
87   byte* vec=new byte[sz];
88   fread (vec , sizeof(byte), sz, pFile);
89   fclose (pFile);
90
91   
92   Row<byte> d2(vec,sz);
93   delete vec;
94
95
96   cout<<"vec ici"<<d2.size()<<endl;
97   return d2;
98 }
99
100
101
102 vector<uint8_t>
103 convert_vec256_to_vec250(vector<uint8_t> vec256){
104   
105
106    int num_val_greater = std::count_if(vec256.begin(), vec256.end(), [](int i){return i>=mm;});
107    vector<uint8_t> vec250;
108    vec250.reserve(vec256.size()+num_val_greater);
109    // cout<<"ICI "<<vec250.size()<<" "<<vec256.size()+num_val_greater<<endl;
110
111    int l=0;
112    for (int i=0; i<vec256.size(); i++) {
113      if(vec256[i]>=mm-1) {
114        vec250.push_back(mm-1);
115        vec250.push_back(vec256[i]-mm+1);
116        //vec250[l++]=(mm-1);
117        
118        //vec250[l++]=vec256[i]-mm+1;
119      }
120      else {
121        vec250.push_back(vec256[i]);
122        //vec250[l++]=vec256[i];
123      }
124    }
125    //cout<<"ICI "<<vec250.size()<<endl;
126    return vec250;
127
128
129 }
130
131 vector<uint8_t>
132 convert_vec250_to_vec256(vector<uint8_t> vec250){
133
134
135   vector<uint8_t> vec256;
136   vec256.reserve(vec250.size());
137   
138   for (int i=0; i<vec250.size(); i++) {
139     if(vec250[i]==mm-1) {
140       vec256.push_back(vec250[++i]+mm-1);
141     }
142     else {
143       vec256.push_back(vec250[i]);
144     }
145   }
146
147 //   cout<<"ICI 2 "<<vec256.size()<<endl;
148   return vec256;
149 }
150
151
152
153
154
155 Mat<byte> readFullFile(int n, int k, long& sizeFile, int &lc) {
156
157 //  ifstream stream("lena.png", ios::in | ios::binary | ios::ate);
158   ifstream stream("lena_small2.png", ios::in | ios::binary | ios::ate);
159 //  ifstream stream("/home/couturie/Downloads/CARCARIASS.zip", ios::in | ios::binary | ios::ate);
160
161   sizeFile=stream.tellg();
162   cout<<sizeFile<<endl;
163   stream.seekg(0, ios::beg);
164
165
166
167 //Used to convert the size (in long) in 8 bytes  
168   uint8_t mysize[8];
169   
170
171   long tmpSize=sizeFile;
172   for(int i=0;i<8;i++) {
173     uint8_t t=tmpSize;
174 //    cout<<(int)t<<endl;
175     mysize[i]=t;
176     tmpSize>>=8;
177   }
178
179 //we rebuild the size in order to check that the routine is correct  
180   cout<<"rebuild"<<endl;
181   long res=0;
182   for(int i=8-1;i>=0;i--) {
183     res<<=8;
184     res+=mysize[i];
185   }
186
187   cout<<(long)res<<endl;
188
189   
190   
191   vector<uint8_t> contents((istreambuf_iterator<char>(stream)), istreambuf_iterator<char>());
192   cout<<"res contents "<<contents.size()<<endl;
193   cout<<"add size of file"<<endl;
194 //  for(int i=0;i<8;i++)
195 //    contents.insert(i,mysize[i]);
196   contents.insert (contents.begin(), mysize, mysize+8);
197
198   cout<<"start of the vector"<<endl;
199   for(int i=0;i<8;i++)
200     cout<<(int)contents[i]<<" ";
201   cout<<endl;
202
203
204   
205   cout<<"res contents "<<contents.size()<<endl;
206   vector<uint8_t> contents2=convert_vec256_to_vec250(contents);
207   cout<<"res contents2 "<<contents2.size()<<endl;
208
209
210   
211 /*
212   cout<<"AFTER"<<endl;
213 for (auto i = contents2.begin(); i != contents2.end(); ++i)
214   std::cout << (int)*i << ' ';
215 cout<<endl;
216 */
217
218 //  vector<uint8_t> contents3=convert_vec250_to_vec256(contents2);
219
220   /*cout<<"LAST"<<endl;
221 for (auto i = contents3.begin(); i != contents3.end(); ++i)
222   cout << (int)*i << ' ';
223 cout<<endl;
224
225
226 if (std::equal(contents.begin(), contents.begin() + contents.size(), contents3.begin()))
227     cout << "success" << endl;
228   */
229
230   lc=ceil(contents2.size()/k);
231   cout<<"size lc "<<lc<<endl;
232   Mat<byte> matData(&contents2[0],1,contents2.size());
233
234
235 /*  Row<byte> test(&contents[0],contents.size());
236   cout<<"test "<<size(test)<<endl;
237   saveFile(test, "lena3.png");
238 */
239   
240   cout << "file size: " << contents2.size() << endl;
241
242   matData.reshape(k,lc);
243   cout<<matData.n_rows<<" "<<matData.n_cols<<endl;
244   return matData;
245 }
246
247
248
249
250 int main( int argc, char *argv[] ) {
251
252
253
254   
255   int n=8;
256   int k=4;
257
258
259   
260
261
262
263
264
265   int lc;
266   long sizeFile;
267   Mat<byte> S;
268   S=readFullFile(n,k,sizeFile,lc);
269   
270
271
272   arma_rng::set_seed(time(NULL));
273   //S=randi<Mat<byte>>(k,100000000);
274   
275   cout<<"S "<<size(S)<<endl;
276   S=mod(S,mm);
277
278   Mat<byte> G= randi<Mat<byte>>(n,k);
279   cout<<"G "<<size(G)<<endl;
280   
281
282   Mat<int> C=conv_to<Mat<int>>::from(G)*conv_to<Mat<int>>::from(S);
283   C=mod(C,mm);
284   cout<<"C "<<size(C)<<endl;
285
286   Mat<byte> C2=conv_to<Mat<byte>>::from(C);
287
288
289   //write files
290   for(int i=0;i<n;i++) {
291     stringstream ss;
292     ss <<"lena_"<<i<<".png";
293     string str = ss.str();
294     saveFile(C2.row(i), str.c_str());
295   }
296   
297
298   cout<<"tatat"<<endl;
299   Mat<byte> C3;
300
301
302   int off=0;
303   
304   //read k files among n
305
306   int l=0;
307 //  for(int i=k-1;i>=0;i--) {
308   for(int i=0+off;i<k+off;i++) {
309     stringstream ss;
310     ss <<"lena_"<<i<<".png";
311     string str = ss.str();
312     cout<<str<<endl;
313     Row<byte> d2=readFile(str.c_str());
314     C3.insert_rows(l,d2);
315     l++;
316   }
317
318     
319    
320
321
322 //  Mat<int> Cs=C.rows(0,k-1);
323   Mat<int> Cs=conv_to<Mat<int>>::from(C3);
324
325   cout<<size(Cs)<<" "<<size(C3)<<endl;
326   cout<<"S "<<" "<<S<<endl;
327
328
329   
330   Mat<int> Gs2=conv_to<Mat<int>>::from(G).rows(0,k-1);
331   mat Gs=conv_to<mat>::from(Gs2);
332
333   cout<<"tot"<<endl;
334   cout<<Gs<<endl;
335   
336   double determinant2=det(Gs);
337   int determinant=remainder(determinant2,mm);
338   determinant=positive_modulo(determinant,mm);
339
340   int r;
341   Bezout(determinant,mm,&r);
342
343   
344   cout<<determinant<<" "<<mm<<" "<<r<<endl;  
345
346   mat Gsi=round(inv(Gs)*det(Gs)*r);
347   Gsi=mod(Gsi,mm);
348
349   cout<<Gsi<<endl;
350   
351   mat temp=Gsi*Cs;
352   mat SS2=mod(temp,mm);
353   Mat<byte> S2=conv_to<Mat<byte>>::from(SS2);
354   S2=mod(S2,mm);
355   cout<<"S2 "<<S2<<endl;
356   cout<<"max"<<endl;
357   cout<<max(S2-S,1)<<endl;
358
359
360
361   
362   S2.reshape(1,S2.n_rows*S2.n_cols);
363
364
365   vector<uint8_t> res =conv_to< vector<uint8_t> >::from(S2.row(0));
366   cout<<"res size "<<res.size()<<endl;
367
368   cout<<"start of file"<<endl;
369   for(int i=0;i<8;i++)
370     cout<<(int)res[i]<<" ";
371   cout<<endl;
372
373   
374   vector<uint8_t> res2=convert_vec250_to_vec256(res);
375   cout<<"res2 size "<<res2.size()<<endl;
376
377   cout<<"get size"<<endl;
378   uint8_t mysize[8];
379
380   for(int i=0;i<8;i++) {
381     mysize[i]=res2.front();
382     res2.erase(res2.begin());
383   }
384
385   for(int i=0;i<8;i++)
386     cout<<(int)mysize[i]<<endl;
387
388   cout<<"rebuild size"<<endl;
389   long size_file=0;
390   for(int i=8-1;i>=0;i--) {
391     size_file<<=8;
392     size_file+=mysize[i];
393   }
394
395   cout<<"size file "<<(long)size_file<<endl;
396   saveFile(res2, "lena2.png",size_file);
397   
398
399
400   
401 }