шифрование — Как расшифровать строку (зашифрованную фиксированной версией AES256 MetaTrader Terminal 4) с помощью инструментов PHP?

У меня есть строка, скажемMy secret text».

Он был зашифрован с использованием MQL4 CryptEncode() функция (где использовался метод 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(...) не работал (это ничего не дало в результате)?

0

Решение

Для активных DownVoters:
пожалуйста, обратите внимание, в первую очередь данный контекст использования O / P, где буквально ZERO-опции, чтобы выбрать любые параметры конфигурации AES256, но все же O / P необходимо расшифровать "черный ящик"-производится BLOB на php-боковая сторона. Спасибо за повторное рассмотрение.

Не стесняйтесь улучшать решение или подарок любой лучшее решение для случая использования O / P.


Академический / теоретический подход:

Обратный просмотр всех возможных конфигураций php-инструменты по своему выбору, чтобы найти те настройки, которые правильно восстанавливают сторону МТ4 CryptEncode()-издание aKnown-[Test]-OriginalSTRING, с помощью aKnown-[Test]-SecretKEY вернуться к соответствующей строке.

Будучи принципиально неуверенными в деталях на стороне MT4 (где крипто-движок обусловлен очевидными причинами, а не открытым исходным кодом), можно столкнуться со следующими возможными альтернативами (неизвестный выбор) на стороне процесса шифрования:

CRYPT_BASE64
CRYPT_AES128
CRYPT_AES256
CRYPT_DES
CRYPT_HASH_SHA1
CRYPT_HASH_SHA256
CRYPT_HASH_MD5

php-сторона расшифровки намного «богаче» поставить тест
~ { 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
)

Да, это может занять много времени, но такой подход принципиально возможен.

Любой, кто заинтересован в этом, может осознать и должен также проверить любой вид риска стать объектом судебного расследования или даже контрмер со стороны правоохранительных органов, поскольку в некоторых местных юрисдикциях использование этой или аналогичной практики может считаться незаконным и / или нарушающим Права на интеллектуальную собственность какой-либо другой стороны. ( Так, только что был предупрежден. )


Практический подход:

Иди распространяй.

использование php-сторона для подключения и связи с терминалом 4 MetaTrader (множество способов сделать это, включая производственные платформы с низкой задержкой).

php-сторона отправляет anMt4EncryptedBLOB в руки MT4-процесса

MT4-процесс вызывает сопоставление (по замыслу «самодельный» MetaQuotes — это совпадающая реализация пары «шифровать / дешифровать-сервис»)
nBytes = CryptDecode( TheSAME_ENUM_CRYPT_METHOD, BLOBarray, KEYarray, RESarray );

Отправка RESarray назад к phpСторона для какой-либо дальнейшей обработки здесь очевидна и бесполезна, но это закрывает кольцо.

И все готово!
(Только не запутайтесь, что MQL4 string является на самом деле не string но struct и аналогичные сюрпризы, которые встретятся на стороне MT4, если вдаваться в подробности интеграции DLL / API, так что будьте осторожны. Все еще довольно весело взломать этот быстрый и умный в быстрый прототип MVP. )


MCVE-сегмент:
MQL4-код:

//+------------------------------------------------------------------+
//|                                  __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 );
}
//+------------------------------------------------------------------+

Запрашивает взаимодействие с пользователем:
введите описание изображения здесь

И произвел (на этих значениях по умолчанию) ссылка MCVE-вывод для проверки любого расшифровывающего испытания:

START: GetLastError() == 0
OK.
MQL4 CryptEncode() has produced [nBYTEs == 64 ] bytes.
MQL4 aCryptoBLOB_asHEX
== [1979FE46DB64652067C136F57F0971F20FB5C407CE043AAF972C8AED3DEB6D4260181448FE2FDF69AEA7DD8B33B1484A21935AAFBB649FB95DBB05BBA88E4A31]
1

Другие решения

Вот два разных способа расшифровки:

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

По вопросам рекламы [email protected]