Режим OFB: обратная связь по выходу

Режим OFB преобразует блочный шифр в потоковый, формируя последовательность псевдослучайных байтов (keystream), которые затем комбинируются с открытым текстом побайтно через операцию XOR.

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


Механизм работы OFB

Работа режима строится вокруг итеративного процесса:

  1. Берётся вектор инициализации (IV)
  2. Он шифруется с использованием секретного ключа
  3. Результат становится частью ключевого потока
  4. Полученный блок снова подаётся на вход блочного шифра
  5. Процесс повторяется до получения необходимой длины потока

Формально:

K_1 = E_K(IV) K_{i} = E_K(K_{i-1}) C_i = P_i K_i

где:

  • (E_K) — шифрование блоковым алгоритмом с ключом (K)
    1. — вектор инициализации
  • (P_i) — блок открытого текста
  • (K_i) — псевдослучайный поток
  • (C_i) — шифртекст

Особенности генерации ключевого потока

В OFB режим превращает блочный шифр (например, AES) в генератор потока:

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

Это делает режим предсказуемым при повторном использовании IV, что критично с точки зрения безопасности.


Работа с CryptoJS

Библиотека CryptoJS поддерживает OFB через конфигурацию режима шифрования.

Шифрование AES в режиме OFB

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

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

const plaintext = "Secret message";

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

console.log(encrypted.toString());

Дешифрование

Процесс симметричен, так как поток ключа идентичен:

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

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

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

IV в OFB выполняет критически важную функцию:

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

Повтор IV при одном и том же ключе приводит к повтору keystream, что позволяет атакующему восстановить XOR двух сообщений:

C_1 C_2 = (P_1 K) (P_2 K) = P_1 P_2


Отличия OFB от других режимов

OFB vs CBC

  • CBC использует результат предыдущего блока шифртекста
  • OFB использует только результат шифрования IV/предыдущего состояния
  • OFB не распространяет ошибки
  • CBC требует паддинга, OFB может работать как потоковый режим

Ошибки и устойчивость к искажениям

Одно из ключевых свойств OFB:

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

Это объясняется тем, что поток ключа не зависит от шифртекста.


Особенности паддинга в CryptoJS

В режиме OFB паддинг часто отключается:

padding: CryptoJS.pad.NoPadding

Причина:

  • потоковый режим не требует выравнивания по блокам
  • данные могут иметь произвольную длину

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

OFB применяется там, где важны:

  • потоковая обработка данных
  • устойчивость к ошибкам передачи
  • работа с реальным временем (streaming)

Типичные области:

  • телекоммуникации
  • защищённые каналы передачи
  • некоторые IoT-протоколы

Криптографические ограничения

Несмотря на удобство, OFB имеет критические ограничения:

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

Эти факторы делают режим менее предпочтительным по сравнению с современными режимами аутентифицированного шифрования.


Внутренняя реализация в CryptoJS

CryptoJS реализует OFB как слой над блочным шифром:

  • используется AES (или другой алгоритм)
  • создаётся генератор keystream через последовательное шифрование IV
  • XOR выполняется на уровне WordArray

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