为什么 mql4 中的 CryptEncode() 与其他语言不同?

Why is CryptEncode() in mql4 different from other languages?

我试图理解 CryptEncode() 以便在 mt4 指标和 PHP 服务器之间发送和接收字符串。

但是当字符串在 mql4 端加密时,它与在 PHP 端加密时完全不同。两端使用相同的密钥和相同的加密算法,但两端的加密方式仍然不同。

当我使用在线工具解密 PHP 加密字符串时,它成功解密了字符串,而当我使用 mql4 生成的加密字符串时,它说最后一个块没有正确填充。

代码:

   string text="this is the text to be encoded";
   string keystr="d41d8cd98f00b204e9800998ecf8427e";
   uchar src[],dst[],key[];
    
    StringToCharArray(text,src);
    StringToCharArray(keystr,key);
    
       int encd=CryptEncode(CRYPT_AES256,src,key,dst);
       encd=CryptEncode(CRYPT_BASE64,dst,key,src);
       if(encd>0)
        {
          PrintFormat("Encoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
        }
      else
         Print("Error in CryptEncode. Error code=",GetLastError());

为什么 mql4 生成的加密字符串与任何其他语言生成的字符串不同?如何避免这个问题?是否有任何替代加密库可用于避免此问题?

没有什么不同,只是 MQL4 仅支持非常具体的 AES 加密实现,除非您在其他代码中使用正确的设置,否则您将无法实现两个平台之间的兼容性。

具体来说,您需要确保实施以下内容:

  • 填充模式:零
  • 密码模式:ECB(因此没有 IV)
  • 密钥大小:256
  • 块大小:128

您可以尝试使用在线 AES encryption/decryption 工具来验证您的结果:The online toolbox