В библиотеке CryptoJS алгоритм AES реализован с поддержкой нескольких режимов работы блочного шифра. Режим определяет, как каждый блок открытого текста преобразуется в шифртекст и как обрабатываются зависимости между блоками. От выбора режима напрямую зависят свойства безопасности, устойчивость к анализу и поведение при повреждении данных.
AES сам по себе работает с блоками фиксированного размера (128 бит), поэтому для обработки данных произвольной длины применяются режимы и дополнения (padding).
Режим ECB представляет собой прямое блочное шифрование без использования цепочек или случайных значений.
Каждый блок обрабатывается независимо:
CryptoJS.AES.encrypt("data", key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
Особенности:
ECB сохраняет структуру данных, что делает его уязвимым к анализу шаблонов. В задачах, связанных с конфиденциальностью, режим практически не используется. Он применим только в ограниченных сценариях, где структура данных не раскрывает информации (например, шифрование единичных независимых блоков фиксированного формата).
CBC является наиболее распространённым режимом в CryptoJS при работе с AES.
CryptoJS.AES.encrypt("data", key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
Принцип работы:
Свойства:
CBC подходит для:
Критически важно, чтобы IV не повторялся для одного и того же ключа. Повтор IV приводит к утечке информации о структуре данных.
CFB превращает блочный шифр в потоковый режим.
CryptoJS.AES.encrypt("data", key, {
iv: iv,
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.NoPadding
});
Особенности:
Подходит для:
CFB менее чувствителен к размерам блоков и удобен при обработке потоков, где данные поступают частями.
OFB также превращает AES в потоковый шифр, но отличается механизмом генерации ключевого потока.
CryptoJS.AES.encrypt("data", key, {
iv: iv,
mode: CryptoJS.mode.OFB,
padding: CryptoJS.pad.NoPadding
});
Свойства:
OFB применяется в системах, где важна устойчивость к ошибкам передачи:
CTR является одним из наиболее гибких и современных режимов.
CryptoJS.AES.encrypt("data", key, {
iv: iv,
mode: CryptoJS.mode.CTR,
padding: CryptoJS.pad.NoPadding
});
Принцип:
Свойства:
CTR используется в:
Ключевая ошибка — повтор счётчика (IV), что полностью нарушает безопасность.
ECB:
CBC:
CFB:
OFB:
CTR:
Инициализационный вектор является ключевым элементом CBC, CFB, OFB и CTR.
Общие требования:
Пример генерации IV:
const iv = CryptoJS.lib.WordArray.random(16);
Повтор IV при одинаковом ключе приводит к возможности восстановления закономерностей в данных.
В блочных режимах (CBC, ECB) используется дополнение:
padding: CryptoJS.pad.Pkcs7
При использовании неправильного padding возможны:
CBC:
CTR:
CFB:
OFB:
ECB:
const key = CryptoJS.enc.Utf8.parse("secretkey123456");
const iv = CryptoJS.lib.WordArray.random(16);
const encrypted = CryptoJS.AES.encrypt("message data", key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
const result = {
iv: iv.toString(),
data: encrypted.toString()
};
Такой подход обеспечивает баланс между безопасностью и совместимостью с большинством систем хранения и передачи данных.