Класс RSAKey

Класс RSAKey в библиотеке Jsrsasign представляет собой низкоуровневую реализацию алгоритма RSA и используется для выполнения криптографических операций: шифрования, расшифрования, создания и проверки цифровой подписи, а также работы с ключевыми парами в формате PEM и внутренних представлениях RSA-структур.


RSAKey — это объект, инкапсулирующий математическую модель RSA-ключа, основанную на параметрах:

  • модуль n
  • открытая экспонента e
  • закрытая экспонента d
  • простые числа p и q
  • дополнительные коэффициенты для оптимизации (CRT-параметры)

Класс работает поверх библиотеки больших чисел, обеспечивая операции с числами произвольной длины. Это критически важно, поскольку RSA требует работы с числами, значительно превышающими стандартные числовые типы JavaScript.


Создание экземпляра RSAKey

Экземпляр RSAKey создаётся без обязательных параметров:

var rsa = new RSAKey();

На этом этапе объект пуст и не содержит ключевых параметров. Дальнейшая работа возможна только после загрузки или генерации ключей.


Загрузка ключей из PEM-формата

Одной из ключевых функций RSAKey является импорт ключей из PEM-строк.

Приватный ключ

rsa.readPrivateKeyFromPEM(pemString);

Метод парсит структуру PKCS#1 или PKCS#8 и заполняет внутренние поля объекта.

Публичный ключ

rsa.readPublicKeyFromPEM(pemString);

Используется для операций шифрования и проверки подписи. В отличие от приватного ключа, содержит только n и e.


Генерация ключевой пары

RSAKey поддерживает генерацию ключей напрямую в браузере или Node.js окружении.

rsa.generate(bits, "10001");

Параметры:

  • bits — длина ключа (обычно 1024, 2048, 4096)
  • "10001" — стандартная публичная экспонента (65537 в hex)

Генерация является ресурсоёмкой операцией, так как включает поиск простых чисел большой разрядности.


Шифрование данных

RSAKey реализует асимметричное шифрование с использованием публичного ключа.

var encrypted = rsa.encrypt(plainText);

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

  • применяется PKCS#1 v1.5 padding
  • результат возвращается в виде hex-строки
  • данные ограничены по размеру (зависит от длины ключа и паддинга)

Шифрование используется исключительно с публичным ключом.


Расшифрование данных

Для расшифрования требуется приватный ключ:

var decrypted = rsa.decrypt(cipherText);

Процесс включает:

  • восстановление исходного блока
  • удаление padding
  • преобразование результата в строку

Если ключ неполный или повреждён, операция завершится ошибкой или вернёт пустой результат.


Цифровая подпись

RSAKey поддерживает создание цифровых подписей на основе хэш-значений.

Подпись

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

Процесс включает:

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

Проверка подписи

var isValid = rsa.verifyString(message, signature);

Проверка выполняется через публичный ключ. Если сообщение изменено хотя бы на один символ, подпись становится недействительной.


Работа с BigInteger

Внутренне RSAKey оперирует объектами BigInteger. Это обеспечивает:

  • поддержку чисел произвольной длины
  • точные модульные операции
  • корректную реализацию RSA-математики

Основные операции включают:

  • возведение в степень по модулю
  • вычисление обратных элементов
  • китайскую теорему об остатках (CRT)

CRT-оптимизация

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

  • dP = d mod (p-1)
  • dQ = d mod (q-1)
  • qInv = q^{-1} mod p

Эти значения позволяют ускорить расшифрование и подпись примерно в 3–4 раза по сравнению с прямым вычислением.


Форматы ключей и совместимость

RSAKey поддерживает несколько стандартов:

  • PKCS#1 (RSA Private/Public Key)
  • PKCS#8 (структурированный приватный ключ)
  • X.509 SubjectPublicKeyInfo

При импорте библиотека автоматически определяет формат PEM и выбирает корректный парсер.


Ограничения размера данных

RSA не предназначен для шифрования больших объёмов информации. Максимальный размер входных данных зависит от длины ключа:

  • 1024-bit ключ — около 117 байт
  • 2048-bit ключ — около 245 байт
  • 4096-bit ключ — около 501 байта

Это связано с необходимостью резервирования места под padding.


Типовые ошибки при работе

Отсутствие приватного ключа

Операции decrypt и sign невозможны без заполненного приватного ключа. Попытка их выполнения приводит к ошибке или пустому результату.

Неверный формат PEM

Если строка ключа повреждена или не соответствует стандарту, методы readPrivateKeyFromPEM и readPublicKeyFromPEM не смогут корректно распарсить данные.

Превышение размера блока

Попытка зашифровать слишком длинную строку приводит к ошибке или некорректному результату шифрования.


Взаимодействие с другими компонентами Jsrsasign

RSAKey часто используется совместно с:

  • KEYUTIL — для универсального импорта и экспорта ключей
  • KJUR.crypto.MessageDigest — для вычисления хэшей
  • KJUR.crypto.Signature — для высокоуровневых операций подписи

RSAKey при этом остаётся низкоуровневым инструментом, предоставляющим прямой доступ к математике RSA без дополнительной абстракции.


Представление ключевых параметров

Внутренние поля RSAKey включают:

  • n — модуль
  • e — публичная экспонента
  • d — приватная экспонента
  • p, q — простые множители
  • isPrivate — флаг наличия приватного ключа

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


Принцип выполнения операций

Любая операция RSAKey проходит несколько стадий:

  1. Преобразование строки в байтовый массив
  2. Применение padding (при необходимости)
  3. Математическая операция модульного возведения в степень
  4. Преобразование результата обратно в строку или hex

Эта последовательность одинакова для шифрования, расшифрования и подписи, различаясь только типом используемой экспоненты (e или d).