Библиотека Jsrsasign предоставляет набор инструментов для работы с
криптографией в JavaScript, включая создание, обработку и преобразование
ключей различных алгоритмов. Одним из ключевых механизмов является
генерация асимметрических ключевых пар RSA с использованием
KEYUTIL.generateKeypair.
RSA-ключевая пара состоит из двух компонентов: публичного и приватного ключа. Публичный используется для шифрования и проверки подписи, приватный — для расшифровки и создания цифровой подписи. Генерация таких ключей требует выбора параметров криптографической стойкости и корректного формата представления результата.
KEYUTIL.generateKeypairМетод генерации ключевой пары имеет следующий вид:
KEYUTIL.generateKeypair(alg, keylen, options)
"RSA"Выбор длины ключа напрямую влияет на уровень безопасности:
На практике чаще всего используется 2048 или 3072 бит, поскольку они обеспечивают баланс между производительностью и стойкостью.
Простейший пример создания ключевой пары:
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;
В результате возвращается объект с двумя свойствами:
prvKeyObj — объект приватного ключаpubKeyObj — объект публичного ключаПосле генерации ключи часто необходимо сериализовать в стандартный формат 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
}
});
Публичная экспонента 65537 считается стандартом де-факто из-за оптимального баланса безопасности и производительности.
Генерация RSA-ключа включает несколько криптографически сложных этапов:
Генерация двух больших простых чисел p и
q
Вычисление модуля:
n = p * qВычисление функции Эйлера:
φ(n) = (p - 1)(q - 1)Выбор публичной экспоненты e
Вычисление приватной экспоненты 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 поддерживает несколько стандартов сериализации:
При генерации RSA через generateKeypair ключи могут быть
преобразованы в любой из этих форматов через
KEYUTIL.getPEM.
Генерация RSA-ключей является ресурсоёмкой операцией, особенно при длине 4096 бит. Основные факторы влияния:
При генерации ключей в браузере операция может занимать от нескольких сотен миллисекунд до нескольких секунд.
Jsrsasign работает без необходимости серверной части, что позволяет генерировать ключи прямо в клиентском приложении.
<script src="jsrsasign-all-min.js"></script>
<script>
const kp = KEYUTIL.generateKeypair("RSA", 2048);
console.log(KEYUTIL.getPEM(kp.prvKeyObj));
</script>
В Node.js библиотека подключается стандартным образом:
const { KEYUTIL } = require("jsrsasign");
const kp = KEYUTIL.generateKeypair("RSA", 2048);
В некоторых случаях Node.js предоставляет более быстрый источник случайности, что ускоряет генерацию ключей.
При работе с RSA-ключами важно учитывать следующие моменты:
Часто встречающиеся проблемы:
"RSA"После создания ключей часто требуется их трансформация в другие форматы.
const keyObj = kp.pubKeyObj;
const pem = KEYUTIL.getPEM(keyObj);
Дальнейшая конвертация в JWK обычно выполняется внешними инструментами, но Jsrsasign может использоваться как промежуточный слой.
RSA-ключи, созданные через generateKeypair, используются
в:
KEYUTIL.generateKeypair тесно взаимодействует с:
KEYUTIL.getKey — загрузка ключей из PEMKEYUTIL.getPEM — сериализация ключейKJUR.crypto — криптографические операцииRSAKey — внутреннее представление RSAЭти компоненты образуют единую систему управления ключами внутри библиотеки.