问题描述
我试图理解 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,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 加密/解密工具来验证您在此处提供的结果:The online toolbox