Почему CryptEncode() на mql4 отличается от других языков?

#mql4 #metatrader4

Вопрос:

Я пытался понять CryptEncode() , как отправлять и получать строки между индикатором mt4 и PHP-сервером.

Но когда строка зашифрована на стороне mql4, это совершенно другое дело, чем когда она зашифрована на стороне PHP. Один и тот же ключ и один и тот же алгоритм шифрования используются на обоих концах, но все равно шифрование отличается с обеих сторон.

И когда я использую онлайн-инструмент для расшифровки зашифрованной строки PHP, он успешно расшифровывает жало, тогда как когда я использую зашифрованную строку, сгенерированную mql4, в ней говорится, что окончательный блок заполнен неправильно.

Код:

    string text="this is the text to be encoded";
   string keystr="d41d8cd98f00b204e9800998ecf8427e";
   uchar src[],dst[],key[];
    
    StringToCharArray(text,src);
    StringToCharArray(keystr,key);
    
       int encd=CryptEncode(CRYPT_AES256,src,key,dst);
       encd=CryptEncode(CRYPT_BASE64,dst,key,src);
       if(encd>0)
        {
          PrintFormat("Encoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
        }
      else
         Print("Error in CryptEncode. Error code=",GetLastError());
 

Почему сгенерированная mql4 зашифрованная строка отличается от строки, сгенерированной любым другим языком? Как избежать этой проблемы? Существует ли какая-либо альтернативная библиотека шифрования, доступная для предотвращения этой проблемы?

Ответ №1:

Это не отличается, просто MQL4 поддерживает только очень конкретную реализацию шифрования AES, и если вы не используете правильные настройки в другом коде, вы не достигнете совместимости между двумя платформами.

В частности, вам необходимо обеспечить выполнение следующих условий:

  • Режим заполнения: Нули
  • Режим шифрования: ЕЦБ (так что нет IV)
  • Размер ключа: 256
  • Размер блока: 128

Вы можете попробовать онлайн-инструмент шифрования/дешифрования AES, чтобы проверить свои результаты, доступные здесь: онлайн-набор инструментов