В блочных алгоритмах шифрования входные данные обрабатываются фиксированными блоками определённого размера. Например, в AES размер блока составляет 128 бит (16 байт). Это означает, что любой поток данных перед шифрованием должен быть разделён на фрагменты строго одинаковой длины. Если длина последнего фрагмента не совпадает с требуемым размером блока, возникает необходимость его искусственного дополнения.
При работе с произвольными данными практически никогда не удаётся получить длину сообщения, кратную размеру блока шифрования. Текст, JSON-структура, бинарные данные или любые пользовательские строки имеют произвольную длину в байтах.
Если алгоритм шифрования попытается обработать неполный блок без дополнительной обработки, возникают две проблемы:
Именно поэтому вводится механизм дополнения блока (padding), который приводит последний фрагмент данных к требуемому размеру.
Дополнение блока выполняет строго техническую функцию — выравнивание длины входных данных до размера, кратного размеру блока алгоритма.
При шифровании поток данных проходит следующие этапы:
При расшифровке процесс дополняется обратной операцией: добавленные байты удаляются, восстанавливая исходное сообщение.
В криптографических библиотеках, включая CryptoJS, применяется несколько стандартных схем дополнения. Каждая из них имеет свои особенности поведения и область применения.
Наиболее распространённый вариант дополнения, используемый по умолчанию в CryptoJS при работе с AES.
Суть метода:
Этот подход позволяет однозначно определить границу исходного сообщения после расшифровки.
При этом методе недостающие байты заполняются нулями.
Особенность заключается в неоднозначности результата:
Используется в некоторых криптографических и смарт-карточных системах.
Принцип:
Такой подход позволяет однозначно определить начало дополнения даже при наличии нулевых байтов в исходных данных.
Схема, в которой:
Комбинирует простоту и возможность восстановления исходной длины.
В библиотеке CryptoJS механизм дополнения встроен в процесс шифрования и дешифрования. При использовании алгоритмов вроде AES поведение определяется настройками:
По умолчанию применяется PKCS7 padding, что делает работу с произвольными строками максимально прозрачной.
Пример логики обработки:
После расшифровки выполняется обратная операция удаления padding, которая основана на анализе значений последних байтов.
Padding тесно связан с режимами работы блочных шифров.
В режиме ECB каждый блок шифруется независимо. Это упрощает реализацию padding, так как каждый блок обрабатывается отдельно, но делает режим криптографически уязвимым.
В режиме CBC каждый блок зависит от предыдущего, однако padding применяется только к последнему блоку. Это стандартный и наиболее безопасный вариант при корректном использовании.
В потоковых режимах padding обычно не требуется, поскольку данные обрабатываются побайтно или поблочно без жёсткой фиксации размера. В таких случаях механизм дополнения может быть отключён.
Неправильно выбранный или отсутствующий padding приводит к критическим проблемам:
Особенно опасно использование Zero padding в системах, где данные могут содержать нулевые байты или переменную длину.
CryptoJS реализует padding как часть внутреннего криптографического пайплайна. Это означает:
При отключении padding ответственность за корректное выравнивание полностью ложится на разработчика.
Дополнение блока является не вспомогательным, а обязательным элементом блочного шифрования. Без него невозможно обеспечить:
В контексте CryptoJS padding обеспечивает абстракцию, позволяющую работать с текстовыми и бинарными данными без ручного управления структурой блоков.