CryptDecode with modifier CRYPT_ARCH_ZIP - How to use? - ページ 5

 
Mikalas:

そして、自分が何を望んでいるかを正しく述べる。

トピックの冒頭にコードがあります。

アーカイブ全体を 読んでいるのに、ヘッダーで 解読しようとしているのか!

標準的なパッカーで作成されたZIPアーカイブには、HEADERがあります!

MQL5のアンパッカーは、ヘッダをスキップ しません。

そのため、データの解凍はできません。

では、説明してください。

最初は何が必要なのか?

最後にもう一度、説明させてください。

トップウィンドウの黄色い四角は、CryptEncodeで パックされた「test」の文字です。下の黄色い四角は、標準的なZIPアーカイバでパックされた「test」という文字です。問題は、なぜ長方形が違うのか、そしてその内容を同じにするにはどうしたらいいのか、ということです。

 
C-4:

最後にもう一度説明します。

トップウィンドウの黄色い四角は、CryptEncodeで詰めた「test」の文字です。下部の黄色い四角は、標準のZIPアーカイバでパックされた「test」の文字です。問題は、なぜ長方形が違うのか、どうすればその中身が均等になるのか、ということです。

圧縮方式が異なるため

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に 渡すことができるのは、キーだけです。キーに感応しないのであれば、そのキーは使われていないことになります。この場合、サードパーティのアーカイブを展開することも、サードパーティのアーカイバで使用するために独自のアーカイブをパックすることもできないので、これは悪いことです。
 
Mikalas:

圧縮方式が異なるため

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

マイケル、「Captain Obvious」ごっこはやめましょうよ。ZIPは違うし、アーカイブヘッダーが何なのかはみんな知っている。
 
sanyooooook:

拷問すべきなのか?

アーカイブのアルゴリズムの仕組みを知らない悪党と言われそうですが......。)

また、機能概要が決まっていて、まだ実装されていない粗悪な機能である可能性が高い。
 

標準的なZIPファイルを解凍することができます。

(今は、アーカイブの中の1つのパックされたファイルだけですが、後で、(必要なら)複数のファイルに対して作るつもりです)

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 );
   }
理由: