带有修改器CRYPT_ARCH_ZIP的CryptDecode - 如何使用? - 页 5

 
Mikalas:

然后正确地说明你想要什么。

在你的主题的开头有代码。

你正在阅读整个 档案,你正试图用标题 来解码!这是不可能的。

任何由标准打包器创建的ZIP档案都有一个HEADER!

MQL5解包程序不跳过头

因此,你不能解压数据。

那么,请解释一下。

最初你需要的是什么?

让我尝试最后一次解释。

顶部窗口中的黄色矩形是由CryptEncode 包装的 "测试 "一词。下面的黄色矩形是由标准zip存档器包装的 "测试 "一词。问题是为什么这些矩形是不同的,以及如何使它们的内容相同。

 
C-4:

我将尝试最后一次解释。

顶部窗口中的黄色矩形是用CryptEncode包装的 "测试 "一词。底部的黄色矩形是由标准zip存档器包装的 "测试 "字样。问题是为什么矩形是不同的,如何使它们的内容相等。

因为使用的是不同的压缩方法

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

迈克尔,让我们不要扮演 "明显的船长"。我们都知道zip是不同的,我们都知道什么是存档头。
 
sanyooooook:

我们应该折磨他们吗?

他们会说我们是无赖,不知道归档算法如何运作)

很可能是另一个粗略的功能,其中的功能被概述,但还没有实现。
 

解开标准的ZIP文件!

(目前,档案中只有一个打包的文件,以后我将为多个文件打包(如果需要) )

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