Не могу подружить шифрование mql и php

 

Уважаемые коллеги, не могу подружить шифрование.

Создаю зашифрованную строку с использованием стандартных функций. AES256 но php при расшифровывании строки с тем же ключом выдаёт странный набор символов.

Перепробовал все варианты, странно ещё то что онлайн дешифровщики то же не понимают шифрование. 

Может кто то знает решение вопроса? 

 
Vladimir Pastushak:

Уважаемые коллеги, не могу подружить шифрование.

Создаю зашифрованную строку с использованием стандартных функций. AES256 но php при расшифровывании строки с тем же ключом выдаёт странный набор символов.

Перепробовал все варианты, странно ещё то что онлайн дешифровщики то же не понимают шифрование. 

Может кто то знает решение вопроса? 

Сталкивался точь в точь с такой же проблемой, только с библиотекой шифрования написанной на Си.
К сожалению решение так и не нашёл. Пришлось забыть этот путь.
Есть подозрение, что алгоритмы шифрования в mql, не соответствуют алгоритмам в распространенных библиотеках шифрования.  
То есть в алгоритмах mql скорее всего есть ошибки. Зашифрованное на стороне mql, невозможно расшифровать сторонней библиотекой тем же алгоритмом.

P.S.
Если в php есть возможность выбрать CipherMode, то попробуй режим AES ECB no padding.
Но какие режимы я бы не использовал "CBC", "ECB", "CTR", "OFB", "GCM", "CFB"
всё равно не чего не получилось.

 
Мне не без труда, но удалось подружить клиента на Си и сервер на php. Тестировал алгоритмы шифрования AES128, AES192 и AES256.
 

Сделал пару тестов. По крайней мере, в онлайн тестере удалось получить такую-же зашифрованную строку, как в MQL.

Method: AES256
Text: The quick brown fox jumps over the lazy dog
Key: ABCDEFGHIJKLMNOPQRSTUVWXYZ123456

Зашифрованная строка: 259109708D50ED4977922302BB27774D948F4A432437378B37A9288BB22BFA3974272765BA8CD35574C47E24DE6871F9

Проверяется тут

AES decryption AES encryption AES Hex Key Supported - The X Online Tools
  • shotgun,WeChatID:TwoFlyingPigs
  • the-x.cn
AES encryption and decryption online tool for free.Support modes are: ECB,CBC,CTR,CFB and CFB with 128,192,256 bit. The output can be BASE64,Hex or Text .The tool detects the decryption result and formats it, such as JSON.
Файлы:
aes_1.png  134 kb
 

Клиент на Си и сервер на php, это не тема вопроса.

Тема вопроса, 
клиент на mql и сервер на php
или
клиент на mql и сервер на Си

У меня не получилось расшифровать c mql на Си.

 
Roman #:

Клиент на Си и сервер на php, это не тема вопроса.

Тема вопроса, 
клиент на mql и сервер на php
или
клиент на mql и сервер на Си

У меня не получилось расшифровать c mql на Си.

Приведите тест-кейс.

 
Stanislav Korotky #:

Приведите тест-кейс.

Не получится. Так как я использовал коммерческую библиотеку, смысла в тесте нет, если у вас нет этой библиотеки.

 
Roman #:

Не получится. Так как я использовал коммерческую библиотеку, смысла в тесте нет, если у вас нет этой библиотеки.

Имелся в виду простой тест-кейс, типа строка "мама мыла раму", как тут выше приводили, сразу с результатами шифрования от mql и не mql.

 
Stanislav Korotky #:

Имелся в виду простой тест-кейс, типа строка "мама мыла раму", как тут выше приводили, сразу с результатами от mql и не mql.

Наверно это больше актуально для топикстартера на php.
Так как проблема больше его интересует.
Сейчас искать файлы на Си двухгодичной давности и снова вникать в проблему мне не с руки, занят другой задачей.
Просто вспомнилось, что давненько тоже сталкивался с такой же проблемой, поэтому и отписался тут.
Но для тестов и поиска решения проблемы, я сейчас не готов. Реально не до этого.

 
int OnInit() {
   string text="The quick brown fox jumps over the lazy dog";
   string keystr="d41d8cd98f00b204e9800998ecf8427e";
   uchar src[],dst[],key[];
   StringToCharArray(keystr,key);
   StringToCharArray(text,src, 0, ArraySize(src)-1);
   int res = CryptEncode(
      CRYPT_AES256,
      src,
      key,
      dst
   );
   if (res > 0) {
      PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst));
      res = CryptDecode(CRYPT_AES256,dst,key,src);
      PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
   } else {
      Print("Ошибка в CryptDecode. Код ошибки=",GetLastError());
   }
   return(INIT_FAILED);
}
<?php
/*  Encoded data: size=48 C1E4EE445B77DE377EEFA7A8C2A5E30F5190DF813DAB27618E4092A00F9A73039E6234F9B6E6AF34829EAA7DBAD7498F
    Decoded data: size=48, string='The quick brown fox jumps over the lazy dog'
*/
    $data64 = 'C1E4EE445B77DE377EEFA7A8C2A5E30F5190DF813DAB27618E4092A00F9A73039E6234F9B6E6AF34829EAA7DBAD7498F';
    $data = hex2bin($data64);
    $key = 'd41d8cd98f00b204e9800998ecf8427e';
    $s = openssl_decrypt(
        $data,
        'AES-256-ECB',
        $key,
        OPENSSL_ZERO_PADDING|OPENSSL_RAW_DATA
    );
    var_dump($s);
?>
 
trader6_1 #:

Поставьте:

   StringToCharArray(keystr, key, 0, StringLen(keystr));
   StringToCharArray(text, src, 0, StringLen(text));

Все работает.

2022.11.07 16:52:28.260 cipher (EURUSD,H1)      StringToCharArray(keystr,key,0,StringLen(keystr))=32 / ok
2022.11.07 16:52:28.260 cipher (EURUSD,H1)      StringToCharArray(text,src,0,StringLen(text))=43 / ok
2022.11.07 16:52:28.260 cipher (EURUSD,H1)      CryptEncode(CRYPT_AES256,src,key,dst)=48 / ok
2022.11.07 16:52:28.260 cipher (EURUSD,H1)      Encoded data: size=48
2022.11.07 16:52:28.260 cipher (EURUSD,H1)      [00] C1 | E4 | EE | 44 | 5B | 77 | DE | 37 | 7E | EF | A7 | A8 | C2 | A5 | E3 | 0F | 
2022.11.07 16:52:28.260 cipher (EURUSD,H1)      [16] 51 | 90 | DF | 81 | 3D | AB | 27 | 61 | 8E | 40 | 92 | A0 | 0F | 9A | 73 | 03 | 
2022.11.07 16:52:28.260 cipher (EURUSD,H1)      [32] 9E | 62 | 34 | F9 | B6 | E6 | AF | 34 | 82 | 9E | AA | 7D | BA | D7 | 49 | 8F | 
2022.11.07 16:52:28.260 cipher (EURUSD,H1)      Decoded data: size=48, string='The quick brown fox jumps over the lazy dog'
Причина обращения: