ISO10126 — схема дополнения (padding), применяемая в блочных шифрах при работе с данными, длина которых не кратна размеру блока. В контексте CryptoJS она используется в симметричном шифровании (AES, DES и др.) для корректного выравнивания входного сообщения до границы блока.
Блочные алгоритмы шифрования оперируют фиксированными размерами блоков (например, AES использует блок 16 байт). Если исходные данные не заполняют блок полностью, применяется дополнение.
ISO10126 реализует следующий принцип:
Пример: Если необходимо добавить 5 байт, то структура будет выглядеть так:
| data | random | random | random | random | 0x05 |
Значение 0x05 указывает, что добавлено 5 байт
padding.
В отличие от PKCS7, где все байты равны значению длины, ISO10126 делает padding непредсказуемым.
В 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 padding реализован через функции pad и
unpad.
Логика добавления:
padLength - 1padLengthПсевдологика:
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 при расшифровке:
Исходные данные:
HELLO
Дополнение до 8 байт:
PKCS7:
HELLO\x03\x03\x03
ISO10126:
HELLO\xA4\x19\xF3\x03
(последний байт — длина padding)
ISO10126 исторически рассматривался как более «случайный» вариант padding, однако в современных криптографических практиках его использование ограничено:
Ключевой момент заключается в том, что безопасность шифрования определяется режимом работы алгоритма и корректной инициализацией IV, а не видом padding.
При использовании AES в режиме CBC:
Схема обработки:
plaintext → padding (ISO10126) → AES CBC encryption → ciphertext
ciphertext → AES CBC decryption → remove ISO10126 padding → plaintext
ISO10126 не зависит от режима шифрования, но корректно работает только там, где требуется padding:
CryptoJS реализует padding как отдельный слой абстракции:
Cipher → Mode (CBC/ECB) → Padding (ISO10126/PKCS7) → Block transform
Такой подход позволяет: