Длины ключей: 128, 192, 256 бит

В библиотеке Stanford JavaScript Crypto Library (SJCL) симметричное шифрование строится в первую очередь вокруг AES (Advanced Encryption Standard). AES поддерживает три фиксированных размера ключа: 128, 192 и 256 бит. Эти варианты не являются просто «уровнями сложности», а представляют собой разные криптографические конфигурации с отличиями в структуре раундов, стойкости и вычислительной стоимости.

Ключ в AES рассматривается как исходный секрет, из которого генерируется расширенный набор раундовых ключей (key schedule). Именно этот процесс напрямую зависит от длины исходного ключа и определяет внутреннюю сложность алгоритма.


Общие принципы работы ключей в AES внутри SJCL

SJCL реализует AES в чистом JavaScript и использует стандартную структуру:

  • блок данных: 128 бит

  • размер ключа: 128 / 192 / 256 бит

  • число раундов:

    • 10 раундов для 128 бит
    • 12 раундов для 192 бит
    • 14 раундов для 256 бит

Каждый раунд включает последовательность преобразований:

  • SubBytes
  • ShiftRows
  • MixColumns
  • AddRoundKey

Исключение составляет последний раунд, где MixColumns не применяется.

Ключевой момент заключается в том, что увеличение длины ключа не просто добавляет «лишние биты», а увеличивает количество раундов и усложняет расписание ключей.


Ключ AES-128

Структура и особенности

AES-128 использует ключ длиной 128 бит (16 байт). Это базовый и наиболее широко применяемый вариант.

Расширение ключа генерирует:

  • 11 раундовых ключей (по одному на каждый из 10 раундов + начальный)

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

Безопасность

AES-128 считается криптографически стойким при современных вычислительных возможностях. Полный перебор требует 2¹²⁸ операций, что выходит за пределы практической реализуемости.

На практике:

  • устойчив к классическим атакам
  • широко используется в TLS, VPN, файловом шифровании
  • является стандартом по умолчанию во многих системах

Производительность в SJCL

В JavaScript AES-128 заметно быстрее старших вариантов:

  • меньше раундов (10)
  • более короткий key schedule
  • меньше операций XOR и S-box обращений

В браузерных и мобильных сценариях это критично, особенно при шифровании больших объёмов данных.


Ключ AES-192

Структура и особенности

AES-192 использует ключ длиной 192 бита (24 байта). Это промежуточный вариант между 128 и 256 бит.

Расширение ключа формирует:

  • 13 раундовых ключей
  • 12 раундов шифрования

Ключевое отличие — усложнённый key schedule по сравнению с AES-128.

Математическая нагрузка

AES-192 требует дополнительных операций в процессе расширения ключа:

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

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

Безопасность

С точки зрения криптостойкости AES-192 практически не используется как «практический стандарт», но:

  • обеспечивает запас прочности выше AES-128
  • не даёт радикального увеличения стойкости по сравнению с AES-256
  • редко применяется в массовых веб-сценариях

Исторически он рассматривается как компромиссный вариант, но в современных системах часто пропускается.


Ключ AES-256

Структура и особенности

AES-256 использует ключ длиной 256 бит (32 байта) и является наиболее криптостойким вариантом из трёх.

Расширение ключа создаёт:

  • 15 раундовых ключей
  • 14 раундов шифрования

Главное отличие — более сложный алгоритм key schedule, включающий дополнительную трансформацию слова ключа через функцию SubWord и Rcon на более поздних стадиях.

Усиленный key schedule

В AES-256 есть важная особенность:

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

Это снижает вероятность атак на расписание ключей (related-key attacks).


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

Теоретическая стойкость AES-256 равна 2²⁵⁶ операций перебора, что делает его практически недостижимым для brute-force атак.

Однако важно учитывать:

  • увеличение длины ключа не устраняет ошибки реализации
  • устойчивость системы зависит не только от AES, но и от режима работы (CBC, GCM, CTR)
  • SJCL обычно используется в высокоуровневых схемах (например, password-based encryption), где ключ — результат KDF

AES-256 часто выбирается в системах с повышенными требованиями к долговременной конфиденциальности:

  • государственные стандарты
  • архивное шифрование
  • критически важные данные

Производительность AES-256 в SJCL

В JavaScript AES-256 заметно медленнее AES-128:

  • 14 раундов вместо 10
  • более тяжёлый key schedule
  • больше операций в каждом цикле

Разница особенно проявляется:

  • при шифровании потоков данных
  • в браузерах на слабых устройствах
  • при повторных операциях шифрования (например, WebRTC, secure storage)

В SJCL это выражается в увеличении времени выполнения примерно на 30–60% относительно AES-128 (в зависимости от платформы).


Сравнение ключей 128 / 192 / 256

Количество раундов

  • AES-128 → 10 раундов
  • AES-192 → 12 раундов
  • AES-256 → 14 раундов

Длина ключа

  • 128 бит → 16 байт
  • 192 бит → 24 байта
  • 256 бит → 32 байта

Стоимость вычислений

  • AES-128: минимальная нагрузка
  • AES-192: умеренная нагрузка
  • AES-256: максимальная нагрузка

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

  • AES-128: достаточный для большинства задач
  • AES-192: промежуточный, редко оправдан
  • AES-256: максимальный запас стойкости против будущих атак

Использование ключей в SJCL API

В SJCL выбор длины ключа обычно скрыт за высокоуровневыми функциями:

  • sjcl.encrypt(password, data)
  • sjcl.decrypt(password, data)

Фактический AES-ключ не задаётся напрямую пользователем, а выводится через KDF (например, PBKDF2 или sjcl.misc.pbkdf2).

Однако внутри библиотеки AES-ключ всегда нормализуется к одному из допустимых размеров:

  • 128 бит → усечение или генерация 16 байт
  • 192 бит → 24 байта
  • 256 бит → 32 байта

SJCL автоматически подбирает соответствующий вариант AES в зависимости от длины ключевого массива.


Влияние длины ключа на безопасность всей системы

Хотя различия между AES-128 и AES-256 выглядят значительными на уровне битовой стойкости, в реальных системах важнее другие факторы:

  • качество пароля или исходного секрета
  • стойкость KDF (количество итераций PBKDF2)
  • корректность режима шифрования
  • отсутствие повторного использования IV
  • защита от утечек через side-channel

В SJCL ключ AES часто является производным от пароля, и именно KDF становится слабым звеном, а не сам AES.


Практическая интерпретация выбора длины ключа

  • AES-128: оптимальный баланс скорости и безопасности, стандартный выбор для большинства веб-приложений на SJCL
  • AES-192: технически допустим, но редко даёт практическое преимущество
  • AES-256: предпочтителен при необходимости максимальной криптографической устойчивости и долгосрочного хранения данных

В условиях JavaScript-окружения различие в производительности может быть более значимым, чем теоретическая разница в стойкости.


Особенности реализации SJCL, влияющие на работу ключей

SJCL не использует нативные AES-инструкции процессора. Всё реализовано на чистом Jav * aScript:

  • операции над 32-битными словами
  • таблицы S-box в памяти
  • программный key schedule

Это означает:

  • производительность напрямую зависит от числа раундов
  • AES-256 нагружает интерпретатор заметно сильнее
  • оптимизация JIT может частично компенсировать разницу, но не полностью

Также важно, что SJCL ориентирован на совместимость и предсказуемость, а не на максимальную аппаратную скорость.


Роль длины ключа в общей модели безопасности SJCL

В архитектуре SJCL ключ AES — лишь один слой защиты. Общая безопасность формируется комбинацией:

  • AES (128/192/256)
  • PBKDF2 (или альтернативный KDF)
  • соль (salt)
  • IV (инициализационный вектор)
  • режим шифрования (обычно CCM или GCM-аналоги в экосистеме)

Поэтому увеличение длины ключа усиливает только один компонент системы, не гарантируя пропорционального роста общей стойкости.