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

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