Блочные алгоритмы шифрования (AES, DES и другие) работают с фиксированными размерами блоков, чаще всего 16 байт для AES. Если входные данные не кратны размеру блока, требуется механизм дополнения (padding), который доводит длину сообщения до необходимого значения.
ZeroPadding — один из простейших методов дополнения,
при котором недостающие байты заполняются нулевыми значениями
(0x00).
При использовании ZeroPadding:
0x00Формально:
padding_length = block_size - (data_length % block_size)
Если padding_length != 0, то:
data += [0x00, 0x00, ... padding_length раз]
ZeroPadding не содержит метаданных о длине исходного сообщения. Это создаёт принципиальную особенность:
Это ключевое отличие от более сложных схем дополнения.
В библиотеке CryptoJS padding задаётся через объект
CryptoJS.pad.
Пример применения ZeroPadding при шифровании AES:
const CryptoJS = require("crypto-js");
const message = "Hello CryptoJS";
const key = CryptoJS.enc.Utf8.parse("1234567890123456");
const encrypted = CryptoJS.AES.encrypt(message, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.ZeroPadding
});
const decrypted = CryptoJS.AES.decrypt(encrypted, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.ZeroPadding
});
const result = decrypted.toString(CryptoJS.enc.Utf8);
Внутренняя реализация основана на добавлении нулевых байтов до размера блока:
CryptoJS.pad.ZeroPadding = {
pad: function (data, blockSize) {
const blockSizeBytes = blockSize * 4;
const dataSigBytes = data.sigBytes;
const paddingBytes = blockSizeBytes - (dataSigBytes % blockSizeBytes);
for (let i = 0; i < paddingBytes; i++) {
data.concat(CryptoJS.lib.WordArray.create([0x00000000], 1));
}
},
unpad: function (data) {
const sigBytes = data.sigBytes;
let i = sigBytes - 1;
while (i >= 0 && data.words[i >>> 2] & (0xff << (24 - (i % 4) * 8)) === 0) {
i--;
}
data.sigBytes = i + 1;
}
};
Основное различие заключается в способе кодирования длины padding:
0x00Пример PKCS7:
... | 05 05 05 05 05
Если исходное сообщение заканчивается на нулевые байты, возникает неоднозначность:
Пример:
Исходные данные: "ABCD\0\0"
После padding: "ABCD\0\0\0\0\0\0"
После расшифровки невозможно понять реальную длину исходного сообщения без внешнего контекста.
ZeroPadding встречается в следующих случаях:
Сам по себе ZeroPadding не является криптографической уязвимостью, однако:
Современные системы чаще используют PKCS7 как стандарт по умолчанию.
Padding применяется только в блочных режимах, где требуется выравнивание:
В потоковых режимах (CFB, OFB, CTR) padding не используется, так как данные шифруются побайтно или с генерацией потока ключа.
При работе с бинарными данными ZeroPadding становится особенно проблемным:
При одинаковом входе различия в результате:
Это влияет на итоговую расшифровку при наличии нулевых байтов в данных.
При взаимодействии разных криптографических библиотек важно учитывать: