В основе криптографической подсистемы SJCL (Stanford Javascript Crypto Library) лежит реализация симметричного блочного шифра AES (Advanced Encryption Standard), построенная с учётом ограничений JavaScript-окружений и необходимости высокой переносимости между платформами.
AES в SJCL реализуется как блочный шифр с фиксированным размером блока 128 бит и поддержкой ключей длиной 128, 192 и 256 бит. Архитектура библиотеки ориентирована на чистую программную реализацию без зависимости от WebCrypto API, что обеспечивает предсказуемое поведение даже в старых окружениях.
SJCL оперирует не байтовыми массивами, а 32-битными словами. Один блок AES (128 бит) представляется как массив из четырёх 32-битных слов:
Такое представление выбрано по причинам производительности в JavaScript-движках, где операции над 32-битными числами выполняются быстрее и стабильнее, чем частые побайтовые манипуляции.
Внутренний порядок данных ориентирован на big-endian представление внутри 32-битных слов, но внешние интерфейсы SJCL абстрагируют это поведение, обеспечивая корректную работу независимо от платформы.
AES требует генерации раундовых ключей из исходного ключа. В SJCL реализован стандартный алгоритм key expansion, адаптированный под 32-битную арифметику JavaScript.
Для ключей длиной:
Ключ расширяется с использованием:
Ключевой момент реализации SJCL — агрессивное использование предварительно вычисленных таблиц, что снижает стоимость операций на каждом раунде.
S-box обеспечивает нелинейность AES и является критическим элементом безопасности. В SJCL она реализована как заранее вычисленный массив из 256 значений.
Вместо вычисления замен на лету:
Это позволяет ускорить SubBytes — одну из самых дорогих операций AES.
Каждый раунд AES (за исключением последнего) включает четыре основных этапа:
SJCL реализует эти этапы с упором на объединение операций в единые проходы по 32-битным словам.
SubBytes применяется ко всем байтам состояния через S-box. Вместо побайтовой обработки используется побитовая декомпозиция 32-битных слов.
Ключевая особенность: операция реализована через маскирование и сдвиги, что позволяет обрабатывать сразу 4 байта одного слова.
ShiftRows в SJCL не реализуется как отдельный шаг перестановки массива. Вместо этого используется:
Такой подход уменьшает количество операций копирования памяти.
MixColumns — наиболее вычислительно тяжёлая часть AES. SJCL оптимизирует её через предвычисленные таблицы умножения в конечном поле GF(2^8).
Используются таблицы:
Это позволяет заменить умножение в поле на простые обращения к массивам.
Операция XOR с раундовым ключом остаётся самой простой частью:
SJCL активно использует технику T-tables, при которой несколько этапов AES объединяются в одну табличную операцию.
T-table объединяет:
в одну lookup-операцию.
Хотя AES — это блочный шифр, SJCL реализует его через различные режимы:
AES ядро при этом остаётся неизменным — меняется только способ обработки блоков.
CTR (Counter Mode) в SJCL часто используется как основа потокового шифрования.
Принцип:
Особенность реализации SJCL:
SJCL обрабатывает данные блоками по 128 бит, но предоставляет интерфейсы для потоковой обработки:
Это позволяет:
Реализация AES в SJCL учитывает особенности:
SJCL активно использует:
| 0 для приведения к 32-битному целому>>> 0 для нормализации
значенийЭто критично для корректности криптографических операций.
SJCL AES полностью программный, что даёт:
Несмотря на криптографическую корректность AES, реализация в JS:
SJCL выбирает баланс между:
Основные оптимизации:
AES в SJCL — не просто алгоритм, а базовый строительный блок для:
Его реализация ориентирована на универсальность и предсказуемость, а не на аппаратную ускоренность.
AES модуль в SJCL тесно связан с:
sjcl.cipher.aes — основной класс шифраsjcl.bitArray — работа с битовыми массивамиsjcl.codec — сериализация входных данныхТакая структура обеспечивает отделение криптографии от представления данных.