CryptDecode con modificatore CRYPT_ARCH_ZIP - Come usare? - pagina 5

 
Mikalas:

Allora dichiarate correttamente ciò che volete.

C'è del codice all'inizio del tuo topic.

Stai leggendo l'intero archivio e stai cercando di decodificarlo con l'intestazione!

Qualsiasi archivio ZIP creato da un packer standard ha un HEADER!

Lospacchettatore MQL5 NON salta l'intestazione.

Pertanto, non è possibile decomprimere i dati.

Quindi, spiega:

Inizialmente di cosa avete bisogno?

Lasciatemi provare a spiegare un'ultima volta:

Il rettangolo giallo nella finestra superiore è la parola "test" confezionata da CryptEncode. Il rettangolo giallo in basso è la parola "test" impacchettata dall'archiviatore zip standard. La domanda è perché i rettangoli sono diversi, e come rendere il loro contenuto uguale.

 
C-4:

Cercherò di spiegare un'ultima volta:

Il rettangolo giallo nella finestra superiore è la parola "test" confezionata con CryptEncode. Il rettangolo giallo in basso è la parola "test" confezionata dall'archiviatore zip standard. La domanda è perché i rettangoli sono diversi e come rendere uguale il loro contenuto.

Perché vengono utilizzati DIVERSI metodi di compressione

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

 

c'è qualcosa di sbagliato nell'archiviazione

Archivio con una chiave, disarchivio con un'altra chiave e va bene:

//+------------------------------------------------------------------+
//| 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());
  }
 



o le chiavi sono usate solo per la crittografia?

 
L'algoritmo ha delle impostazioni. Forse si tratta di loro. Allora dovete scoprire cosa sono in MQL5.
 
Sembra che le chiavi siano valide solo per la crittografia.
 
TheXpert:
L'algoritmo ha delle impostazioni. Forse si tratta di loro. Allora dovete scoprire cosa sono in MQL5.

torturarli o qualcosa del genere?

Diranno che siamo dei mascalzoni che non sanno come funziona l'algoritmo di archiviazione)

 
TheXpert:
L'algoritmo ha delle impostazioni. Forse si tratta di loro. Allora dovete scoprire cosa sono in MQL5.
L'algoritmo deve certamente avere delle impostazioni, almeno l'impostazione del rapporto di compressione. L'unico posto dove potete passare queste impostazioni a CryptDecode è la chiave. Se non è sensibile alla chiave, allora non la sta usando. Questo è un male, perché in questo caso non puoi né spacchettare un archivio di terze parti, né impacchettare il tuo per usarlo in archiviatori di terze parti.
 
Mikalas:

Perché vengono utilizzati DIVERSI metodi di compressione

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

Michael, non giochiamo a "Capitan Ovvio". Sappiamo tutti che lo zip è diverso e sappiamo tutti cos'è un'intestazione di archivio.
 
sanyooooook:

dovremmo torturarli?

Diranno che siamo dei farabutti che non sanno come funziona l'algoritmo di archiviazione)

Molto probabilmente un'altra funzione grezza in cui le caratteristiche sono delineate ma non ancora implementate.
 

Decomprimere i file ZIP standard!

(per ora, solo con un file impacchettato nell'archivio, più tardi lo farò per diversi (se necessario))

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 );
   }
Motivazione: