Обзор доступных методов преобразования информации

Защита информации может выполняться для разных целей и потому использовать разные способы. В частности, может требоваться полностью скрыть суть информации от постороннего наблюдателя или обеспечить её передачу, гарантировав неизменное состояние, но сама информация остается доступной. В первом случае речь идет о шифровании, а во втором — о цифровом отпечатке (хэше). Таким образом, шифрование и хэширование сводятся к переработке исходных данных в новое представление с использованием, при необходимости, дополнительных параметров.

И шифрование, и хэширование имеют множество разновидностей.

Наиболее общая градация делит шифрование на шифрование с открытыми ключами (асимметричное) и с закрытым ключом (симметричное).

Асимметричная схема подразумевает наличие 2-х ключей — открытого и закрытого — у каждого участника обмена данными. Пары открытого и закрытого ключей предварительно генерируются по специальным алгоритмам.  Каждый закрытый ключ известен только хозяину. Открытые ключи всех известны всем. Перед передачей зашифрованных данных потребуется обменяться тем или иным способом открытыми ключами. Далее поставщик данных применяет свой, известный только ему, закрытый ключ в купе с одним или несколькими открытыми ключами получателей данных. Те, в свою очередь, применяют свои закрытые ключи и открытый ключ отправителя для расшифровки.

Симметричная схема шифрования использует один и тот же секретный (закрытый) ключ — и для шифрования, и для дешифрования.

MQL5 поддерживает "из коробки" закрытые ключи (симметричные). Встроенными средствами MQL5 в данный момент нельзя обеспечить электронную подпись, которая использует асимметричное шифрование.

Особняком среди методов шифрования стоят примитивные алгоритмы без ключей — с их помощью добиваются условного сокрытия информации или преобразования типа информации. Сюда относятся, например, ROT13 (замена символов со сдвигом их алфавитно-цифровых кодов на 13, используется, в частности, в реестре Windows) или Base64 (перевод двоичных файлов в текст и обратно, как правило, в веб-проектах). Также востребованной задачей преобразования данных является их сжатие. Его тоже можно рассматривать в некотором смысле как шифрование, поскольку данные становятся нечитаемыми человеком или прикладной программой.

Методов хэширования также известно очень много. Пожалуй, самым известным и простым можно назвать CRC (Cyclic Redundancy Check). В отличие от шифрования, которое позволяет восстановить исходное сообщение из зашифрованного, хэширование лишь создает отпечаток (характерный набор байтов) на основе исходной информации, — такой, что его неизменность при последующем пересчете гарантирует (с высокой вероятностью) неизменность исходной информации. Разумеется, это предполагает, что информация доступна всем участникам/пользователям соответствующей программной системы. Восстановить информацию по хэшу невозможно. Как правило, размер хэша (количество байт в нем) ограничен и стандартизован для каждого метода, так что и для строки длиной 80 символов и для файла размером 1 Мбайт мы получим хэш одного размера. Наиболее "близким" для большинства пользователей применением хэширования является хэширование паролей сайтами и программами, то есть последние хранят у себя и сверяются при логине именно с хэшем пароля, а не с паролем в исходном виде.

Следует отметить, что термин "хэш" уже встречался нам в предыдущей главе: там мы использовали хэширующую функцию для индексации структур экономического календаря. Тот простой хэш имеет очень слабую степень защиты, что, в частности, выражается в высокой вероятности коллизий (совпадения результатов для разных данных), которые мы специально обрабатывали в алгоритме. Он подходит для задач равномерного псевдо-случайного распределения данных по ограниченному количеству "корзинок". В отличие от этого, промышленные стандарты хэширования ориентированы именно на подтверждение целостности информации и применяют намного более сложные способы расчета. Но и длина хэша в этом случае — несколько десятков байтов, а не отдельное число.

Методы шифрования и хэширования информации, доступные MQL-программам, собраны в перечислении ENUM_CRYPT_METHOD.

Константа

Описание

CRYPT_BASE64

Перекодировка по стандарту Base64

CRYPT_DES

Шифрование DES с ключом 56 бит (7 байт)

CRYPT_AES128

Шифрование AES с ключом 128 бит (16 байт)

CRYPT_AES256

Шифрование AES с ключом 256 бит (32 байта)

CRYPT_HASH_MD5

Расчёт хэша MD5 (16 байт)

CRYPT_HASH_SHA1

Расчёт хэша SHA1 (20 байт)

CRYPT_HASH_SHA256

Расчёт хэша SHA256 (32 байта)

CRYPT_ARCH_ZIP

Сжатие методом "deflate"

Указанное перечисление используется в обеих функциях криптографического API — CryptEncode (шифрование/хэширование) и CryptDecode (дешифрование). Они будут рассмотрены в следующих разделах.

Методы шифрования AES и DES требуют помимо данных ключ шифрования — массив байтов предопределенной длины (она указана в таблице в скобках). Как уже говорилось, ключ должен храниться в секрете и оставаться известным только разработчику программы или хозяину информации. Криптостойкость шифрования, то есть сложность подбора ключа компьютером злоумышленника, напрямую зависит от размера ключа: чем он больше, тем надежнее защита. Поэтому DES считается устаревшим и заменен в финансовой сфере своей усовершенствованной версией Triple DES: она заключается в последовательном троекратном применении DES с тремя разными ключами, что легко реализовать на MQL5. Существует популярная разновидность Triple DES, которая выполняет на второй итерации дешифрацию вместо шифрации с ключем номер 2, то есть как-бы восстанавливает данные в промежуточное, заведомо неправильное представление перед заключительным, третьим раундом DES. Но и Triple DES планируется вывести из промышленных стандартов после 2024 года.

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

Из методов хэширования наиболее современным является SHA256 (подмножество стандарта SHA-2). Методы SHA1 и MD5 признаны небезопасными, но по-прежнему широко используются в целях совместимости с существующими сервисами. Для методов хэширования в скобках указан размер получаемого массива байтов с цифровым отпечатком данных. Ключ для хэширования не нужен, но во многих применениях к хэшируемым данным пристыковывают так называемую "соль" — секретную компоненту, которая затрудняет воспроизводство требуемых хэшей злоумышленниками (например, при подборе пароля).

Элемент CRYPT_ARCH_ZIP обеспечивает ZIP-архивирование и передачу/прием запросов данных в сети Интернет (см. WebRequest).

Несмотря на то, что название метода включает ZIP, сжатые данные не эквиваленты привычным архивам ZIP, в которых помимо контейнеров стандарта "deflate" всегда присутствуют мета-данные: специальные заголовки, список файлов и их атрибутов. На сайте mql5.com в статьях и библиотеки исходных кодов можно найти готовые реализации сжатия файлов в ZIP-архив и их извлечения оттуда. Само сжатие и извлечение производится функциями CryptEncode/CryptDecode, а все дополнительные необходимые структуры формата ZIP описаны и заполняются в MQL5-коде.

Метод Base64 предназначен для конвертации двоичных данных в текст и обратно. Двоичные данные в общем случае содержат множество непечатаемых символов и не поддерживаются средствами редактирования и ввода, такими как переменные input в диалогах свойств MQL-программ. Base64 может пригодиться, например, при работе с популярным текстовым форматом обмена объектными данными JSON.

Каждые 3 исходных байта кодируются в Base64 4-мя символами, что приводит к увеличению размера данных на треть. К книге прилагаются тестовые файлы, с которыми мы поэкспериментируем в последующих примерах, в частности, веб-страница MQL5/Files/MQL5Book/clock10.htm и используемый в ней файл с изображением часов MQL5/Files/MQL5Book/clock10.png. Уже на данном ознакомительном этапе вы можете наглядно увидеть возможности и разницу во внутреннем представлении двоичных данных и текста Base64, при сохранении идентичного внешнего вида.

Веб-страница со встроенным двоичным изображением и в формате Base64

Веб-страница со встроенным двоичным изображением и в формате Base64

Одно и то же изображение с циферблатом вставлено в страницу и как внешний файл clock10.png, и как его Base64-кодировка в теге img (в его атрибуте src: это так называемый "data URL"). Непосредственно в самом тексте веб-страницы это выглядит так (переносить длинную строку Base64 по ширине 76 символов не обязательно, но допускается стандартом и сделано здесь для публикации):

<img src="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+
Hj8y/AAABdUlEQVQoz1WSPUiVYRiGr/f4qaRwyAMOLpVnSGuvBh3SoSnLwclwqQa3CNxaWxwcrS
D/CAQH4ShF4RBnqCWQWiQwAp1C6WBi4B/5Xg7f1+fxgXd4eC5e7ue+nxAFgADABj+Bq1wGIBsRU
ihwwCMa6eE6ga+s0sgLmv5j0ahOOOqxqq98q+qeI86o0ShRfWpFHVC105uq3lOnfa5G0UXn1Ji9
8bw7Ucf9pBbgNX9ZI2TijzjMRBf4zCWeAckbxuijgXV2aadMfd2gl4QVkhXmAegiUGKDlhyRZmC
IxyRFdomUgB1qlDlmtu6vbYqckES+U6SEtNFGjScMcUhz5tAmrTTAiGZupI79cv9crw8sXGM9Dw
WkgwtncQBf6CfoQ8rcpjcfkSPL/OYdSyRwkWHKSDiHBeQ+39hJs9Nb7qmTmdNpTapb9qexpPLu+
NGqqlVXVf1gxcGzgFNswQGn/OOB/9zypXd9n28Z6o/uBxU2kW4GuVJ3dKeW6inhKgZyVwAAAABJ
RU5ErkJggg==" title="Clock 10:00 Base64 built-it" />

Скоро мы воспроизведем эту последовательность символов с помощью функции CryptEncode, а пока лишь отметим, что пользуясь подобным приемом, мы можем генерировать из MQL5 HTML-отчеты со встроенной графикой.