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

Private GIT Repository
new
[Cipher_code.git] / IDA / test_mat2.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 <fstream>
11 #include <vector>
12
13
14 #include <iostream>     // std::cout, std::fixed
15 #include <iomanip>
16 #include <math.h>
17
18 using namespace arma;
19 using namespace std;
20 int key_size=256;
21
22 typedef unsigned char byte;
23
24
25 void rc4key(byte *key, byte *sc, int size_DK) {
26
27   for(int i=0;i<256;i++) {
28     sc[i]=i;
29   }
30
31
32   byte j0 = 0;
33   for(int i0=0; i0<256; i0++) {
34     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
35     byte tmp = sc[i0];
36     sc[i0] = sc[j0 ];
37     sc[j0] = tmp;
38   }
39 }
40
41
42 void prga(byte *sc, int ldata, byte *r) {
43   byte i0=0;
44   byte j0=0;
45
46   for (int it=0; it<ldata; it++) {
47     i0 = ((i0+1)&0xFE); //%255);
48     j0 = (j0 + sc[i0])&0xFF;
49     byte tmp = sc[i0];
50     sc[i0] = sc[j0];
51     sc[j0] = tmp;
52     r[it]=sc[(sc[i0]+sc[j0])&0xFF]%254+1;
53   }
54 }
55
56
57 void rc4keyperm(byte *key,int len, int rp,byte *sc, int size_DK) {
58
59   //sc=1:len;
60
61
62   
63   for (int i=0;i<len;i++) {
64     sc[i]=i;
65   }
66   for (int it = 0; it < rp; it++) {
67     int j0 = 1;
68     for(int i0 = 0; i0<len; i0++) {
69       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
70       int tmp = sc[i0];
71       sc[i0] = sc[j0];
72       sc[j0] = tmp;
73     }
74
75   }
76 }
77
78
79 Mat<byte> readFullFile(int n, int k, int& sizeFile, int &lc) {
80
81 //  ifstream stream("lena.png", ios::in | ios::binary | ios::ate);
82   ifstream stream("/home/couturie/ajeter/lena_small.png", ios::in | ios::binary | ios::ate);
83   sizeFile=stream.tellg();
84   cout<<sizeFile<<endl;
85   stream.seekg(0, ios::beg);
86
87   
88   lc=ceil(double(sizeFile)/k);
89   cout<<lc<<endl;
90
91   vector<uint8_t> contents2(n*lc,0);
92   vector<uint8_t> contents((istreambuf_iterator<char>(stream)), istreambuf_iterator<char>());
93   copy ( contents.begin(), contents.end(), contents2.begin() );
94
95   
96
97
98   Mat<byte> matData(&contents2[0],1,contents2.size());
99
100   cout << "file size: " << contents2.size() << endl;
101
102   matData.reshape(n,lc);
103   cout<<matData.n_rows<<" "<<matData.n_cols<<endl;
104   return matData;
105 }
106
107
108 Mat<byte> readPartialFile(int n, int k, int& sizeFile, int &lc) {
109
110 //  ifstream stream("lena.png", ios::in | ios::binary | ios::ate);
111   ifstream stream("/home/couturie/ajeter/lena_small.png", ios::in | ios::binary | ios::ate);
112   sizeFile=stream.tellg();
113   cout<<sizeFile<<endl;
114   stream.seekg(0, ios::beg);
115
116   
117   lc=ceil(double(sizeFile)/k);
118   cout<<lc<<endl;
119
120   vector<uint8_t> contents2(k*lc,0);
121   vector<uint8_t> contents((istreambuf_iterator<char>(stream)), istreambuf_iterator<char>());
122   copy ( contents.begin(), contents.end(), contents2.begin() );
123
124   
125
126
127   Mat<byte> matData(&contents2[0],1,contents2.size());
128
129   cout << "file size: " << contents2.size() << endl;
130
131   matData.reshape(k,lc);
132   cout<<matData.n_rows<<" "<<matData.n_cols<<endl;
133   return matData;
134 }
135
136
137
138
139
140 void buildFullRankIDA(Cube<byte>& IDAmat, Cube<short> &invIDAmat, int q, int n, byte* DK) {
141
142   byte Sbox[256];
143   byte RM1[q*n*n/4];
144  
145   
146   rc4key(DK, Sbox, 8);
147   prga(Sbox, q*n*n/4, RM1);
148   Cube<byte> rm1(RM1,1,1,q*n*n/4);
149   rm1.reshape(n/2,n/2,q);
150   
151   cout<<"rm1"<<endl;
152   cout<<rm1<<endl;
153
154
155   
156
157 //  Construction of the IDA matrices
158   for(int i=0;i<q;i++) {
159     Mat<byte> sub(n,n);
160     sub.submat(0,0,n/2-1,n/2-1)=rm1.slice(i);
161     sub.submat(0,n/2,n/2-1,n-1)=rm1.slice(i)+eye<Mat<byte>>(n/2,n/2);
162     sub.submat(n/2,0,n-1,n/2-1)=rm1.slice(i)-eye<Mat<byte>>(n/2,n/2);
163     sub.submat(n/2,n/2,n-1,n-1)=rm1.slice(i);
164
165 /*    cout<<"sub "<<i<<endl;
166     cout<<sub<<endl;
167
168     cout<<"det"<<endl;
169     mat toto=conv_to<mat>::from(sub);
170     cout<<det(toto)<<endl;
171 */
172     IDAmat.slice(i)=sub;
173
174     Mat<short> sub2(n,n);
175     Mat<short> rm2=conv_to<Mat<short>>::from(rm1.slice(i));
176     sub2.submat(0,0,n/2-1,n/2-1)=rm2;
177     sub2.submat(0,n/2,n/2-1,n-1)=-rm2-eye<Mat<short>>(n/2,n/2);
178     sub2.submat(n/2,0,n-1,n/2-1)=-rm2+eye<Mat<short>>(n/2,n/2);
179     sub2.submat(n/2,n/2,n-1,n-1)=rm2;
180
181     cout<<"det"<<endl;
182     mat toto=conv_to<mat>::from(sub2);
183     cout<<det(toto)<<endl;
184
185     invIDAmat.slice(i)=sub2;
186
187   }
188   cout<<IDAmat<<endl;
189   cout<<invIDAmat<<endl;
190 }
191
192 void buildPartialRankIDA(Cube<byte>& IDAmat, int q, int n, int k, byte* DK) {
193
194   byte Sbox[256];
195   byte RM1[q*n*k];
196  
197   
198   rc4key(DK, Sbox, 8);
199   prga(Sbox, q*n*k, RM1);
200   Cube<byte> rm1(RM1,1,1,q*n*k);
201   rm1.reshape(n,k,q);
202   IDAmat=rm1;
203 /*    
204   cout<<"rm1"<<endl;
205   cout<<rm1<<endl;
206
207
208   
209
210 //  Construction of the IDA matrices
211   for(int i=0;i<q;i++) {
212     Mat<byte> sub(n,k);
213     sub.submat(0,0,n-1,k-1)=rm1.slice(i);
214  
215
216     IDAmat.slice(i)=sub;
217
218
219     cout<<"det "<<i<<endl;
220     mat toto=conv_to<mat>::from(sub);
221     cout<<det(toto)<<endl;
222
223   }
224 */
225   cout<<IDAmat<<endl;
226
227 }
228
229
230
231 int main( int argc, char *argv[] ) {
232
233
234
235   int full=0;
236   
237   int q=2;
238   int n=4;
239   int k=4;
240   int Tb=64;
241   int l=10;//399*Tb;
242
243
244   
245   int key_size=32;
246   int seed=time(NULL);
247   cout<<seed<<endl;
248   srand48(seed);
249
250   byte Secretkey[key_size];
251
252   byte counter[key_size];
253
254   for(int i=0;i<key_size;i++) {
255     Secretkey[i]=lrand48()&0xFF;
256     counter[i]=lrand48()&0xFF;
257   }
258
259   
260   byte DK[key_size];
261   for (int i = 0; i < key_size ; i++) {
262     DK[i]=Secretkey[i]^counter[i];
263   }
264
265   byte sc[256];
266
267
268   
269   
270
271   byte PboxV[l/Tb];
272     
273   rc4keyperm(&DK[8], l/Tb, 1, PboxV, 16);
274
275
276
277
278
279
280   int lc;
281   int sizeFile;
282   Mat<byte> M;
283   if(full)
284     M=readFullFile(n,k,sizeFile,lc);
285   else
286     M=readPartialFile(n,k,sizeFile,lc);
287
288   // cout<<"M "<<endl;
289   // cout<<M<<endl;
290   
291
292   arma_rng::set_seed(time(NULL));
293
294 // Initialization of IDA and inverse IDA matrix
295
296   Cube<byte> IDAmat;
297   Cube<short> invIDAmat;
298   
299   if(full)
300   {
301     IDAmat.resize(n,n,q);
302     invIDAmat.resize(n,n,q);
303     buildFullRankIDA(IDAmat, invIDAmat, q, n, &DK[0]);
304   }
305   else {
306     IDAmat.resize(n,k,q);
307     buildPartialRankIDA(IDAmat, q, n, k, &DK[0]);
308   }
309
310
311
312
313
314 //  Ma<byte> data;
315 //  data.load("/home/couturie/ajeter/lena.png");
316   
317   /* Mat<byte> M=conv_to<Mat<byte>>::from(randi(k,l));
318   M=abs(M);
319   M=M - floor(M/255)*255;*/
320
321 /*  cout<<"M"<<endl;
322   cout<<M<<endl;
323   cout<<"C"<<endl;
324   cout<<C<<endl;
325 */
326
327
328   Mat<byte> C;
329   Mat<char> D2;
330   C=IDAmat.slice(0)*M;
331   M.save("M.bin",raw_binary);
332   
333   if(full) {
334     //Mat<short> D=invIDAmat.slice(0)*C;
335
336     
337     mat A=conv_to<mat>::from(IDAmat.slice(0).submat(0,0,n-1,n-1));
338     mat B=conv_to<mat>::from(C.submat(0,0,n-1,lc-1));
339     mat D=solve(A,B);
340     cout<<D<<endl;
341     
342
343     D2=conv_to<Mat<char>>::from(D);
344   }
345   else {
346     mat A=conv_to<mat>::from(IDAmat.slice(0).submat(0,0,n-1,k-1));
347     mat B=conv_to<mat>::from(C.submat(0,0,n-1,lc-1));
348     mat D=solve(A,B);
349     
350     cout<<D<<endl;
351     D2=conv_to<Mat<char>>::from(D);    
352   }
353
354   
355
356
357 //  cout<<"D2"<<endl;
358 //  cout<<D2<<endl;
359 //  D2.save("D2.bin",raw_binary);
360   D2.reshape(1,n*lc);
361   Row<char> d2=D2.row(0);
362   byte* vec=(byte*)d2.memptr();
363
364   FILE* pFile = fopen ("myfile.png", "wb");
365   fwrite (vec , sizeof(byte), sizeFile, pFile);
366   fclose (pFile);
367 }