CryptDecode mit Modifikator CRYPT_ARCH_ZIP - Wie verwenden? - Seite 5

 
Mikalas:

Dann geben Sie richtig an, was Sie wollen.

Am Anfang des Themas befindet sich ein Code.

Sie lesen das gesamte Archiv und versuchen, es mit der Kopfzeile zu entschlüsseln!

Jedes ZIP-Archiv, das mit einem Standard-Packer erstellt wird, hat einen HEADER!

DerMQL5-Entpacker überspringt NICHT den Header.

Daher können Sie keine Daten entpacken.

Also, erklären Sie:

Was brauchen Sie zunächst einmal?

Lassen Sie mich ein letztes Mal versuchen, das zu erklären:

Das gelbe Rechteck im oberen Fenster ist das von CryptEncode gepackte Wort "test". Das gelbe Rechteck darunter ist das Wort "test", gepackt von einem Standard-Zip-Archivierer. Die Frage ist, warum die Rechtecke unterschiedlich sind und wie man ihren Inhalt gleich machen kann.

 
C-4:

Ich werde ein letztes Mal versuchen, das zu erklären:

Das gelbe Rechteck im oberen Fenster ist das Wort "test", gepackt mit CryptEncode. Das gelbe Rechteck am unteren Rand ist das Wort "test", das vom Standard-Zip-Archivierungsprogramm gepackt wird. Die Frage ist, warum die Rechtecke unterschiedlich sind und wie man ihren Inhalt gleich machen kann.

Weil UNTERSCHIEDLICHE Komprimierungsmethoden verwendet werden

http://tools.ietf.org/html/rfc1951

 

mit der Archivierung ist etwas nicht in Ordnung

Ich archiviere mit einem Schlüssel, entarchiviere mit einem anderen Schlüssel und alles ist in Ordnung:

//+------------------------------------------------------------------+
//| ArrayToHex                                                       |
//+------------------------------------------------------------------+
string ArrayToHex(uchar &arr[],int count=-1)
  {
   string res="";
//--- проверка размера
   if(count<0 || count>ArraySize(arr))
      count=ArraySize(arr);
//--- преобразование в шестнадцатиричную строку
   for(int i=0; i<count; i++)
      res+=StringFormat("%.2X",arr[i]);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string text="sdfgghjdfggfghjghghjk,g";
   string keystr="asgfgfdfgfghjhjmhjmfhjmhjmhjmhjmhjhj";
   uchar src[],dst[],key[];
//--- подготовка ключа шифрования
   StringToCharArray(keystr,key);
//--- подготовка исходного массива src[]
   StringToCharArray(text,src);
//--- вывод исходных данных
   PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
//--- шифрование массива src[] методом DES с 56-битным ключом key[]
   int res=CryptEncode(CRYPT_ARCH_ZIP,src,key,dst);
   keystr="asgfgfdfg";
   StringToCharArray(keystr,key);
//--- проверка результата шифрования
   if(res>0)
     {
      //--- вывод шифрованных данных
      PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst));
      //--- расшифровка данных массива dst[] методом DES с 56-битным ключом key[]
      res=CryptDecode(CRYPT_ARCH_ZIP,dst,key,src);
      //--- проверка результата
      if(res>0)
        {
         //--- вывод дешифрованных данных
         PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
        }
      else
         Print("Ошибка в CryptDecode. Код ошибки=",GetLastError());
     }
   else
      Print("Ошибка в CryptEncode. Код ошибки=",GetLastError());
  }
 



oder werden die Schlüssel nur zur Verschlüsselung verwendet?

 
Der Algorithmus verfügt über Einstellungen. Vielleicht geht es ja um sie. Dann müssen Sie herausfinden, was sie in MQL5 sind.
 
Es sieht so aus, als ob die Schlüssel nur für die Verschlüsselung gültig sind.
 
TheXpert:
Der Algorithmus verfügt über Einstellungen. Vielleicht geht es ja um sie. Dann müssen Sie herausfinden, was sie in MQL5 sind.

sie zu foltern oder so?

Sie werden sagen, wir seien Schurken, die nicht wissen, wie der Archivierungsalgorithmus funktioniert.)

 
TheXpert:
Der Algorithmus verfügt über Einstellungen. Vielleicht geht es ja um sie. Dann müssen Sie herausfinden, was sie in MQL5 sind.
Der Algorithmus muss sicherlich einige Einstellungen haben, zumindest die Einstellung des Kompressionsverhältnisses. Der einzige Ort, an dem Sie diese Einstellungen an CryptDecode übergeben können, ist der Schlüssel. Wenn er nicht auf den Schlüssel reagiert, dann benutzt er ihn nicht. Das ist schlecht, denn in diesem Fall können Sie weder das Archiv eines Drittanbieters dekomprimieren, noch Ihr eigenes Archiv für die Verwendung in Archivierungsprogrammen von Drittanbietern packen.
 
Mikalas:

Weil UNTERSCHIEDLICHE Komprimierungsmethoden verwendet werden

http://tools.ietf.org/html/rfc1951

Michael, lass uns nicht "Captain Obvious" spielen. Wir alle wissen, dass zip anders ist, und wir alle wissen, was ein Archiv-Header ist.
 
sanyooooook:

Sollten wir sie foltern?

Sie werden sagen, dass wir Schurken sind, die nicht wissen, wie der Archivierungsalgorithmus funktioniert.)

Wahrscheinlich handelt es sich um eine weitere grobe Funktion, deren Funktionen zwar skizziert, aber noch nicht implementiert sind.
 

Entpacken Sie Standard-ZIP-Dateien!

(im Moment nur mit einer gepackten Datei im Archiv, später werde ich es für mehrere machen (falls nötig) )

string file_name = "";
   uchar array[];
   uchar key[];
   uchar result[];
//---   
   int handle = FileOpen( "GAZR-6.15.zip", FILE_READ|FILE_BIN ); //Здесь имя Вашего файла и гдe лежит! 
   if ( handle != INVALID_HANDLE )
   {
     FileSeek( handle, 18, SEEK_SET );
     long pack_unp_size = FileReadLong( handle );
     long pack_size = ( pack_unp_size & 0xFFFFF );
     long unp_size = ( pack_unp_size >> 32 );
     long names_len = FileReadLong( handle ); 
     long fn_len = ( names_len & 0xFF );
     long extr_fild_len = ( ( names_len & 0xFF00 ) >> 8 );
     FileSeek( handle, 30, SEEK_SET );
     uint fn_res = FileReadArray( handle, array, 0, int( fn_len ) );
     if ( fn_res == uint( fn_len ) )
     {
       for ( int i = 0; i < int( fn_res ); i++ )
       {
         file_name += CharToString( array[i] );
       }
     }
     if ( extr_fild_len != 0 )
     {
       FileSeek( handle, 30 + fn_len + extr_fild_len, SEEK_SET );
     }
     else
     {
       FileSeek( handle, 30 + fn_len, SEEK_SET );
     }
//---
     ArrayResize( array, int( pack_size ) + 6 );
     
     uint ar_res = FileReadArray( handle, array, 2, int( pack_size ) );
     if ( ar_res == uint( pack_size ) ) 
     {
       array[0] = 120;
       array[1] = 94;
       array[int( pack_size ) + 2] = 193;
       array[int( pack_size ) + 3] = 12;
       array[int( pack_size ) + 4] = 31;
       array[int( pack_size ) + 5] = 159;
       ArrayResize( key, int( pack_size ) + 6 );
       for ( int i = 0; i < int( pack_size ) + 6; i++ ) key[i] = 0;
       ResetLastError();
       int dec_res = CryptDecode( CRYPT_ARCH_ZIP, array, key, result );
       if ( dec_res == int( unp_size ) )
       {
         Print( "Data unpack! File name = ", file_name );
       }
       else
       {
         Print( GetLastError() );
       }  
     }     
     FileClose( handle );
   }