如何使用PHP工具解密字符串(由MetaTrader Terminal 4固定版本的AES256加密)?

时间:2016-12-11 12:32:06

标签: php encryption mql4 mt4

我有一个字符串,说“My secret text”。

它已使用MQL4 CryptEncode() function进行加密(使用的方法为 CRYPT_AES256 )。

密钥(32个字节)是“ 1234567890ABCDEFGHIJKLMNOPQRSTUV ”。

MQL4函数不提供输入IV的可能性,我也不知道是否使用了CBC - 模式或其他。

如何使用PHP获取“我的秘密文本”?

(我必须告诉,尝试了 openssl_decrypt(...)
mcrypt_decrypt(...)

更新: 我得到了MQ的回答:
使用的模式为 ECB 。确实未使用IV
所以,我的代码是:

<?php

$hexMessage       = $_POST["enc_data"];   //this is in hex form, I used ArrayToHex before sending
$encryptedMessage = hex2bin($hexMessage);
$encryptionMethod = "AES-256-ECB";  
$secretKey        = "1234567890ABCDEFGHIJKLMNOPQRSTUV";

$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretKey);

echo "Decrypted: $decryptedMessage";

?>

没有结果(即使我使用OPENSSL_RAW_DATA作为选项)。

Update2:
使用mcrypt_decrypt(...)它可以正常工作。但是,我很好奇为什么 openssl_decrypt(...) 无法正常工作(它没有给出任何结果)?

2 个答案:

答案 0 :(得分:2)

  

对于敏锐的DownVoters:,请先注意给定的O / P使用环境,其中有ZERO选项可供选择任何AES256配置选项,但O / P仍然需要破解 php 侧的&#34;黑盒&#34; 生成的BLOB。感谢您的重新考虑。

随意改进解决方案或目前任何更好的O / P给定解决方案次使用的情况下的

学术界/理论方法:

反向扫描所选的 php - 工具的所有可能配置,以找到正确重建MT4端 {{1 }} -ed CryptEncode(),使用aKnown-[Test]-OriginalSTRING返回匹配的字符串。

主要不确定MT4端的细节(加密引擎是由于显而易见的原因而不是开源),人们面临加密过程方面(未知选择)的以下可能替代方案:< / p>

aKnown-[Test]-SecretKEY

CRYPT_BASE64 CRYPT_AES128 CRYPT_AES256 CRYPT_DES CRYPT_HASH_SHA1 CRYPT_HASH_SHA256 CRYPT_HASH_MD5 -decrypt-side 更多&#34;更丰富&#34; 设置测试〜< / strong> php
x { OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING }

{ each-method-from-the-choice-below }

是的,可能需要很长时间,但这种方法原则上是可行的。

  

任何有兴趣这样做的人都可能意识到并且也应该验证成为法律调查主体的任何风险,甚至是法律执行工作人员的反措施,因为在某些地方管辖范围内,使用这种或类似的做法可能被认为是非法的/或侵犯其他方的知识产权。 (所以,刚被警告过。)

实用方法:

去分发。

使用 ( [0] => AES-128-CBC [1] => AES-128-CFB [2] => AES-128-CFB1 [3] => AES-128-CFB8 [4] => AES-128-ECB [5] => AES-128-OFB [6] => AES-192-CBC [7] => AES-192-CFB [8] => AES-192-CFB1 [9] => AES-192-CFB8 [10] => AES-192-ECB [11] => AES-192-OFB [12] => AES-256-CBC [13] => AES-256-CFB [14] => AES-256-CFB1 [15] => AES-256-CFB8 [16] => AES-256-ECB [17] => AES-256-OFB [18] => BF-CBC [19] => BF-CFB [20] => BF-ECB [21] => BF-OFB [22] => CAST5-CBC [23] => CAST5-CFB [24] => CAST5-ECB [25] => CAST5-OFB [26] => DES-CBC [27] => DES-CFB [28] => DES-CFB1 [29] => DES-CFB8 [30] => DES-ECB [31] => DES-EDE [32] => DES-EDE-CBC [33] => DES-EDE-CFB [34] => DES-EDE-OFB [35] => DES-EDE3 [36] => DES-EDE3-CBC [37] => DES-EDE3-CFB [38] => DES-EDE3-OFB [39] => DES-OFB [40] => DESX-CBC [41] => IDEA-CBC [42] => IDEA-CFB [43] => IDEA-ECB [44] => IDEA-OFB [45] => RC2-40-CBC [46] => RC2-64-CBC [47] => RC2-CBC [48] => RC2-CFB [49] => RC2-ECB [50] => RC2-OFB [51] => RC4 [52] => RC4-40 [53] => aes-128-cbc [54] => aes-128-cfb [55] => aes-128-cfb1 [56] => aes-128-cfb8 [57] => aes-128-ecb [58] => aes-128-ofb [59] => aes-192-cbc [60] => aes-192-cfb [61] => aes-192-cfb1 [62] => aes-192-cfb8 [63] => aes-192-ecb [64] => aes-192-ofb [65] => aes-256-cbc [66] => aes-256-cfb [67] => aes-256-cfb1 [68] => aes-256-cfb8 [69] => aes-256-ecb [70] => aes-256-ofb [71] => bf-cbc [72] => bf-cfb [73] => bf-ecb [74] => bf-ofb [75] => cast5-cbc [76] => cast5-cfb [77] => cast5-ecb [78] => cast5-ofb [79] => des-cbc [80] => des-cfb [81] => des-cfb1 [82] => des-cfb8 [83] => des-ecb [84] => des-ede [85] => des-ede-cbc [86] => des-ede-cfb [87] => des-ede-ofb [88] => des-ede3 [89] => des-ede3-cbc [90] => des-ede3-cfb [91] => des-ede3-ofb [92] => des-ofb [93] => desx-cbc [94] => idea-cbc [95] => idea-cfb [96] => idea-ecb [97] => idea-ofb [98] => rc2-40-cbc [99] => rc2-64-cbc [100] => rc2-cbc [101] => rc2-cfb [102] => rc2-ecb [103] => rc2-ofb [104] => rc4 [105] => rc4-40 ) -side连接MetaTrader Terminal 4并与之沟通(许多方法,包括生产级,低延迟框架)。

php -side向MT4流程发送 php

MT4-process调用匹配(按照设计,MetaQuotes&#39;&#34;自制&#34; - 是加密/解密服务对的匹配实现)
{ {1}}

anMt4EncryptedBLOB发送回nBytes = CryptDecode( TheSAME_ENUM_CRYPT_METHOD, BLOBarray, KEYarray, RESarray ); - 面以进行任何进一步处理,这里显而易见且没用,但这会关闭响铃。

  

你已经完成了!
(只是不要混淆,MQL4 RESarraynot in reality a string but a struct和类似的惊喜,一个会满足在MT4方面,如果进入DLL / API集成细节,那么要小心。仍然非常有趣将这种快速和智能破解成快速原型化的MVP。)

  

php -segment:
  MQL4端代码:

string

要求用户输入互动: enter image description here

已经(根据这些默认值)产生参考MCVE - 输出以验证任何解密试验:

MCVE

答案 1 :(得分:0)

以下是两种不同的解密方式:

$decryptedMessage = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secretKey, $encryptedMessage, MCRYPT_MODE_ECB);
$decryptedMessage = openssl_decrypt($encryptedMessage, "AES-256-ECB", $secretKey, OPENSSL_ZERO_PADDING|OPENSSL_RAW_DATA);