利用外部应用程序进行加密·综合运用
(3/3)· 从 AES128 到哈希校验,把 MQL5 与外部程序的加解密通路一次性跑通
把密文搬进 MT5 并跑通解密
实操收尾这一步很直接:把刚生成的 lic_C++.txt 丢进 MetaTrader 数据目录下的 Files 文件夹,再用前面写好的 deleteuser.mq5 脚本触发解密。实测结果是文件长度有波动,但内容完整还原,说明跨程序密文搬移链路是通的。 关键产出不是文件本身,而是验证出一套加解密参数,能稳定把密文从一个程序送到另一个程序里解出来。后续若在 MT5 里解密失败,优先怀疑调用端代码逻辑出错,而不是参数体系不可用——外汇与贵金属环境里这类文件传递涉及本地敏感数据,操作前请确认终端权限与高风险敞口。
「跨环境哈希对齐的坑在字符串转数组」
哈希是把任意长度数组压成固定长度指纹的单向过程,原始数据差一位,哈希值就可能完全不同,所以常用于密码存储比对而非可逆加密。在 MT5 里算 SHA256,直接调 CryptEncode 并指定 CRYPT_HASH_SHA256,输出恒为 32 字节,源串长短不影响这个结果。 用 "qwertyuiopasdfgh" 跑一遍,MQL5 脚本和 C++ 算出的哈希一致,但 C# 用 Encoding.ASCII.GetBytes 得到的却不一样。查下来问题出在 MQL 的 StringToCharArray:它会在尾端补一个 '0' 字节,比如串 "a" 转完变成两个元素 [a, 0],而 C# 不会补。 补零差异导致哈希错位。修法是 C# 侧手动 Append 一个 0 再算,三端即对齐;或者反过来在 MQL 侧去掉尾零。验证文件 sha256.bin、sha256_c#.bin、sha256_С++.bin 可交叉比对。外汇与贵金属相关的程序若涉及凭证哈希,请注意这类跨语言细节失误会带来兼容性高风险,且交易环境本身杠杆高、容错低。 别把 StringToCharArray 当透明转换 它静默加尾零这件事文档不显眼,却是三端哈希分歧的唯一变量。开 MT5 把下面代码丢进脚本,打印 result 长度就能当场抓到多出的字节。
class="type">class="kw">string k = "qwertyuiopasdfgh"; class="type">uchar key[], result[], enc[]; StringToCharArray(k, enc); class="type">int sha = CryptEncode(CRYPT_HASH_SHA256,enc,key,result); class="type">class="kw">string sha256; for(class="type">int i = class="num">0; i < sha; i++) sha256 += StringFormat("%X ",result[i]); Print("SHA256 len: ",sha," Value: ",sha256); class="type">int h = FileOpen("sha256.bin", FILE_WRITE | FILE_BIN); if (h == INVALID_HANDLE) { Print("File create failed: sha256.bin"); }else { FileWriteArray(h, result); FileClose(h); }
◍ 许可证落盘别死磕字节数组
MQL5 里加密解密不是高频需求,但一旦要做许可证校验就绕不开落盘格式。原文作者选了字节数组做加解密演示:加密后写文件、再读回解密,思路直白,可实操性很差。 把原始结构塞进数组再解包,只要一个数位错位,整个许可证就废了。再加上 MQL5 里 int、double、string 等类型 size 不一致,这种损坏概率并不低。外汇/贵金属 EA 授权这种事,出错就是客户端起不来,高风险且难排查。 更稳的路线是文本化:xml 或 json。json 值得优先考虑,因为 MQL5、C#、C++ 都有现成解析器可用,不用自己手写封包解包,位数错乱的概率直接降下来。 Base64 在文档里也被提到,但它不是加密标准,只是编码,拿来做许可证混淆可以,别当密文信任。实际项目里用 json + 真加密,比裸字节数组省心太多。
把工具请下神坛
这套加密方案附带了三个工程包:CryptoMQL.zip 仅 4.43 KB,装的是 MT5 端加解密脚本;CryptoC#.zip 为 7.06 KB 的 C# 项目;CryptoC++.zip 体积 2456.49 KB,是完整的 C++ 实现。想在本地验证跨语言加解密是否互通,直接下这三个包跑一遍最直观。 材料版权归发布方所有,部分或全文转载都被禁止;文中方案由个人作者提交,准确性不担保,用在外汇或贵金属这类高波动市场前,先在小资金账户试错。 工具只是通道,不是印钞机。把它接进你的 EA 或信号转发流程,能省掉明文暴露的风险,但行情本身的概率属性不会因加密而改变。