Генерация RSA-ключей с помощью KEYUTIL.generateKeypair

Библиотека Jsrsasign предоставляет набор инструментов для работы с криптографией в JavaScript, включая создание, обработку и преобразование ключей различных алгоритмов. Одним из ключевых механизмов является генерация асимметрических ключевых пар RSA с использованием KEYUTIL.generateKeypair.

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


Общая сигнатура KEYUTIL.generateKeypair

Метод генерации ключевой пары имеет следующий вид:

KEYUTIL.generateKeypair(alg, keylen, options)

Параметры:

  • alg — алгоритм генерации ключей. Для RSA используется строка "RSA"
  • keylen — длина ключа в битах (например, 1024, 2048, 3072, 4096)
  • options — дополнительный объект настроек (необязательный)

Поддерживаемые длины RSA-ключей

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

  • 1024 бит — устаревший уровень, не рекомендуется для современных систем
  • 2048 бит — минимально допустимый безопасный стандарт
  • 3072 бит — повышенная криптостойкость
  • 4096 бит — максимальная безопасность с увеличенной вычислительной нагрузкой

На практике чаще всего используется 2048 или 3072 бит, поскольку они обеспечивают баланс между производительностью и стойкостью.


Базовая генерация RSA-ключей

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

const kp = KEYUTIL.generateKeypair("RSA", 2048);

const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;

В результате возвращается объект с двумя свойствами:

  • prvKeyObj — объект приватного ключа
  • pubKeyObj — объект публичного ключа

Экспорт ключей в PEM-формат

После генерации ключи часто необходимо сериализовать в стандартный формат PEM для хранения или передачи.

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

const pemPrivate = KEYUTIL.getPEM(privateKey, "PKCS8PRV");

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

const pemPublic = KEYUTIL.getPEM(publicKey);

PEM-формат представляет собой Base64-кодированный DER-структурированный ключ, обрамлённый заголовками:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

Генерация ключей с дополнительными параметрами

Хотя базовая генерация не требует настроек, объект options позволяет уточнять поведение алгоритма.

Пример с указанием источника случайности:

const kp = KEYUTIL.generateKeypair("RSA", 2048, {
    rsaKeyGen: {
        publicExponent: 0x10001
    }
});

Параметры rsaKeyGen:

  • publicExponent — публичная экспонента RSA (обычно 65537 / 0x10001)
  • prng — пользовательский генератор случайных чисел (редко используется)

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


Внутренний процесс генерации RSA

Генерация RSA-ключа включает несколько криптографически сложных этапов:

  1. Генерация двух больших простых чисел p и q

  2. Вычисление модуля:

    n = p * q
  3. Вычисление функции Эйлера:

    φ(n) = (p - 1)(q - 1)
  4. Выбор публичной экспоненты e

  5. Вычисление приватной экспоненты d, удовлетворяющей:

    d ≡ e⁻¹ mod φ(n)

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


Работа с объектами ключей

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

Пример шифрования:

const cipher = KEYUTIL.getKey(pemPublic);
const encrypted = cipher.encrypt("secret message");

Пример подписи:

const signer = KEYUTIL.getKey(pemPrivate);
const signature = signer.signString("message", "sha256");

Форматы представления ключей

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

  • PKCS#1 — классический RSA формат
  • PKCS#8 — универсальный контейнер приватных ключей
  • SPKI — формат публичных ключей
  • PEM — текстовое Base64 представление

При генерации RSA через generateKeypair ключи могут быть преобразованы в любой из этих форматов через KEYUTIL.getPEM.


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

Генерация RSA-ключей является ресурсоёмкой операцией, особенно при длине 4096 бит. Основные факторы влияния:

  • скорость JavaScript-движка
  • наличие WebCrypto (в некоторых окружениях Jsrsasign может использовать его)
  • размер ключа
  • качество источника случайных чисел

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


Использование в браузере

Jsrsasign работает без необходимости серверной части, что позволяет генерировать ключи прямо в клиентском приложении.

<script src="jsrsasign-all-min.js"></script>
<script>
const kp = KEYUTIL.generateKeypair("RSA", 2048);
console.log(KEYUTIL.getPEM(kp.prvKeyObj));
</script>

Использование в Node.js

В Node.js библиотека подключается стандартным образом:

const { KEYUTIL } = require("jsrsasign");

const kp = KEYUTIL.generateKeypair("RSA", 2048);

В некоторых случаях Node.js предоставляет более быстрый источник случайности, что ускоряет генерацию ключей.


Практические аспекты безопасности

При работе с RSA-ключами важно учитывать следующие моменты:

  • приватный ключ не должен покидать доверенную среду
  • генерация ключей должна происходить с криптографически стойким RNG
  • ключи длиной менее 2048 бит считаются небезопасными
  • повторное использование ключей между проектами снижает уровень защиты

Типовые ошибки при генерации

Часто встречающиеся проблемы:

  • указание неподдерживаемого алгоритма вместо "RSA"
  • попытка использовать слишком малую длину ключа
  • неправильная сериализация ключа (например, путаница PKCS#1 и PKCS#8)
  • хранение приватного ключа в открытом виде без шифрования

Преобразование ключей после генерации

После создания ключей часто требуется их трансформация в другие форматы.

Пример получения JWK-подобной структуры:

const keyObj = kp.pubKeyObj;
const pem = KEYUTIL.getPEM(keyObj);

Дальнейшая конвертация в JWK обычно выполняется внешними инструментами, но Jsrsasign может использоваться как промежуточный слой.


Применение в криптографических протоколах

RSA-ключи, созданные через generateKeypair, используются в:

  • TLS/SSL (сертификаты X.509)
  • JWT подписи (RS256, RS384, RS512)
  • PGP-подобных схемах
  • пользовательских схемах шифрования данных
  • цифровых подписях документов

Связь с другими модулями Jsrsasign

KEYUTIL.generateKeypair тесно взаимодействует с:

  • KEYUTIL.getKey — загрузка ключей из PEM
  • KEYUTIL.getPEM — сериализация ключей
  • KJUR.crypto — криптографические операции
  • RSAKey — внутреннее представление RSA

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