Обзор поддерживаемых алгоритмов и примитивов

Библиотека sjcl (Stanford JavaScript Crypto Library) предоставляет реализацию блочных шифров с акцентом на безопасность и переносимость в браузерной среде.

AES (Advanced Encryption Standard)

Основной и единственный блочный шифр в библиотеке — AES. Поддерживаются следующие характеристики:

  • Размер блока: 128 бит
  • Длины ключей: 128, 192, 256 бит
  • Режим работы: реализуется отдельно через режимы сцепления

Пример создания объекта шифра:

var key = sjcl.random.randomWords(4); // 128 бит
var aes = new sjcl.cipher.aes(key);

Режимы шифрования

SJCL реализует несколько режимов работы блочных шифров, позволяющих использовать AES в различных сценариях.

CCM (Counter with CBC-MAC)

Наиболее часто используемый режим в SJCL — CCM, обеспечивающий одновременно:

  • Конфиденциальность (шифрование)
  • Целостность (аутентификация)

Особенности:

  • Использует счётчик (CTR) для шифрования
  • CBC-MAC для аутентификации
  • Требует nonce (уникальный вектор инициализации)

Пример:

var encrypted = sjcl.mode.ccm.encrypt(aes, data, iv);
var decrypted = sjcl.mode.ccm.decrypt(aes, encrypted, iv);

GCM (Galois/Counter Mode)

Также доступен режим GCM, обладающий высокой производительностью и аналогичной функциональностью:

  • Быстрое аутентифицированное шифрование
  • Подходит для потоковых данных
var encrypted = sjcl.mode.gcm.encrypt(aes, data, iv);

OCB2 (Offset Codebook Mode)

Режим OCB2 реализует аутентифицированное шифрование:

  • Более эффективен, чем CCM
  • Ограничен патентными аспектами (в некоторых юрисдикциях)
var encrypted = sjcl.mode.ocb2.encrypt(aes, data, iv);

Хэш-функции

SJCL включает криптографические хэш-функции для обеспечения целостности данных и построения других примитивов.

SHA-256

Основная хэш-функция — SHA-256:

  • Выход: 256 бит
  • Используется в HMAC, PBKDF2 и других алгоритмах

Пример:

var hash = sjcl.hash.sha256.hash("message");

SHA-1

Поддерживается также SHA-1, но использование не рекомендуется:

  • Уязвим к коллизиям
  • Оставлен для совместимости
var hash = sjcl.hash.sha1.hash("message");

MAC (Message Authentication Code)

HMAC (Hash-based MAC)

SJCL реализует HMAC на основе SHA-256:

  • Обеспечивает целостность и аутентичность сообщения
  • Использует секретный ключ

Пример:

var hmac = new sjcl.misc.hmac(key, sjcl.hash.sha256);
var mac = hmac.encrypt("message");

Генерация случайных чисел

CSPRNG (Cryptographically Secure PRNG)

SJCL содержит криптографически стойкий генератор случайных чисел:

  • Основан на энтропии от браузера
  • Использует события (движения мыши, время и др.)

Пример:

var randomWords = sjcl.random.randomWords(8);

Особенности:

  • Автоматическое накопление энтропии
  • Возможность ручного добавления:
sjcl.random.addEntropy(data, bits, "source");

Производные ключей

PBKDF2 (Password-Based Key Derivation Function 2)

Используется для получения криптографических ключей из паролей:

  • Основан на HMAC-SHA256
  • Поддерживает соль и число итераций

Пример:

var key = sjcl.misc.pbkdf2(password, salt, iterations, keyLength);

Параметры:

  • password — исходный пароль
  • salt — случайная соль
  • iterations — число итераций (например, 10000+)
  • keyLength — длина ключа в битах

Кодирование данных

SJCL активно использует собственное представление данных — массивы 32-битных слов (bitArray). Для взаимодействия с внешними форматами предусмотрены кодеки.

UTF-8

var bits = sjcl.codec.utf8String.toBits("text");
var text = sjcl.codec.utf8String.fromBits(bits);

Hex

var hex = sjcl.codec.hex.fromBits(bits);
var bits = sjcl.codec.hex.toBits(hex);

Base64

var b64 = sjcl.codec.base64.fromBits(bits);
var bits = sjcl.codec.base64.toBits(b64);

Эллиптическая криптография (ECC)

SJCL включает поддержку криптографии на эллиптических кривых.

Основные возможности:

  • Генерация ключевых пар
  • Шифрование (ElGamal)
  • Подписи (ECDSA)

Поддерживаемые кривые:

  • c192
  • c224
  • c256
  • c384
  • c521

Пример генерации ключа:

var keys = sjcl.ecc.elGamal.generateKeys(256);

Шифрование (ElGamal)

var ciphertext = keys.pub.encrypt("message");
var plaintext = keys.sec.decrypt(ciphertext);

Подписи (ECDSA)

var keys = sjcl.ecc.ecdsa.generateKeys(256);
var signature = keys.sec.sign(hash);
var valid = keys.pub.verify(hash, signature);

Сравнение строк (защита от тайминговых атак)

Константное сравнение

Функция безопасного сравнения предотвращает тайминговые атаки:

sjcl.bitArray.equal(a, b);

Особенности:

  • Выполняется за одинаковое время независимо от различий
  • Используется для проверки MAC и подписей

Внутренние представления

bitArray

Центральная структура данных:

  • Представляет массив 32-битных слов
  • Используется во всех криптографических операциях

Пример:

var bits = sjcl.bitArray.concat(a, b);
var slice = sjcl.bitArray.bitSlice(bits, 0, 64);

JSON-обёртка

SJCL предоставляет удобный интерфейс для сериализации криптографических операций:

var encrypted = sjcl.encrypt(password, data);
var decrypted = sjcl.decrypt(password, encrypted);

Внутренне используются:

  • AES
  • CCM
  • PBKDF2
  • случайные IV и соль

Формат JSON включает:

  • iv — вектор инициализации
  • salt — соль
  • ct — ciphertext
  • iter — итерации PBKDF2

Архитектурные особенности

  • Все алгоритмы реализованы на чистом JavaScript
  • Отсутствие зависимости от WebCrypto API
  • Модульная структура (cipher, mode, hash, misc и др.)
  • Приоритет безопасности над производительностью

Ограничения библиотеки

  • Нет поддержки современных алгоритмов (например, ChaCha20)
  • Ограниченная оптимизация по сравнению с нативными API
  • SHA-1 присутствует, но устарел
  • ECC реализована не полностью (ограниченный набор операций)

Взаимодействие примитивов

Комбинация примитивов в SJCL строится следующим образом:

  • AES + режим (CCM/GCM) → шифрование
  • SHA-256 → хэширование
  • HMAC → аутентификация
  • PBKDF2 → генерация ключей
  • ECC → асимметричные операции
  • CSPRNG → генерация случайных значений

Такая модульность позволяет гибко строить криптографические протоколы, комбинируя базовые элементы библиотеки.