CryptDecode с модификатором CRYPT_ARCH_ZIP - Как использовать? - страница 5

 
Mikalas:

Тогда правильно излагайте то, что Вы хотите.

В начале Вашего топика приведён код.

Вы читаете архив полностью и вы пытаетесь его декодировать вместе с заголовком

У любого ZIP архива, созданного стандартным запаковщиком, есть ЗАГОЛОВОК! 

Распаковщик MQL5 НЕ пропускает заголовок

Поэтому Вы и не можете распаковать данные. 

Так поясните:

Изначально что Вам НУЖНО? 

Попробую объяснить последний раз:

 

Желтый прямоугольничик в верхнем окне - слово "test" запакованное CryptEncode. Желтый прямоугольник внизу - слово "test" запакованное стандартным zip архиватором. Вопрос - почему прямоугольнички разные, и как сделать так, что бы их содержимое было одинаковым.

 
C-4:

Попробую объяснить последний раз:

 

Желтый прямоугольничик в верхнем окне - слово "test" запакованное CryptEncode. Желтый прямоугольник внизу - слово "test" запакованное стандартным zip архиватором. Вопрос - почему прямоугольнички разные, и как сделать так, что бы их содержимое было одинаковым.

Потому, что используются РАЗНЫЕ методы компрессии

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

 

что-то там с архивацией безобразие какое-то

архивирую одним ключом, разархивирую другим ключом и всё нормально:

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



или ключи только для шифрования используются?

 
У алгоритма есть настройки. Возможно дело в них. Тогда вам надо узнать какие они в MQL5.
 
походу ключи только на шифрование действуют.
 
TheXpert:
У алгоритма есть настройки. Возможно дело в них. Тогда вам надо узнать какие они в MQL5.

пытать их что ли?

они ещё предъявят что мы негодяи не знаем как алгоритм архивирования работает )

 
TheXpert:
У алгоритма есть настройки. Возможно дело в них. Тогда вам надо узнать какие они в MQL5.
У алгоритма однозначно должны быть настройки, как минимум установка степени сжатия. Единственное место, где можно передать эти настройки функции CryptDecode, это ключ key. Если она не чувствительна к ключу, следовательно она его не использует. А это плохо, т.к. в этом случае нельзя ни распаковать сторонний архив, не запаковать свой, для использования в сторонних архиваторах.
 
Mikalas:

Потому, что используются РАЗНЫЕ методы компрессии

http://tools.ietf.org/html/rfc1951&nbsp;

Михаил, давайте не будем играть в "капитана очевидность". Мы здесь все в курсе что zip бывает разный и мы все знаем что такое заголовок архива.
 
sanyooooook:

пытать их что ли?

они ещё предъявят что мы негодяи не знаем как алгоритм архивирования работает )

Скорее всего очередная сырая функция, где возможности очерчены, но еще не реализованы.
 

Распаковывает стандартные ZIP файлы!

(пока, только с одним запакованным файлом в архиве, потом сделаю для нескольких (если надо) ) 

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 );
   }
Причина обращения: