Режим CTR: счётчик

CTR (Counter) режим относится к потоковым режимам блочного шифрования, в которых AES перестаёт работать как «блочный» алгоритм в классическом смысле и превращается в генератор псевдослучайного потока байт. Этот поток затем побайтно накладывается на исходные данные при помощи операции XOR. В результате получается шифротекст, который по структуре не зависит от длины исходного сообщения и не требует дополнения (padding).

В основе CTR лежит идея использования счётчика, который шифруется с помощью блочного шифра (например, AES), а результат используется как ключевой поток.

Каждый блок данных обрабатывается следующим образом:

  • берётся начальное значение (nonce + counter)
  • оно шифруется алгоритмом AES
  • результат становится частью ключевого потока
  • ключевой поток XOR’ится с исходным блоком данных

y = A B

где:

  • A — открытый текст (или блок данных)
  • B — результат шифрования счётчика
  • ⊕ — операция XOR

Главное свойство CTR заключается в том, что шифрование и расшифрование выполняются одной и той же операцией XOR, что делает режим симметричным и простым в реализации.

Формирование счётчика

Счётчик в CTR состоит из двух частей:

  • nonce (уникальное значение, обычно случайное)
  • counter (монотонно увеличивающееся число)

Типичная структура блока:

[ nonce (обычно 64 бита) | counter (обычно 64 бита) ]

Или иной вариант, зависящий от реализации, но принцип остаётся одинаковым: каждый новый блок использует увеличенное значение счётчика.

Каждый блок шифрования выглядит так:

CTR_i = E_K(Nonce i)

где:

  • E_K — шифрование AES с ключом K
  • Nonce — уникальное значение для сессии
  • i — номер блока

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

Свойства режима CTR

CTR обладает рядом характеристик, которые отличают его от CBC и других режимов:

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

Однако эти преимущества сопровождаются строгими требованиями к уникальности nonce.

Использование CTR в Crypto-js

В библиотеке Crypto-js режим CTR доступен через модуль modes.CTR и используется совместно с AES.

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

import CryptoJS from "crypto-js";

const message = "Секретное сообщение";
const key = CryptoJS.enc.Utf8.parse("1234567890123456");
const iv = CryptoJS.enc.Utf8.parse("1234567890123456");

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

console.log(encrypted.toString());

Расшифрование выполняется аналогично:

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

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

Здесь важно понимать, что iv фактически играет роль начального значения счётчика.

Особенности реализации в Crypto-js

Crypto-js не всегда явно разделяет nonce и counter как отдельные сущности. Вместо этого:

  • iv используется как стартовое значение счётчика
  • дальнейшее инкрементирование происходит внутри режима CTR

Это означает, что безопасность полностью зависит от правильного управления iv.

Ошибки и безопасность

CTR считается безопасным только при строгом соблюдении нескольких правил:

Повторное использование nonce недопустимо

Если один и тот же nonce используется дважды с одинаковым ключом, происходит утечка информации:

C_1 C_2 = P_1 P_2

Это позволяет атакующему восстановить структуру исходных данных.

Нельзя использовать предсказуемый счётчик

Если значение counter легко угадывается, криптографическая стойкость резко падает.

Потеря синхронизации приводит к искажению данных

Так как CTR работает как потоковый режим, ошибка в одном блоке не распространяется на другие, но приводит к повреждению конкретного участка данных.

Отличие CTR от CBC

CTR принципиально отличается от CBC:

  • CBC требует padding, CTR — нет
  • CBC не параллелится, CTR полностью параллелен
  • CBC зависит от предыдущего блока, CTR независим по блокам
  • CTR преобразует AES в потоковый шифр

Эти свойства делают CTR предпочтительным для высокопроизводительных систем.

Практическое применение

CTR используется в ситуациях, где важны:

  • высокая скорость обработки
  • потоковая передача данных
  • параллельные вычисления
  • работа с частично известной длиной данных

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

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