ISO10126

ISO10126 — схема дополнения (padding), применяемая в блочных шифрах при работе с данными, длина которых не кратна размеру блока. В контексте CryptoJS она используется в симметричном шифровании (AES, DES и др.) для корректного выравнивания входного сообщения до границы блока.

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

ISO10126 реализует следующий принцип:

  • Все байты заполнения, кроме последнего, генерируются случайным образом
  • Последний байт содержит число добавленных байт

Пример: Если необходимо добавить 5 байт, то структура будет выглядеть так:

| data | random | random | random | random | 0x05 |

Значение 0x05 указывает, что добавлено 5 байт padding.

В отличие от PKCS7, где все байты равны значению длины, ISO10126 делает padding непредсказуемым.

Реализация в CryptoJS

В CryptoJS схема ISO10126 реализована в модуле CryptoJS.pad.Iso10126.

Использование при шифровании AES:

const CryptoJS = require("crypto-js");

const message = "Confidential message";
const key = CryptoJS.enc.Utf8.parse("1234567890123456");
const iv = CryptoJS.enc.Utf8.parse("6543210987654321");

const encrypted = CryptoJS.AES.encrypt(message, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Iso10126
});

console.log(encrypted.toString());

При расшифровке padding удаляется автоматически:

const decrypted = CryptoJS.AES.decrypt(encrypted, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Iso10126
});

console.log(decrypted.toString(CryptoJS.enc.Utf8));

Внутренний механизм работы CryptoJS.pad.Iso10126

Внутри CryptoJS padding реализован через функции pad и unpad.

Логика добавления:

  • Вычисляется количество байт, необходимых для выравнивания
  • Генерируется массив случайных байтов длиной padLength - 1
  • Последний байт устанавливается равным padLength

Псевдологика:

pad: function (data, blockSize) {
    const padSize = blockSize - (data.sigBytes % blockSize);

    for (let i = 0; i < padSize - 1; i++) {
        data.concat(randomByte());
    }

    data.concat(padSize);
}

Удаление padding при расшифровке:

  • Читается последний байт
  • Определяется длина padding
  • Обрезаются соответствующие байты

Отличия ISO10126 от других схем padding

PKCS7

  • Все байты равны значению длины padding
  • Более предсказуемая структура

ZeroPadding

  • Дополняется нулями
  • Не всегда позволяет однозначно восстановить исходную длину

ISO10126

  • Случайные байты + длина в последнем байте
  • Повышает энтропию за счёт случайных значений

Пример различий на уровне блока

Исходные данные:

HELLO

Дополнение до 8 байт:

PKCS7:

HELLO\x03\x03\x03

ISO10126:

HELLO\xA4\x19\xF3\x03

(последний байт — длина padding)

Безопасностные аспекты

ISO10126 исторически рассматривался как более «случайный» вариант padding, однако в современных криптографических практиках его использование ограничено:

  • Случайные байты не добавляют криптографической стойкости к корректно реализованным режимам (CBC, GCM)
  • Поддержка схемы устарела в ряде стандартов
  • Возможны ошибки реализации при некорректном удалении padding

Ключевой момент заключается в том, что безопасность шифрования определяется режимом работы алгоритма и корректной инициализацией IV, а не видом padding.

Особенности применения в AES-CBC

При использовании AES в режиме CBC:

  • Padding обязателен при длине сообщения не кратной 16 байтам
  • ISO10126 применяется только на этапе подготовки блока
  • После шифрования padding становится неразличимым от шифротекста

Схема обработки:

plaintext → padding (ISO10126) → AES CBC encryption → ciphertext
ciphertext → AES CBC decryption → remove ISO10126 padding → plaintext

Практическое поведение в CryptoJS

  • Padding применяется автоматически при шифровании
  • При отсутствии явного указания используется PKCS7
  • ISO10126 должен задаваться явно
  • Ошибки при удалении padding приводят к некорректному результату UTF-8 декодирования

Взаимодействие с режимами шифрования

ISO10126 не зависит от режима шифрования, но корректно работает только там, где требуется padding:

  • CBC — поддерживается
  • ECB — поддерживается
  • CFB/OFB — padding обычно не используется
  • CTR — padding не требуется

Типичные ошибки при использовании

  • Использование ISO10126 без IV в CBC
  • Попытка расшифровки с другим padding, чем при шифровании
  • Применение к потоковым режимам (CTR)
  • Неверная кодировка ключа и IV

Архитектурная роль в CryptoJS

CryptoJS реализует padding как отдельный слой абстракции:

Cipher → Mode (CBC/ECB) → Padding (ISO10126/PKCS7) → Block transform

Такой подход позволяет:

  • менять padding без изменения алгоритма
  • комбинировать режимы и схемы выравнивания
  • унифицировать обработку данных на уровне блоков