Режим OCB2: устройство и параметры

Общая структура режима

OCB2 (Offset Codebook Mode v2) представляет собой режим аутентифицированного шифрования, объединяющий конфиденциальность и целостность данных в одном проходе. В основе лежит блочный шифр, чаще всего AES с блоком 128 бит, а также система смещений (offsets), позволяющая обрабатывать каждый блок открытого текста независимо, но согласованно с предыдущими значениями.

Ключевая особенность OCB2 заключается в том, что шифрование и вычисление аутентификационного тега происходят одновременно, без необходимости отдельного прохода, как в классических схемах Encrypt-then-MAC.

Основные компоненты:

  • блочный шифр (AES как стандарт в SJCL)
  • секретный ключ
  • nonce (одноразовый вектор)
  • связанное аутентифицированное данные (AAD)
  • теги целостности
  • последовательность offset-значений

Базовая модель преобразования

Каждый блок открытого текста обрабатывается с использованием уникального смещения, вычисляемого детерминированно из nonce и номера блока.

Пусть:

  • ( P_i ) — i-й блок открытого текста
  • ( C_i ) — i-й блок шифртекста
  • ( K ) — ключ AES
  • ( N ) — nonce
  • ( _i ) — offset для блока i

Тогда общая идея преобразования:

  • ( C_i = E_K(P_i _i) _i )

где ( E_K ) — шифрование AES.

Offset обновляется через удвоение в конечном поле ( GF(2^{128}) ), что позволяет избежать повторений и сохраняет криптографическую независимость блоков.


Инициализация режима

OCB2 в SJCL требует следующих параметров:

  • ключ (128/192/256 бит для AES)
  • nonce (обычно 96–128 бит)
  • длина тега аутентичности
  • данные AAD (опционально)

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


Связанные данные (AAD)

AAD (Additional Authenticated Data) не шифруется, но включается в вычисление аутентификационного тега. Это позволяет защищать заголовки протоколов, метаданные или служебную информацию.

В OCB2 AAD обрабатывается аналогично блокам сообщения, но отдельно от основного потока данных.

Формально:

  • AAD влияет на финальный тег
  • не участвует в формировании шифртекста

Вычисление аутентификационного тега

Тег формируется на основе:

  • всех блоков открытого текста
  • всех блоков AAD
  • nonce
  • длины сообщения

Итоговая стадия включает криптографическое сведение всех промежуточных значений в один блок через AES и XOR-операции с финальными offsets.

Тег обеспечивает:

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

Обработка неполного блока

Если длина сообщения не кратна 128 бит, последний блок обрабатывается специальным образом:

  • используется padding (обычно 1 бит + нули или стандарт OCB padding)
  • применяется отдельный offset ( _* )
  • вычисляется специальное значение checksum

Это позволяет корректно шифровать данные произвольной длины без потери безопасности.


Криптографические свойства

OCB2 обеспечивает:

  • конфиденциальность (IND-CPA)
  • аутентификацию (INT-CTXT)
  • защиту от подмены блоков
  • защиту от повторного воспроизведения при корректном использовании nonce

Однако безопасность полностью зависит от уникальности nonce. Повтор nonce приводит к утечке XOR-связей между сообщениями.


Реализация в SJCL

В Stanford JavaScript Crypto Library OCB2 реализован как один из режимов AES.

Типичная структура использования:

var key = sjcl.random.randomWords(8); // 256-bit key
var nonce = sjcl.random.randomWords(3); // 96-bit nonce

var aes = new sjcl.cipher.aes(key);

var ocb2 = new sjcl.mode.ocb2(aes, nonce, [], 64);

var plaintext = sjcl.codec.utf8String.toBits("secret message");

var ciphertext = ocb2.encrypt(plaintext);

var decrypted = ocb2.decrypt(ciphertext);

Параметры реализации SJCL OCB2

Ключ

Поддерживаются стандартные длины AES:

  • 128 бит
  • 192 бит
  • 256 бит

Ключ расширяется внутри AES-раундовой структуры и не используется напрямую в OCB2.


Nonce

В SJCL nonce передается как массив 32-битных слов.

Требования:

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

Tag length

Длина тега задается в битах:

  • 32
  • 64 (наиболее распространено)
  • 96
  • 128

Увеличение длины тега повышает устойчивость к коллизиям, но увеличивает накладные расходы.


Associated data

Передается как массив бит:

var adata = sjcl.codec.utf8String.toBits("header");

Используется при инициализации OCB2:

var ocb2 = new sjcl.mode.ocb2(aes, nonce, adata, 64);

Внутренние offsets и их роль

Offset-значения ( _i ) являются центральным элементом OCB2.

Они формируются следующим образом:

  • начальное значение зависит от nonce

  • последующие вычисляются как удвоение:

    • ( _{i+1} = 2 _i ) в ( GF(2^{128}) )

Операция удвоения включает:

  • битовый сдвиг влево
  • при переполнении XOR с полиномом редукции

Это обеспечивает равномерное распределение и исключает линейные зависимости между блоками.


Особенности безопасности OCB2

OCB2 исторически считается менее предпочтительным, чем OCB3 или AES-GCM, по причинам:

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

Тем не менее, в контролируемых средах OCB2 остаётся эффективным и быстрым режимом.


Типичные ошибки при использовании в SJCL

На практике наиболее критичны следующие проблемы:

  • повторное использование nonce
  • использование фиксированного nonce
  • неправильная обработка AAD (несоответствие при расшифровке)
  • усечение тега до слишком малого размера
  • хранение ключа в открытом виде в коде

Поведение при расшифровке

Процесс обратный:

  1. восстановление offsets из nonce
  2. расшифровка блоков AES
  3. проверка checksum и тега
  4. сравнение вычисленного тега с переданным

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


Влияние структуры SJCL на OCB2

SJCL реализует криптографические режимы как объекты поверх AES:

  • AES реализует только блоковые операции
  • OCB2 добавляет логику потоковой обработки
  • codec отвечает за преобразование типов данных

Это делает OCB2 в SJCL модульным и легко заменяемым компонентом в более сложных криптосистемах.