CryptDecode com modificador CRYPT_ARCH_ZIP - Como usar? - página 5

 
Mikalas:

Em seguida, diga o que você quer corretamente.

Há um código no início de seu tópico.

Você está lendo o arquivo inteiro e está tentando decodificá-lo com o cabeçalho!

Qualquer arquivo ZIP criado por um empacotador padrão tem um CABEÇALHO!

O desembalador MQL5 NÃO pula o cabeçalho.

Portanto, não se pode desembalar dados.

Então, explique:

Inicialmente o que você PRECISA?

Deixe-me tentar explicar uma última vez:

O retângulo amarelo na janela superior é a palavra "teste" embalada pelo CryptEncode. O retângulo amarelo abaixo é a palavra "teste" embalada pelo arquivador de zíper padrão. A questão é porque os retângulos são diferentes, e como fazer com que seu conteúdo seja o mesmo.

 
C-4:

Vou tentar explicar uma última vez:

O retângulo amarelo na janela superior é a palavra "teste" embalada com CryptEncode. O retângulo amarelo na parte inferior é a palavra "teste" embalada pelo arquivador de zíper padrão. A questão é por que os retângulos são diferentes e como tornar seu conteúdo igual.

Porque são utilizados métodos de compressão DIFERENTES

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

 

há algo de errado com o arquivamento

Arquivo com uma chave, desarquivo com outra chave e está tudo bem:

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



ou as chaves são usadas apenas para criptografia?

 
O algoritmo tem ajustes. Talvez seja sobre eles. Então você precisa descobrir o que eles são na MQL5.
 
Parece que as chaves só são válidas para criptografia.
 
TheXpert:
O algoritmo tem ajustes. Talvez seja sobre eles. Então você precisa descobrir o que eles são na MQL5.

torturá-los ou algo assim?

Eles dirão que somos canalhas que não sabem como funciona o algoritmo de arquivamento )

 
TheXpert:
O algoritmo tem ajustes. Talvez seja sobre eles. Então você precisa descobrir o que eles são na MQL5.
O algoritmo deve certamente ter alguns ajustes, pelo menos, o ajuste da taxa de compressão. O único lugar onde você pode passar estas configurações para CryptDecode é a chave. Se não é sensível à chave, então não está usando-a. Isto é ruim, porque neste caso você não pode descomprimir arquivos de terceiros, nem embalar seu próprio arquivo para uso em arquivadores de terceiros.
 
Mikalas:

Porque são utilizados métodos de compressão DIFERENTES

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

Michael, não vamos brincar de "Capitão Óbvio". Todos sabemos que o zip é diferente e todos sabemos o que é um cabeçalho de arquivo.
 
sanyooooook:

devemos torturá-los?

Eles dirão que somos canalhas que não sabem como funciona o algoritmo de arquivamento)

Muito provavelmente outra função bruta onde as características são delineadas mas ainda não implementadas.
 

Desembalar os arquivos ZIP padrão!

(por enquanto, apenas com um arquivo embalado no arquivo, mais tarde eu o farei para vários (se necessário) )

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