CRYPT_ARCH_ZIP değiştiricili CryptDecode - Nasıl kullanılır? - sayfa 5

 
Mikalas :

Ardından tam olarak ne istediğinizi belirtin.

Konunuzun başında kod var.

Arşivi bütünüyle okuyorsunuz ve başlıkla birlikte onu deşifre etmeye çalışıyorsunuz!

Standart bir paketleyici tarafından oluşturulan herhangi bir ZIP arşivinin bir HEADER'ı vardır!

MQL5 paket açıcı, .

Bu nedenle, verileri paketinden çıkaramazsınız.

Açıklayın:

İlk etapta neye ihtiyacınız var?

Son kez açıklamaya çalışacağım:

Üst kutudaki sarı kutu, CryptEncode tarafından sarılmış "test" kelimesidir. Alttaki sarı dikdörtgen, standart bir zip arşivleyici ile paketlenmiş "test" kelimesidir. Soru, dikdörtgenlerin neden farklı olduğu ve içeriklerinin nasıl aynı hale getirileceğidir.

 
C-4 :

Son kez açıklamaya çalışacağım:

Üst penceredeki sarı dikdörtgen, CryptEncode tarafından sarılmış "test" kelimesidir. Alttaki sarı dikdörtgen, standart bir zip arşivleyici ile paketlenmiş "test" kelimesidir. Soru, dikdörtgenlerin neden farklı olduğu ve içeriklerinin nasıl aynı hale getirileceğidir.

FARKLI sıkıştırma yöntemleri kullanıldığı için

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

 

orada bir çeşit rezalet arşivleyen bir şey

Bir anahtarla arşivliyorum, başka bir anahtarla açıyorum ve her şey yolunda:

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



Yoksa anahtarlar sadece şifreleme için mi kullanılıyor?

 
Algoritmanın ayarları vardır. Belki onlardandır. O zaman MQL5'te ne olduklarını bulmanız gerekir.
 
Kampanya anahtarları yalnızca şifreleme üzerinde çalışır.
 
TheXpert :
Algoritmanın ayarları vardır. Belki onlardandır. O zaman MQL5'te ne olduklarını bulmanız gerekir.

onlara eziyet etmek mi?

yine de biz alçakların arşivleme algoritmasının nasıl çalıştığını bilmediğimizi gösterecekler)

 
TheXpert :
Algoritmanın ayarları vardır. Belki onlardandır. O zaman MQL5'te ne olduklarını bulmanız gerekir.
Algoritma kesinlikle ayarlara sahip olmalıdır, en azından sıkıştırma oranını ayarlar. Bu ayarları CryptDecode işlevine aktarabileceğiniz tek yer anahtardır. Anahtara karşı hassasiyeti yoksa kullanmaz. Ve bu kötü çünkü. bu durumda, üçüncü taraf arşivleyicilerde kullanmak için üçüncü taraf arşivini açamaz veya kendinizinkini paketleyemezsiniz.
 
Mikalas :

FARKLI sıkıştırma yöntemleri kullanıldığı için

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

Michael, "Kaptan Apaçık" oynamayalım. Burada hepimiz zip'in farklı olduğunun farkındayız ve hepimiz bir arşiv başlığının ne olduğunu biliyoruz.
 
sanyooooook :

onlara eziyet etmek mi?

yine de biz alçakların arşivleme algoritmasının nasıl çalıştığını bilmediğimizi gösterecekler)

Büyük olasılıkla, olasılıkların ana hatlarıyla belirtildiği ancak henüz uygulanmadığı başka bir ham özellik.
 

Standart ZIP dosyalarını açar!

(şimdiye kadar, arşivde yalnızca bir paketlenmiş dosya varken, o zaman birkaç tane yapacağım (gerekirse) )

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