CryptDecode con modificador CRYPT_ARCH_ZIP - ¿Cómo utilizarlo? - página 5

 
Mikalas:

A continuación, exponga correctamente lo que desea.

Hay un código al principio de su tema.

¡Estás leyendo todo el archivo y tratas de decodificarlo con la cabecera!

¡Cualquier archivo ZIP creado por un empaquetador estándar tiene un HEADER!

El desempaquetador MQL5 NO omite la cabecera.

Por lo tanto, no se pueden descomprimir los datos.

Entonces, explíquese:

Inicialmente, ¿qué necesitas?

Permítanme que intente explicarlo por última vez:

El rectángulo amarillo de la ventana superior es la palabra "test" empaquetada por CryptEncode. El rectángulo amarillo de abajo es la palabra "test" empaquetada por el archivador zip estándar. La cuestión es por qué los rectángulos son diferentes, y cómo hacer que su contenido sea el mismo.

 
C-4:

Intentaré explicarlo una última vez:

El rectángulo amarillo de la ventana superior es la palabra "test" empaquetada con CryptEncode. El rectángulo amarillo de la parte inferior es la palabra "test" empaquetada por el archivador zip estándar. La cuestión es por qué los rectángulos son diferentes y cómo hacer que su contenido sea igual.

Porque se utilizan diferentes métodos de compresión

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

 

hay algo que no funciona en el archivo

Yo archivo con una llave, desarchivo con otra llave y no pasa nada:

//+------------------------------------------------------------------+
//| 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 las claves sólo se utilizan para el cifrado?

 
El algoritmo tiene ajustes. Tal vez se trate de ellos. Entonces hay que averiguar cuáles son en MQL5.
 
Parece que las claves sólo son válidas para el cifrado.
 
TheXpert:
El algoritmo tiene ajustes. Tal vez se trate de ellos. Entonces hay que averiguar cuáles son en MQL5.

¿Torturarlas o algo así?

Dirán que somos unos sinvergüenzas que no sabemos cómo funciona el algoritmo de archivo )

 
TheXpert:
El algoritmo tiene ajustes. Tal vez se trate de ellos. Entonces hay que averiguar cuáles son en MQL5.
El algoritmo debe tener ciertamente algunos ajustes, al menos, el ajuste de la relación de compresión. El único lugar donde se pueden pasar estas configuraciones a CryptDecode es la clave. Si no es sensible a la clave, entonces no la utiliza. Esto es malo, porque en este caso no puedes descomprimir un archivo de terceros, ni empaquetar tu propio archivo para usarlo en archivadores de terceros.
 
Mikalas:

Porque se utilizan diferentes métodos de compresión

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

Michael, no juguemos al "Capitán Obvio". Todos sabemos que el zip es diferente y todos sabemos lo que es una cabecera de archivo.
 
sanyooooook:

¿debemos torturarlos?

Dirán que somos unos sinvergüenzas que no sabemos cómo funciona el algoritmo de archivo)

Lo más probable es que se trate de otra función rudimentaria en la que se esbozan las características pero que aún no se han implementado.
 

Descomprimir archivos ZIP estándar

(por ahora, sólo con un archivo empaquetado en el archivo, más adelante lo haré para varios (si es necesario) )

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