Режим CBC: цепочка блоков шифротекста

Общая идея блочного режима CBC

Cipher Block Chaining (CBC) — один из классических режимов работы блочных шифров, используемых в криптографических библиотеках, включая CryptoJS. Его ключевая особенность заключается в том, что каждый блок открытого текста перед шифрованием комбинируется с предыдущим блоком шифротекста.

Математически это выражается следующим образом:

  • Шифрование:

    [ C_i = E_K(P_i C_{i-1})]

  • Расшифрование:

    [ P_i = D_K(C_i) C_{i-1}]

где:

  • (P_i) — блок открытого текста
  • (C_i) — блок шифротекста
  • (E_K) — функция шифрования с ключом
  • (D_K) — функция расшифрования с ключом
  • (C_{i-1}) — предыдущий блок шифротекста
    1. — вектор инициализации (используется вместо (C_0))

Главный смысл CBC заключается в том, что одинаковые блоки входных данных при разных позициях дают разные результаты шифрования, что устраняет проблему повторяющихся паттернов.


Роль вектора инициализации (IV)

Первый блок не имеет предыдущего шифротекста, поэтому используется специальное значение — вектор инициализации.

Ключевые свойства IV:

  • должен быть уникальным для каждой операции шифрования
  • не обязан быть секретным
  • обязан быть случайным или псевдослучайным
  • длина равна размеру блока алгоритма (например, 128 бит для AES)

Использование одинакового IV с одним ключом приводит к снижению криптографической стойкости, так как первый блок становится предсказуемым при анализе повторяющихся данных.


CBC в CryptoJS

В библиотеке CryptoJS режим CBC используется по умолчанию для алгоритма AES.

Пример шифрования:

import CryptoJS from "crypto-js";

const key = CryptoJS.enc.Utf8.parse("1234567890123456");
const iv = CryptoJS.enc.Utf8.parse("abcdef9876543210");

const plaintext = "confidential data";

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

console.log(encrypted.toString());

Здесь явно указаны:

  • режим CBC
  • IV
  • режим дополнения PKCS7

Расшифрование в режиме CBC

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

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

Расшифрование требует строго тех же параметров:

  • ключ
  • IV
  • режим работы
  • алгоритм дополнения

Несоответствие любого из параметров делает восстановление данных невозможным.


Цепочка зависимостей блоков

Основной механизм CBC — последовательная зависимость блоков.

При шифровании:

  • каждый блок открытого текста XOR-ится с предыдущим шифроблоком
  • затем проходит через криптографическое преобразование

Это создаёт эффект цепи:

  • изменение одного блока влияет на все последующие
  • ошибка в одном блоке распространяется дальше при расшифровке

Это свойство одновременно является преимуществом и ограничением режима.


Поведение при изменении данных

Если изменить один бит в шифротексте:

  • текущий блок расшифруется полностью некорректно
  • следующий блок получит искажённый вход через XOR
  • дальнейшие блоки восстанавливаются корректно

Таким образом влияние ошибки ограничено двумя блоками.


Дополнение данных (Padding)

CBC требует, чтобы длина входных данных была кратна размеру блока.

В CryptoJS используется PKCS7 padding:

Принцип работы:

  • если не хватает N байт до полного блока
  • добавляется N байт со значением N

Пример:

"HELLO" (5 байт)
дополняется до 16 байт:
"HELLO\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"

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


Безопасность CBC

CBC считается устаревающим режимом в новых системах, но всё ещё широко используется.

Преимущества:

  • скрывает повторяющиеся шаблоны
  • простая реализация
  • поддержка в большинстве библиотек

Недостатки:

  • требует корректного управления IV
  • чувствителен к подмене блоков
  • не обеспечивает целостность данных

CBC сам по себе не защищает от модификации шифротекста. Для этого требуется дополнительный механизм, например HMAC.


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

Повторное использование IV

Использование одного IV для разных сообщений с одним ключом приводит к раскрытию структуры данных.

Отсутствие случайности IV

Фиксированный IV делает первый блок предсказуемым.

Неправильное кодирование ключа

CryptoJS.AES.encrypt("text", "secretkey", {...})

Такой подход приводит к неочевидной генерации ключа и снижает контроль над безопасностью.

Игнорирование кодировки результата

CryptoJS возвращает ciphertext в Base64 по умолчанию. Ошибки при преобразовании могут привести к потере данных.


Внутренний механизм работы CBC

Алгоритм шифрования по блокам:

  1. Разбиение текста на блоки фиксированного размера
  2. XOR первого блока с IV
  3. Шифрование результата
  4. Сохранение результата как C₁
  5. Повторение для всех последующих блоков с использованием предыдущего C

При расшифровании процесс обратный:

  • сначала дешифрование блока
  • затем XOR с предыдущим шифротекстом

Производительность CBC

CBC является последовательным режимом:

  • блок i зависит от блока i-1
  • параллельная обработка невозможна при шифровании

Это делает его медленнее современных режимов, таких как CTR или GCM, которые допускают параллелизм.


Сравнение поведения блоков

При одинаковом входе:

  • ECB: одинаковые блоки → одинаковый шифротекст
  • CBC: одинаковые блоки → разные результаты

Эта разница делает CBC значительно более устойчивым к анализу структуры данных.


Применение CBC в реальных системах

CBC часто используется:

  • в устаревших протоколах
  • в файловом шифровании
  • в корпоративных системах совместимости
  • в библиотеках, где важна обратная совместимость

Однако в новых системах предпочтение отдается режимам, обеспечивающим аутентификацию, например AES-GCM.


Поведение при частичной потере данных

Если часть шифротекста повреждена:

  • соответствующий блок становится полностью некорректным
  • следующий блок теряет только часть информации
  • остальные блоки сохраняются

Это делает CBC устойчивым к локальным ошибкам передачи данных, но не к целенаправленным атакам.


Практическая структура использования в CryptoJS

Типовая конфигурация CBC:

{
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
    iv: iv,
    key: key
}

Критически важно:

  • одинаковые параметры при шифровании и расшифровании
  • строгий контроль над IV
  • корректная обработка кодировок

Архитектурные особенности

CBC создаёт зависимость между блоками, что влияет на архитектуру систем:

  • невозможность случайного доступа к блокам без расшифровки предыдущих
  • необходимость последовательной обработки данных
  • усложнение потоковой обработки

Эти особенности делают CBC менее удобным для современных высоконагруженных систем, но сохраняют его актуальность в сценариях, где важна простота и совместимость.