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

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