Режим OFB преобразует блочный шифр в потоковый, формируя последовательность псевдослучайных байтов (keystream), которые затем комбинируются с открытым текстом побайтно через операцию XOR.
Ключевая особенность OFB заключается в том, что шифрование и дешифрование используют одинаковый процесс генерации потока ключа, а сам шифртекст не влияет на дальнейшее формирование ключевого потока.
Работа режима строится вокруг итеративного процесса:
Формально:
K_1 = E_K(IV) K_{i} = E_K(K_{i-1}) C_i = P_i K_i
где:
В OFB режим превращает блочный шифр (например, AES) в генератор потока:
Это делает режим предсказуемым при повторном использовании IV, что критично с точки зрения безопасности.
Библиотека CryptoJS поддерживает 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 в OFB выполняет критически важную функцию:
Повтор IV при одном и том же ключе приводит к повтору keystream, что позволяет атакующему восстановить XOR двух сообщений:
C_1 C_2 = (P_1 K) (P_2 K) = P_1 P_2
Одно из ключевых свойств OFB:
Это объясняется тем, что поток ключа не зависит от шифртекста.
В режиме OFB паддинг часто отключается:
padding: CryptoJS.pad.NoPadding
Причина:
OFB применяется там, где важны:
Типичные области:
Несмотря на удобство, OFB имеет критические ограничения:
Эти факторы делают режим менее предпочтительным по сравнению с современными режимами аутентифицированного шифрования.
CryptoJS реализует OFB как слой над блочным шифром:
Структурно режим работает независимо от типа блока шифра, что позволяет использовать OFB с любым алгоритмом, поддерживаемым библиотекой.