OCB2 (Offset Codebook Mode v2) представляет собой режим аутентифицированного шифрования, объединяющий конфиденциальность и целостность данных в одном проходе. В основе лежит блочный шифр, чаще всего AES с блоком 128 бит, а также система смещений (offsets), позволяющая обрабатывать каждый блок открытого текста независимо, но согласованно с предыдущими значениями.
Ключевая особенность OCB2 заключается в том, что шифрование и вычисление аутентификационного тега происходят одновременно, без необходимости отдельного прохода, как в классических схемах Encrypt-then-MAC.
Основные компоненты:
Каждый блок открытого текста обрабатывается с использованием уникального смещения, вычисляемого детерминированно из nonce и номера блока.
Пусть:
Тогда общая идея преобразования:
где ( E_K ) — шифрование AES.
Offset обновляется через удвоение в конечном поле ( GF(2^{128}) ), что позволяет избежать повторений и сохраняет криптографическую независимость блоков.
OCB2 в SJCL требует следующих параметров:
Nonce играет критическую роль: повторное использование nonce с тем же ключом полностью разрушает безопасность режима, приводя к раскрытию информации об открытом тексте.
AAD (Additional Authenticated Data) не шифруется, но включается в вычисление аутентификационного тега. Это позволяет защищать заголовки протоколов, метаданные или служебную информацию.
В OCB2 AAD обрабатывается аналогично блокам сообщения, но отдельно от основного потока данных.
Формально:
Тег формируется на основе:
Итоговая стадия включает криптографическое сведение всех промежуточных значений в один блок через AES и XOR-операции с финальными offsets.
Тег обеспечивает:
Если длина сообщения не кратна 128 бит, последний блок обрабатывается специальным образом:
Это позволяет корректно шифровать данные произвольной длины без потери безопасности.
OCB2 обеспечивает:
Однако безопасность полностью зависит от уникальности nonce. Повтор nonce приводит к утечке XOR-связей между сообщениями.
В 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);
Поддерживаются стандартные длины AES:
Ключ расширяется внутри AES-раундовой структуры и не используется напрямую в OCB2.
В SJCL nonce передается как массив 32-битных слов.
Требования:
Длина тега задается в битах:
Увеличение длины тега повышает устойчивость к коллизиям, но увеличивает накладные расходы.
Передается как массив бит:
var adata = sjcl.codec.utf8String.toBits("header");
Используется при инициализации OCB2:
var ocb2 = new sjcl.mode.ocb2(aes, nonce, adata, 64);
Offset-значения ( _i ) являются центральным элементом OCB2.
Они формируются следующим образом:
начальное значение зависит от nonce
последующие вычисляются как удвоение:
Операция удвоения включает:
Это обеспечивает равномерное распределение и исключает линейные зависимости между блоками.
OCB2 исторически считается менее предпочтительным, чем OCB3 или AES-GCM, по причинам:
Тем не менее, в контролируемых средах OCB2 остаётся эффективным и быстрым режимом.
На практике наиболее критичны следующие проблемы:
Процесс обратный:
При несовпадении тегов операция должна завершаться ошибкой без раскрытия частичной информации о содержимом.
SJCL реализует криптографические режимы как объекты поверх AES:
Это делает OCB2 в SJCL модульным и легко заменяемым компонентом в более сложных криптосистемах.