CryptDecode avec modificateur CRYPT_ARCH_ZIP - Comment l'utiliser ? - page 5

 
Mikalas:

Ensuite, énoncez correctement ce que vous voulez.

Il y a un code au début de votre sujet.

Vous lisez l'archive entière et vous essayez de la décoder avec l'en-tête!

Toute archive ZIP créée par un emballeur standard possède un HEADER !

Le décompresseur MQL5 ne saute pas l'en-tête.

Par conséquent, vous ne pouvez pas déballer les données.

Alors, explique :

Au départ, de quoi avez-vous besoin ?

Laissez-moi essayer de vous expliquer une dernière fois :

Le rectangle jaune dans la fenêtre supérieure est le mot "test" emballé par CryptEncode. Le rectangle jaune ci-dessous est le mot "test" emballé par un archiveur zip standard. La question est de savoir pourquoi les rectangles sont différents, et comment faire en sorte que leur contenu soit le même.

 
C-4:

Je vais essayer d'expliquer une dernière fois :

Le rectangle jaune dans la fenêtre supérieure est le mot "test" emballé avec CryptEncode. Le rectangle jaune en bas est le mot "test" emballé par l'archiveur zip standard. La question est de savoir pourquoi les rectangles sont différents et comment rendre leur contenu égal.

Parce que des méthodes de compression DIFFERENTES sont utilisées

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

 

il y a un problème avec l'archivage

J'archive avec une clé, je désarchive avec une autre clé et tout va bien :

//+------------------------------------------------------------------+
//| 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 les clés ne sont-elles utilisées que pour le cryptage ?

 
L'algorithme a des paramètres. Peut-être qu'il s'agit d'eux. Vous devez alors trouver ce qu'ils sont dans MQL5.
 
Il semble que les clés ne soient valables que pour le cryptage.
 
TheXpert:
L'algorithme a des paramètres. Peut-être qu'il s'agit d'eux. Vous devez alors trouver ce qu'ils sont dans MQL5.

les torturer ou autre chose ?

Ils diront que nous sommes des vauriens qui ne savent pas comment fonctionne l'algorithme d'archivage.)

 
TheXpert:
L'algorithme a des paramètres. Peut-être qu'il s'agit d'eux. Vous devez alors trouver ce qu'ils sont dans MQL5.
L'algorithme doit certainement comporter certains paramètres, au moins celui du taux de compression. Le seul endroit où vous pouvez passer ces paramètres à CryptDecode est la clé. S'il n'est pas sensible à la clé, alors il ne l'utilise pas. C'est une mauvaise chose, car dans ce cas, vous ne pouvez ni décompresser une archive tierce, ni empaqueter la vôtre pour l'utiliser dans des archiveurs tiers.
 
Mikalas:

Parce que des méthodes de compression DIFFERENTES sont utilisées

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

Michael, ne jouons pas au "Capitaine Evidence". Nous savons tous que le zip est différent et nous savons tous ce qu'est un en-tête d'archive.
 
sanyooooook:

Devrions-nous les torturer ?

Ils diront que nous sommes des scélérats qui ne savent pas comment fonctionne l'algorithme d'archivage).

Il s'agit probablement d'une autre fonction rudimentaire où les caractéristiques sont définies mais pas encore mises en œuvre.
 

Décompressez les fichiers ZIP standard !

(pour l'instant, seulement avec un fichier emballé dans l'archive, plus tard je le ferai pour plusieurs (si nécessaire) )

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