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

Private GIT Repository
new
[Cipher_code.git] / IDA / test_mat2.cpp
index e09acbd89c3e4c13459badbb579000f7af6fb073..20ccca7bca33777616ea1d5776db8962264b519d 100644 (file)
@@ -76,10 +76,10 @@ void rc4keyperm(byte *key,int len, int rp,byte *sc, int size_DK) {
 }
 
 
-Mat<byte> readFile(int n, int k, int& sizeFile, int &lc) {
+Mat<byte> readFullFile(int n, int k, int& sizeFile, int &lc) {
 
-  ifstream stream("/home/couturie/ajeter/lena.png", ios::in | ios::binary | ios::ate);
-//  ifstream stream("/home/couturie/ajeter/lena_small.png", ios::in | ios::binary | ios::ate);
+//  ifstream stream("lena.png", ios::in | ios::binary | ios::ate);
+  ifstream stream("/home/couturie/ajeter/lena_small.png", ios::in | ios::binary | ios::ate);
   sizeFile=stream.tellg();
   cout<<sizeFile<<endl;
   stream.seekg(0, ios::beg);
@@ -105,6 +105,37 @@ Mat<byte> readFile(int n, int k, int& sizeFile, int &lc) {
 }
 
 
+Mat<byte> readPartialFile(int n, int k, int& sizeFile, int &lc) {
+
+//  ifstream stream("lena.png", ios::in | ios::binary | ios::ate);
+  ifstream stream("/home/couturie/ajeter/lena_small.png", ios::in | ios::binary | ios::ate);
+  sizeFile=stream.tellg();
+  cout<<sizeFile<<endl;
+  stream.seekg(0, ios::beg);
+
+  
+  lc=ceil(double(sizeFile)/k);
+  cout<<lc<<endl;
+
+  vector<uint8_t> contents2(k*lc,0);
+  vector<uint8_t> contents((istreambuf_iterator<char>(stream)), istreambuf_iterator<char>());
+  copy ( contents.begin(), contents.end(), contents2.begin() );
+
+  
+
+
+  Mat<byte> matData(&contents2[0],1,contents2.size());
+
+  cout << "file size: " << contents2.size() << endl;
+
+  matData.reshape(k,lc);
+  cout<<matData.n_rows<<" "<<matData.n_cols<<endl;
+  return matData;
+}
+
+
+
+
 
 void buildFullRankIDA(Cube<byte>& IDAmat, Cube<short> &invIDAmat, int q, int n, byte* DK) {
 
@@ -158,7 +189,7 @@ void buildFullRankIDA(Cube<byte>& IDAmat, Cube<short> &invIDAmat, int q, int n,
   cout<<invIDAmat<<endl;
 }
 
-void buildKRankIDA(Cube<byte>& IDAmat, int q, int n, int k, byte* DK) {
+void buildPartialRankIDA(Cube<byte>& IDAmat, int q, int n, int k, byte* DK) {
 
   byte Sbox[256];
   byte RM1[q*n*k];
@@ -168,7 +199,8 @@ void buildKRankIDA(Cube<byte>& IDAmat, int q, int n, int k, byte* DK) {
   prga(Sbox, q*n*k, RM1);
   Cube<byte> rm1(RM1,1,1,q*n*k);
   rm1.reshape(n,k,q);
-  
+  IDAmat=rm1;
+/*    
   cout<<"rm1"<<endl;
   cout<<rm1<<endl;
 
@@ -184,7 +216,12 @@ void buildKRankIDA(Cube<byte>& IDAmat, int q, int n, int k, byte* DK) {
     IDAmat.slice(i)=sub;
 
 
+    cout<<"det "<<i<<endl;
+    mat toto=conv_to<mat>::from(sub);
+    cout<<det(toto)<<endl;
+
   }
+*/
   cout<<IDAmat<<endl;
 
 }
@@ -194,6 +231,9 @@ void buildKRankIDA(Cube<byte>& IDAmat, int q, int n, int k, byte* DK) {
 int main( int argc, char *argv[] ) {
 
 
+
+  int full=0;
+  
   int q=2;
   int n=4;
   int k=4;
@@ -235,31 +275,41 @@ int main( int argc, char *argv[] ) {
 
 
 
-/*
-// Initialization of IDA and inverse IDA matrix
-  Cube<byte> IDAmat(n,n,q);
-  Cube<short> invIDAmat(n,n,q);
-  buildFullRankIDA(IDAmat, invIDAmat, q, n, &DK[0]);
-*/
 
 
+  int lc;
+  int sizeFile;
+  Mat<byte> M;
+  if(full)
+    M=readFullFile(n,k,sizeFile,lc);
+  else
+    M=readPartialFile(n,k,sizeFile,lc);
+
+  // cout<<"M "<<endl;
+  // cout<<M<<endl;
+  
 
-  Cube<byte> IDAmat(n,k,q);
-  buildKRankIDA(Cube<byte>& IDAmat, q, n, k, &DK[0]);
+  arma_rng::set_seed(time(NULL));
 
-  // rc4key(&DK[8], sc, 16);
-  
-  
+// Initialization of IDA and inverse IDA matrix
 
+  Cube<byte> IDAmat;
+  Cube<short> invIDAmat;
   
-  arma_rng::set_seed(time(NULL));
+  if(full)
+  {
+    IDAmat.resize(n,n,q);
+    invIDAmat.resize(n,n,q);
+    buildFullRankIDA(IDAmat, invIDAmat, q, n, &DK[0]);
+  }
+  else {
+    IDAmat.resize(n,k,q);
+    buildPartialRankIDA(IDAmat, q, n, k, &DK[0]);
+  }
+
+
 
 
-  int lc;
-  int sizeFile;
-  Mat<byte> M=readFile(n,k,sizeFile,lc);
 
 //  Ma<byte> data;
 //  data.load("/home/couturie/ajeter/lena.png");
@@ -274,20 +324,36 @@ int main( int argc, char *argv[] ) {
   cout<<C<<endl;
 */
 
-  
-  Mat<byte> C=IDAmat.slice(0)*M;
-  M.save("M.bin",raw_binary);
-//  Mat<short> D=invIDAmat.slice(0)*C;
 
+  Mat<byte> C;
+  Mat<char> D2;
+  C=IDAmat.slice(0)*M;
+  M.save("M.bin",raw_binary);
+  
+  if(full) {
+    //Mat<short> D=invIDAmat.slice(0)*C;
 
-  mat A=conv_to<mat>::from(IDAmat.slice(0).submat(0,0,k-1,n-1));
-  mat B=conv_to<mat>::from(C.submat(0,0,k-1,lc-1));
+    
+    mat A=conv_to<mat>::from(IDAmat.slice(0).submat(0,0,n-1,n-1));
+    mat B=conv_to<mat>::from(C.submat(0,0,n-1,lc-1));
+    mat D=solve(A,B);
+    cout<<D<<endl;
+    
 
-  mat D=solve(A,B);
+    D2=conv_to<Mat<char>>::from(D);
+  }
+  else {
+    mat A=conv_to<mat>::from(IDAmat.slice(0).submat(0,0,n-1,k-1));
+    mat B=conv_to<mat>::from(C.submat(0,0,n-1,lc-1));
+    mat D=solve(A,B);
+    
+    cout<<D<<endl;
+    D2=conv_to<Mat<char>>::from(D);    
+  }
 
   
 
-  Mat<char> D2=conv_to<Mat<char>>::from(D);
+
 //  cout<<"D2"<<endl;
 //  cout<<D2<<endl;
 //  D2.save("D2.bin",raw_binary);