Зависимость от jsbn и CryptoJS

Jsrsasign представляет собой чисто JavaScript-библиотеку для работы с криптографическими примитивами, X.509 сертификатами, JWT, JWS и JWE. Несмотря на широкий функционал, она не реализует все математические операции и алгоритмы «с нуля». Вместо этого она опирается на внешние зависимости, среди которых ключевыми являются jsbn и CryptoJS.

Такой подход позволяет разделить ответственность: низкоуровневая математика и базовые хеш-функции вынесены в отдельные библиотеки, а Jsrsasign сосредоточена на протоколах и форматах.


jsbn: большие числа и основа RSA-операций

jsbn (JavaScript Big Number) — библиотека, реализующая арифметику больших целых чисел. Она является критически важной для криптографии, поскольку стандартные типы JavaScript (Number) не способны корректно работать с числами, используемыми в RSA, DSA и других алгоритмах.

Основные задачи jsbn в экосистеме Jsrsasign

  • работа с произвольно большими целыми числами
  • реализация модульной арифметики
  • возведение в степень по модулю (modexp)
  • операции, необходимые для RSA-шифрования и подписи
  • поддержка чисел в различных представлениях (hex, base64, decimal)

Применение в криптографии

RSA-алгоритм базируется на операции:

c = m^e mod n
m = c^d mod n

где:

  • m — исходное сообщение
  • c — шифротекст
  • e, d, n — ключевые параметры RSA

Все эти операции требуют работы с числами, значительно превышающими 2^53 − 1, что делает jsbn обязательным компонентом.

Интеграция с Jsrsasign

Внутри Jsrsasign классы RSA используют объекты BigInteger из jsbn:

var rsa = new RSAKey();
rsa.setPublic(N, E);

var signature = rsa.signString("message", "sha256");

В этом процессе:

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

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

  • отсутствие зависимостей от браузерных API
  • чистая JavaScript-реализация без WebCrypto
  • совместимость с Node.js и браузером
  • оптимизация под RSA-операции, а не произвольную математику

CryptoJS: хеш-функции и симметричная криптография

CryptoJS используется как поставщик криптографических хеш-функций и алгоритмов симметричного шифрования. Jsrsasign не реализует собственные версии SHA или HMAC полностью, а делегирует их CryptoJS.

Основные функции CryptoJS в контексте Jsrsasign

  • SHA-1
  • SHA-256
  • SHA-512
  • HMAC (HMAC-SHA256, HMAC-SHA512 и др.)
  • базовые операции с бинарными данными (WordArray)

Роль хеширования в Jsrsasign

Хеш-функции используются в нескольких ключевых местах:

  • создание цифровых подписей (JWS)
  • проверка целостности данных
  • формирование отпечатков сертификатов
  • генерация ключевого материала

Пример использования SHA-256 через Jsrsasign:

var hash = KJUR.crypto.Util.sha256("message");

Внутри этого вызова фактически используется CryptoJS:

CryptoJS.SHA256("message")

Форматы данных CryptoJS

CryptoJS работает с собственной структурой WordArray, которая отличается от строк или Uint8Array:

  • WordArray — массив 32-битных слов
  • удобен для побитовых операций
  • совместим с криптографическими алгоритмами

Jsrsasign выполняет конвертацию между форматами:

  • строка → WordArray
  • WordArray → hex/base64
  • WordArray → байтовый массив

Связь jsbn и CryptoJS внутри Jsrsasign

Эти две зависимости выполняют разные роли и практически не пересекаются:

Компонент Назначение
jsbn большие числа, RSA-математика
CryptoJS хеширование, HMAC, симметричная криптография

Jsrsasign объединяет их в единую криптографическую систему:

  • CryptoJS генерирует хеш сообщения
  • jsbn выполняет математические операции с ключами
  • Jsrsasign связывает результат в форматах PKCS, JWT, X.509

Пример взаимодействия зависимостей при создании подписи JWS

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

  1. Формирование заголовка и payload
  2. Хеширование через CryptoJS
  3. Кодирование результата
  4. Применение RSA через jsbn
  5. Формирование финальной подписи

Упрощённая схема:

header + "." + payload
        ↓
   SHA-256 (CryptoJS)
        ↓
   digest
        ↓
 RSA sign (jsbn BigInteger)
        ↓
   base64url signature

Причины использования внешних зависимостей

Архитектурное разделение связано с несколькими факторами:

1. Снижение сложности ядра Jsrsasign

Реализация криптографии требует значительных математических и алгоритмических ресурсов. Вынос позволяет избежать дублирования.

2. Повышение совместимости

  • jsbn работает в любом JavaScript-окружении
  • CryptoJS поддерживает браузеры без WebCrypto

3. Независимость от нативных API

Jsrsasign может функционировать даже там, где отсутствует:

  • window.crypto
  • SubtleCrypto
  • Node.js crypto module

4. Модульность

Каждая зависимость решает строго ограниченную задачу, что упрощает сопровождение.


Ограничения и особенности интеграции

Использование jsbn и CryptoJS накладывает ряд технических особенностей:

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

  • jsbn медленнее нативных BigInt
  • CryptoJS уступает WebCrypto API

Размер библиотек

  • добавление обеих зависимостей увеличивает общий bundle
  • особенно заметно в браузерных сборках

Отсутствие аппаратного ускорения

  • нет использования AES-NI или аналогичных инструкций
  • нет прямого доступа к secure enclave

Преобразование данных между библиотеками

Одной из сложностей является работа с различными форматами данных:

jsbn

  • BigInteger
  • hex строки
  • base64 представления ключей

CryptoJS

  • WordArray
  • UTF-8 строки
  • base64

Jsrsasign

  • выполняет мост между форматами:
KJUR.crypto.Util.str2hex("abc");
KJUR.crypto.Util.hex2b64("616263");

Использование в RSA-ключах

RSA ключи в Jsrsasign тесно связаны с jsbn:

var key = KEYUTIL.generateKeypair("RSA", 2048);

Внутри:

  • модуль n представлен как BigInteger
  • экспоненты e и d также BigInteger
  • операции выполняются через jsbn методы

Итоговая архитектурная модель зависимостей

Jsrsasign можно представить как слой над криптографическим фундаментом:

  • jsbn → математическая база RSA/DSA
  • CryptoJS → хеши и симметричная криптография
  • Jsrsasign → протоколы (JWT, JWS, X.509, PKCS)

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