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

如何使用PHP工具解密字符串(由MetaTrader Terminal 4 AES256的固定版本加密)?,php,encryption,mql4,mt4,Php,Encryption,Mql4,Mt4,我有一个字符串,比如“我的密文”” 它已使用加密(使用的方法是加密AES256) 密钥(32字节)是,比如说,“1234567890ABCDEFGHIJKLMNOPQRSTUV” MQL4函数不提供输入IV的可能性,我也不知道是否使用了CBC-模式或其他模式 如何使用PHP获取“我的秘密文本” (我不得不告诉你,我试过了

我有一个字符串,比如“
我的密文”

它已使用加密(使用的方法是加密AES256)

密钥(32字节)是,比如说,“
1234567890ABCDEFGHIJKLMNOPQRSTUV

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

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

(我不得不告诉你,我试过了



但没有成功。


更新: 我从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\u RAW\u DATA
作为选项)


更新2:
使用
mcrypt\u解密(…)
它可以工作。但是,我很好奇为什么
openssl_decrypt(…)
不起作用(结果它什么也没给)

对于热衷于投票的人:
请首先注意给定的O/p使用环境,这里几乎没有选择AES256配置选项的选项,但O/p仍然需要破译
php
端产生的“黑匣子”。感谢您的重新考虑。

请随时改进解决方案,或在此处以书面形式提供任何适用于O/P-given-use-case的更好的解决方案,这将始终受到热烈欢迎,不是吗


下面是实用解决方案的一部分:
MQL4端代码:


学术/理论方法: 使用
aKnown-[Test]-SecretKEY
返回到匹配字符串,反向扫描
php
工具的所有可能配置,以找到正确重建MT4端的设置

由于主要不确定MT4方面的细节(加密引擎是由于明显的原因而不是开源),因此在加密过程方面面临以下可能的选择(未知选择):

CRYPT_BASE64
CRYPT_AES128
CRYPT_AES256
CRYPT_DES
CRYPT_HASH_SHA1
CRYPT_HASH_SHA256
CRYPT_HASH_MD5
php
-解密端是更“丰富的”来设置测试
{OPENSSL_原始数据}OPENSSL_零填充}

x{下面选择的每个方法}:

(
    [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
)
是的,这可能需要很长时间,但这种方法基本上是可行的

任何有兴趣这样做的人都可能意识到并应该核实成为法律调查对象甚至执法工作队反措施的任何风险,因为在某些地方司法管辖区,使用这种或类似做法可能被视为非法和/或侵犯其他方的知识产权。(所以,刚刚收到警告。)


实际做法: 去分发

使用
php
-端连接MetaTrader终端4并与之通信(有多种方式,包括生产级、低延迟框架)

php
-side向MT4进程发送
一个MT4EncryptedBlob

MT4进程调用匹配(根据设计,MetaQuotes的“自制”-是加密/解密服务对的匹配实现)
nBytes=CryptDecode(相同的ENUM\u CRYPT\u方法、BLOBarray、KEYarray、RESarray)

RESarray
发送回
php
-端进行任何进一步处理显然是毫无意义的,但这会关闭环

你就完了
(请不要混淆,MQL4
字符串和类似的惊喜,如果进入DLL/API集成细节,人们会在MT4端相遇,所以要小心。将这种快速而智能的MVP转换为快速原型MVP仍然是一件非常有趣的事。)


一个
MCVE
-段:
MQL4端代码:


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

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

当您尝试某项操作时,您会发布带有错误的代码,包括精确的输入和精确的输出。否则,您对问题的唯一答案是:
$decrypted=openssl\u decrypt($data,$method,$key)
这与我在php.net中编写的内容几乎相同。我有一个AES256加密字符串和一个密钥。我没有静脉注射(也不知道注射方式)。如何在PHP中恢复原始字符串?(我认为我完全笨拙的尝试是非常不相关的。我没有需要一点纠正的坏解决方案。我根本没有解决方案。)正如我所写的,如果你能发布准确的加密字符串、准确的密钥和准确的预期输出,这将更容易解决。那么至少我们可以尝试解密字符串。这边你所能做的就是我写的,这显然没有帮助。您可以尝试使用
AES-256-*
进行解密,其中
*
是模式,因此循环使用所有可用的模式。@N.B.您对这样的实验感兴趣吗?我可以为您提供一个测试用例(MT4端加密)。我所看到的问题是,任何一个真正关心(或必须关心)密码保护的人都不会轻易让任何类型的攻击者进入搜索空间,进行幼稚的暴力攻击。那么,我们怎么知道使用了什么加密端细节呢?@zaph:正如user3666197所提到的,我不能使用给定模式以外的任何其他模式(IV作为前缀似乎可以)。我应该在MQL4中为它编写一个自己的加密函数
(
    [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
)
//+------------------------------------------------------------------+
//|                                  __StackOverflow_CryptENCODE.mq4 |
//|                                               msMODs (1987-2016) |
//|                                                       nowhere.no |
//+------------------------------------------------------------------+
#property copyright "msMODs (1987-2016)"
#property link      "nowhere.no"
#property version   "1.00"
#property strict
#property script_show_inputs
extern string  aKnown_OriginalSTRING_asMql4STRING     = "How to decrypt an MT4 / AES256 encrypted string with PHP tools?";
       uchar   aKnown_OriginalSTRING_ucharCONTAINER[];
extern string  aKnown_SecretKEY_asMql4STRING          = "123456789o123456789o12";
       uchar   aKnown_SecretKEY_ucharCONTAINER[32];
       uchar   aCryptoBLOB_ucharCONTAINER[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void   OnStart(){
       StringToCharArray( aKnown_OriginalSTRING_asMql4STRING,
                          aKnown_OriginalSTRING_ucharCONTAINER,
                          0,
                          StringLen( aKnown_OriginalSTRING_asMql4STRING )
                          );
       StringToCharArray( aKnown_SecretKEY_asMql4STRING,
                          aKnown_SecretKEY_ucharCONTAINER,
                          0,
                          32
                          );

       int        aFH = FileOpen( "DEMO_OUTPUT.txt", FILE_WRITE | FILE_TXT );
       FileWrite( aFH, "START: GetLastError() == ", GetLastError(), "\n" );
       FileFlush( aFH );

       ResetLastError();

       int nBYTEs = CryptEncode( CRYPT_AES256,                        // a principally unsure ENUM_ ( ref. above )
                                 aKnown_OriginalSTRING_ucharCONTAINER,
                                      aKnown_SecretKEY_ucharCONTAINER,
                                           aCryptoBLOB_ucharCONTAINER
                                 );
       
       if (  nBYTEs > 0 ){
             FileWrite( aFH, StringFormat( "OK.\nMQL4 CryptEncode() has produced [nBYTEs == %d ] bytes.\nMQL4 aCryptoBLOB_asHEX\n== [%s]",
                                            nBYTEs,
                                            show_asHEX( aCryptoBLOB_ucharCONTAINER )
                                            )
                        );
             Comment( "INF:",StringFormat( "OK.\nMQL4 CryptEncode() has produced [nBYTEs == %d ] bytes.\nMQL4 aCryptoBLOB_asHEX\n== [%s]\n\nSTORED IN GlobalVariable()...",
                                            nBYTEs,
                                            show_asHEX( aCryptoBLOB_ucharCONTAINER )
                                            )
                        );
       }                           
       else
             FileWrite( aFH, StringFormat( "ERR: in MQL4 CryptEncode()[ Err == %d ].",
                                            GetLastError()
                                            )
                        );
      FileFlush( aFH );
      FileClose( aFH );               
   }
//+------------------------------------------------------------------+
string show_asHEX( uchar &_ucharCONTAINER_arr[], int count = -1 ){
       string HEX_asPrintableSTRING = "";
       if (  count <  0
          || count >  ArraySize( _ucharCONTAINER_arr )
          )  count =  ArraySize( _ucharCONTAINER_arr );
       for (  int ii = 0; ii <  count; ii++ )
               HEX_asPrintableSTRING += StringFormat( "%.2X", _ucharCONTAINER_arr[ii] );
       return( HEX_asPrintableSTRING );
   }
//+------------------------------------------------------------------+
START: GetLastError() == 0
OK.
MQL4 CryptEncode() has produced [nBYTEs == 64 ] bytes.
MQL4 aCryptoBLOB_asHEX
== [1979FE46DB64652067C136F57F0971F20FB5C407CE043AAF972C8AED3DEB6D4260181448FE2FDF69AEA7DD8B33B1484A21935AAFBB649FB95DBB05BBA88E4A31]
$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);