В библиотеке Stanford JavaScript Crypto Library (SJCL) симметричное шифрование строится в первую очередь вокруг AES (Advanced Encryption Standard). AES поддерживает три фиксированных размера ключа: 128, 192 и 256 бит. Эти варианты не являются просто «уровнями сложности», а представляют собой разные криптографические конфигурации с отличиями в структуре раундов, стойкости и вычислительной стоимости.
Ключ в AES рассматривается как исходный секрет, из которого генерируется расширенный набор раундовых ключей (key schedule). Именно этот процесс напрямую зависит от длины исходного ключа и определяет внутреннюю сложность алгоритма.
SJCL реализует AES в чистом JavaScript и использует стандартную структуру:
блок данных: 128 бит
размер ключа: 128 / 192 / 256 бит
число раундов:
Каждый раунд включает последовательность преобразований:
Исключение составляет последний раунд, где MixColumns не применяется.
Ключевой момент заключается в том, что увеличение длины ключа не просто добавляет «лишние биты», а увеличивает количество раундов и усложняет расписание ключей.
AES-128 использует ключ длиной 128 бит (16 байт). Это базовый и наиболее широко применяемый вариант.
Расширение ключа генерирует:
Каждый раундовый ключ имеет размер 128 бит.
AES-128 считается криптографически стойким при современных вычислительных возможностях. Полный перебор требует 2¹²⁸ операций, что выходит за пределы практической реализуемости.
На практике:
В JavaScript AES-128 заметно быстрее старших вариантов:
В браузерных и мобильных сценариях это критично, особенно при шифровании больших объёмов данных.
AES-192 использует ключ длиной 192 бита (24 байта). Это промежуточный вариант между 128 и 256 бит.
Расширение ключа формирует:
Ключевое отличие — усложнённый key schedule по сравнению с AES-128.
AES-192 требует дополнительных операций в процессе расширения ключа:
Это влияет не только на скорость шифрования, но и на время подготовки ключа.
С точки зрения криптостойкости AES-192 практически не используется как «практический стандарт», но:
Исторически он рассматривается как компромиссный вариант, но в современных системах часто пропускается.
AES-256 использует ключ длиной 256 бит (32 байта) и является наиболее криптостойким вариантом из трёх.
Расширение ключа создаёт:
Главное отличие — более сложный алгоритм key schedule, включающий дополнительную трансформацию слова ключа через функцию SubWord и Rcon на более поздних стадиях.
В AES-256 есть важная особенность:
Это снижает вероятность атак на расписание ключей (related-key attacks).
Теоретическая стойкость AES-256 равна 2²⁵⁶ операций перебора, что делает его практически недостижимым для brute-force атак.
Однако важно учитывать:
AES-256 часто выбирается в системах с повышенными требованиями к долговременной конфиденциальности:
В JavaScript AES-256 заметно медленнее AES-128:
Разница особенно проявляется:
В SJCL это выражается в увеличении времени выполнения примерно на 30–60% относительно AES-128 (в зависимости от платформы).
В SJCL выбор длины ключа обычно скрыт за высокоуровневыми функциями:
sjcl.encrypt(password, data)sjcl.decrypt(password, data)Фактический AES-ключ не задаётся напрямую пользователем, а выводится
через KDF (например, PBKDF2 или sjcl.misc.pbkdf2).
Однако внутри библиотеки AES-ключ всегда нормализуется к одному из допустимых размеров:
SJCL автоматически подбирает соответствующий вариант AES в зависимости от длины ключевого массива.
Хотя различия между AES-128 и AES-256 выглядят значительными на уровне битовой стойкости, в реальных системах важнее другие факторы:
В SJCL ключ AES часто является производным от пароля, и именно KDF становится слабым звеном, а не сам AES.
В условиях JavaScript-окружения различие в производительности может быть более значимым, чем теоретическая разница в стойкости.
SJCL не использует нативные AES-инструкции процессора. Всё реализовано на чистом Jav * aScript:
Это означает:
Также важно, что SJCL ориентирован на совместимость и предсказуемость, а не на максимальную аппаратную скорость.
В архитектуре SJCL ключ AES — лишь один слой защиты. Общая безопасность формируется комбинацией:
Поэтому увеличение длины ключа усиливает только один компонент системы, не гарантируя пропорционального роста общей стойкости.