Реализация AES в SJCL и её особенности

Базовая модель AES в контексте SJCL

В основе криптографической подсистемы SJCL (Stanford Javascript Crypto Library) лежит реализация симметричного блочного шифра AES (Advanced Encryption Standard), построенная с учётом ограничений JavaScript-окружений и необходимости высокой переносимости между платформами.

AES в SJCL реализуется как блочный шифр с фиксированным размером блока 128 бит и поддержкой ключей длиной 128, 192 и 256 бит. Архитектура библиотеки ориентирована на чистую программную реализацию без зависимости от WebCrypto API, что обеспечивает предсказуемое поведение даже в старых окружениях.


Представление данных и внутренний формат состояния

Представление блока

SJCL оперирует не байтовыми массивами, а 32-битными словами. Один блок AES (128 бит) представляется как массив из четырёх 32-битных слов:

  • 4 × 32-bit = 128-bit state

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

Порядок байтов

Внутренний порядок данных ориентирован на big-endian представление внутри 32-битных слов, но внешние интерфейсы SJCL абстрагируют это поведение, обеспечивая корректную работу независимо от платформы.


Расширение ключа (Key Schedule)

Общий принцип

AES требует генерации раундовых ключей из исходного ключа. В SJCL реализован стандартный алгоритм key expansion, адаптированный под 32-битную арифметику JavaScript.

Для ключей длиной:

  • 128 бит → 11 раундовых ключей
  • 192 бит → 13 раундовых ключей
  • 256 бит → 15 раундовых ключей

Особенности реализации

Ключ расширяется с использованием:

  • S-box (таблица нелинейной подстановки)
  • Rcon (раундовые константы)
  • циклических сдвигов слов

Ключевой момент реализации SJCL — агрессивное использование предварительно вычисленных таблиц, что снижает стоимость операций на каждом раунде.


S-box и оптимизация доступа

Роль S-box

S-box обеспечивает нелинейность AES и является критическим элементом безопасности. В SJCL она реализована как заранее вычисленный массив из 256 значений.

Оптимизация

Вместо вычисления замен на лету:

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

Это позволяет ускорить SubBytes — одну из самых дорогих операций AES.


Раундовая структура AES в SJCL

Каждый раунд AES (за исключением последнего) включает четыре основных этапа:

  1. SubBytes
  2. ShiftRows
  3. MixColumns
  4. AddRoundKey

SJCL реализует эти этапы с упором на объединение операций в единые проходы по 32-битным словам.


SubBytes в SJCL

SubBytes применяется ко всем байтам состояния через S-box. Вместо побайтовой обработки используется побитовая декомпозиция 32-битных слов.

Ключевая особенность: операция реализована через маскирование и сдвиги, что позволяет обрабатывать сразу 4 байта одного слова.


ShiftRows: неявная реализация

ShiftRows в SJCL не реализуется как отдельный шаг перестановки массива. Вместо этого используется:

  • изменение индексов доступа к словам
  • перестановка внутри операций MixColumns и AddRoundKey

Такой подход уменьшает количество операций копирования памяти.


MixColumns и линейные преобразования

MixColumns — наиболее вычислительно тяжёлая часть AES. SJCL оптимизирует её через предвычисленные таблицы умножения в конечном поле GF(2^8).

Используются таблицы:

  • mul2
  • mul3
  • иногда комбинированные lookup-таблицы

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


AddRoundKey

Операция XOR с раундовым ключом остаётся самой простой частью:

  • побитовое XOR 32-битных слов
  • отсутствие ветвлений
  • высокая скорость выполнения в JS-движках

Оптимизация через T-tables

Концепция T-tables

SJCL активно использует технику T-tables, при которой несколько этапов AES объединяются в одну табличную операцию.

T-table объединяет:

  • SubBytes
  • ShiftRows
  • MixColumns

в одну lookup-операцию.

Преимущества

  • резкое сокращение числа операций
  • минимизация работы с битами
  • повышение cache locality

Недостатки

  • увеличение размера памяти
  • потенциальная чувствительность к cache timing атакам (в теоретическом плане)

Режимы работы AES в SJCL

Хотя AES — это блочный шифр, SJCL реализует его через различные режимы:

  • ECB (не рекомендуется к использованию)
  • CBC
  • CFB
  • OFB
  • CTR (наиболее распространённый)
  • GCM (в некоторых расширениях)

AES ядро при этом остаётся неизменным — меняется только способ обработки блоков.


CTR-режим и его связь с AES

CTR (Counter Mode) в SJCL часто используется как основа потокового шифрования.

Принцип:

  • AES шифрует счётчик
  • результат XOR-ится с данными

Особенность реализации SJCL:

  • счётчик представлен как 128-битное число в тех же 32-битных словах
  • инкремент реализован через арифметику слов с переносом

Обработка больших данных

Потоковая модель

SJCL обрабатывает данные блоками по 128 бит, но предоставляет интерфейсы для потоковой обработки:

  • incremental encryption
  • incremental decryption

Это позволяет:

  • шифровать данные без загрузки всего буфера в память
  • работать с потоками (например, файловыми или сетевыми)

Особенности JavaScript-реализации AES

Ограничения JS-движков

Реализация AES в SJCL учитывает особенности:

  • 32-битные операции оптимальны
  • побитовые операции приводят к signed 32-bit интерпретации
  • необходимость избегать медленных динамических объектов

Приведение типов

SJCL активно использует:

  • | 0 для приведения к 32-битному целому
  • unsigned right shift >>> 0 для нормализации значений

Это критично для корректности криптографических операций.


Безопасность реализации

Отсутствие зависимости от WebCrypto

SJCL AES полностью программный, что даёт:

  • предсказуемость
  • кроссплатформенность
  • отсутствие аппаратных backdoor-зависимостей

Потенциальные риски

Несмотря на криптографическую корректность AES, реализация в JS:

  • потенциально уязвима к timing-атакам (из-за T-tables)
  • зависит от особенностей JIT-компиляции

Производительность и компромиссы

SJCL выбирает баланс между:

  • чистотой реализации
  • скоростью выполнения
  • совместимостью

Основные оптимизации:

  • использование 32-битных слов
  • T-tables
  • минимизация ветвлений
  • предвычисленные константы

Архитектурная роль AES внутри SJCL

AES в SJCL — не просто алгоритм, а базовый строительный блок для:

  • HMAC
  • PBKDF2
  • симметричного шифрования потоков
  • гибридных криптосистем

Его реализация ориентирована на универсальность и предсказуемость, а не на аппаратную ускоренность.


Внутренние зависимости и структура кода

AES модуль в SJCL тесно связан с:

  • sjcl.cipher.aes — основной класс шифра
  • sjcl.bitArray — работа с битовыми массивами
  • sjcl.codec — сериализация входных данных

Такая структура обеспечивает отделение криптографии от представления данных.