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

Private GIT Repository
e09acbd89c3e4c13459badbb579000f7af6fb073
[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> readFile(int n, int k, int& sizeFile, int &lc) {
80
81   ifstream stream("/home/couturie/ajeter/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
109 void buildFullRankIDA(Cube<byte>& IDAmat, Cube<short> &invIDAmat, int q, int n, byte* DK) {
110
111   byte Sbox[256];
112   byte RM1[q*n*n/4];
113  
114   
115   rc4key(DK, Sbox, 8);
116   prga(Sbox, q*n*n/4, RM1);
117   Cube<byte> rm1(RM1,1,1,q*n*n/4);
118   rm1.reshape(n/2,n/2,q);
119   
120   cout<<"rm1"<<endl;
121   cout<<rm1<<endl;
122
123
124   
125
126 //  Construction of the IDA matrices
127   for(int i=0;i<q;i++) {
128     Mat<byte> sub(n,n);
129     sub.submat(0,0,n/2-1,n/2-1)=rm1.slice(i);
130     sub.submat(0,n/2,n/2-1,n-1)=rm1.slice(i)+eye<Mat<byte>>(n/2,n/2);
131     sub.submat(n/2,0,n-1,n/2-1)=rm1.slice(i)-eye<Mat<byte>>(n/2,n/2);
132     sub.submat(n/2,n/2,n-1,n-1)=rm1.slice(i);
133
134 /*    cout<<"sub "<<i<<endl;
135     cout<<sub<<endl;
136
137     cout<<"det"<<endl;
138     mat toto=conv_to<mat>::from(sub);
139     cout<<det(toto)<<endl;
140 */
141     IDAmat.slice(i)=sub;
142
143     Mat<short> sub2(n,n);
144     Mat<short> rm2=conv_to<Mat<short>>::from(rm1.slice(i));
145     sub2.submat(0,0,n/2-1,n/2-1)=rm2;
146     sub2.submat(0,n/2,n/2-1,n-1)=-rm2-eye<Mat<short>>(n/2,n/2);
147     sub2.submat(n/2,0,n-1,n/2-1)=-rm2+eye<Mat<short>>(n/2,n/2);
148     sub2.submat(n/2,n/2,n-1,n-1)=rm2;
149
150     cout<<"det"<<endl;
151     mat toto=conv_to<mat>::from(sub2);
152     cout<<det(toto)<<endl;
153
154     invIDAmat.slice(i)=sub2;
155
156   }
157   cout<<IDAmat<<endl;
158   cout<<invIDAmat<<endl;
159 }
160
161 void buildKRankIDA(Cube<byte>& IDAmat, int q, int n, int k, byte* DK) {
162
163   byte Sbox[256];
164   byte RM1[q*n*k];
165  
166   
167   rc4key(DK, Sbox, 8);
168   prga(Sbox, q*n*k, RM1);
169   Cube<byte> rm1(RM1,1,1,q*n*k);
170   rm1.reshape(n,k,q);
171   
172   cout<<"rm1"<<endl;
173   cout<<rm1<<endl;
174
175
176   
177
178 //  Construction of the IDA matrices
179   for(int i=0;i<q;i++) {
180     Mat<byte> sub(n,k);
181     sub.submat(0,0,n-1,k-1)=rm1.slice(i);
182  
183
184     IDAmat.slice(i)=sub;
185
186
187   }
188   cout<<IDAmat<<endl;
189
190 }
191
192
193
194 int main( int argc, char *argv[] ) {
195
196
197   int q=2;
198   int n=4;
199   int k=4;
200   int Tb=64;
201   int l=10;//399*Tb;
202
203
204   
205   int key_size=32;
206   int seed=time(NULL);
207   cout<<seed<<endl;
208   srand48(seed);
209
210   byte Secretkey[key_size];
211
212   byte counter[key_size];
213
214   for(int i=0;i<key_size;i++) {
215     Secretkey[i]=lrand48()&0xFF;
216     counter[i]=lrand48()&0xFF;
217   }
218
219   
220   byte DK[key_size];
221   for (int i = 0; i < key_size ; i++) {
222     DK[i]=Secretkey[i]^counter[i];
223   }
224
225   byte sc[256];
226
227
228   
229   
230
231   byte PboxV[l/Tb];
232     
233   rc4keyperm(&DK[8], l/Tb, 1, PboxV, 16);
234
235
236
237
238 /*
239 // Initialization of IDA and inverse IDA matrix
240   Cube<byte> IDAmat(n,n,q);
241   Cube<short> invIDAmat(n,n,q);
242   buildFullRankIDA(IDAmat, invIDAmat, q, n, &DK[0]);
243 */
244
245
246
247   Cube<byte> IDAmat(n,k,q);
248   buildKRankIDA(Cube<byte>& IDAmat, q, n, k, &DK[0]);
249
250   // rc4key(&DK[8], sc, 16);
251   
252   
253
254   
255  
256  
257   arma_rng::set_seed(time(NULL));
258
259
260   int lc;
261   int sizeFile;
262   Mat<byte> M=readFile(n,k,sizeFile,lc);
263
264 //  Ma<byte> data;
265 //  data.load("/home/couturie/ajeter/lena.png");
266   
267   /* Mat<byte> M=conv_to<Mat<byte>>::from(randi(k,l));
268   M=abs(M);
269   M=M - floor(M/255)*255;*/
270
271 /*  cout<<"M"<<endl;
272   cout<<M<<endl;
273   cout<<"C"<<endl;
274   cout<<C<<endl;
275 */
276
277   
278   Mat<byte> C=IDAmat.slice(0)*M;
279   M.save("M.bin",raw_binary);
280 //  Mat<short> D=invIDAmat.slice(0)*C;
281
282
283   mat A=conv_to<mat>::from(IDAmat.slice(0).submat(0,0,k-1,n-1));
284   mat B=conv_to<mat>::from(C.submat(0,0,k-1,lc-1));
285
286   mat D=solve(A,B);
287
288   
289
290   Mat<char> D2=conv_to<Mat<char>>::from(D);
291 //  cout<<"D2"<<endl;
292 //  cout<<D2<<endl;
293 //  D2.save("D2.bin",raw_binary);
294   D2.reshape(1,n*lc);
295   Row<char> d2=D2.row(0);
296   byte* vec=(byte*)d2.memptr();
297
298   FILE* pFile = fopen ("myfile.png", "wb");
299   fwrite (vec , sizeof(byte), sizeFile, pFile);
300   fclose (pFile);
301 }