Библиотека jsrsasign предоставляет инструменты для работы с криптографией, включая генерацию ключевых пар на эллиптических кривых (EC). Эллиптические кривые широко применяются благодаря высокой криптостойкости при относительно малом размере ключей.
В основе лежит математическая модель эллиптическая кривая, определяемая уравнением вида:
[ y^2 = x^3 + ax + b]
Каждая конкретная кривая задаётся параметрами (a, b, p, G, n, h), где:
В jsrsasign используются стандартные кривые, такие как:
Генерация ключевой пары осуществляется через API библиотеки. Основной
механизм — функция KEYUTIL.generateKeypair.
Пример генерации ключей на кривой secp256r1:
var kp = KEYUTIL.generateKeypair("EC", "secp256r1");
var privateKey = kp.prvKeyObj;
var publicKey = kp.pubKeyObj;
Результат:
prvKeyObj — объект приватного ключаpubKeyObj — объект публичного ключаВыбор кривой влияет на:
Наиболее часто используются:
| Кривая | Битовая длина | Уровень безопасности |
|---|---|---|
| secp256r1 | 256 | ~128 бит |
| secp384r1 | 384 | ~192 бит |
| secp521r1 | 521 | ~256 бит |
Пример генерации на более сильной кривой:
var kp = KEYUTIL.generateKeypair("EC", "secp384r1");
Приватный ключ EC представляет собой случайное число:
[ d ]
Публичный ключ вычисляется как:
[ Q = d G]
Q = d G
Где:
После генерации ключи можно экспортировать в различные форматы.
var prvPEM = KEYUTIL.getPEM(privateKey, "PKCS8PRV");
var pubPEM = KEYUTIL.getPEM(publicKey);
Хотя обычно используется стандартное имя кривой, возможно указание параметров более явно:
var ec = new KJUR.crypto.ECDSA({curve: "secp256r1"});
var keypair = ec.generateKeyPairHex();
var prvHex = keypair.ecprvhex;
var pubHex = keypair.ecpubhex;
Здесь:
ecprvhex — приватный ключ в hexecpubhex — публичный ключ в hexПубличный ключ должен лежать на выбранной кривой. Библиотека автоматически проверяет корректность при создании, но при работе с внешними ключами проверка важна:
var ec = new KJUR.crypto.ECDSA({curve: "secp256r1"});
ec.setPublicKeyHex(pubHex);
var isValid = ec.verifyPublicKey(pubHex);
Качество генерации зависит от источника случайных чисел. В jsrsasign используется криптографически стойкий генератор случайных чисел.
Приватный ключ:
[ d = (1, n-1)]
d
Если генератор случайных чисел небезопасен, вся криптосистема становится уязвимой.
При выборе кривой учитываются:
Совместимость:
Производительность:
Безопасность:
Сгенерированные ключи применяются для:
Пример подготовки ключа к подписи:
var sig = new KJUR.crypto.Signature({"alg": "SHA256withECDSA"});
sig.init(privateKey);
Типичные проблемы:
Неверное имя кривой
KEYUTIL.generateKeypair("EC", "wrongCurve"); // ошибка
Использование устаревших кривых
Недостаточная энтропия
Можно работать напрямую с объектами ECDSA:
var ec = new KJUR.crypto.ECDSA({
curve: "secp521r1",
prov: "cryptojs/jsrsa"
});
EC-ключи в jsrsasign соответствуют стандартам:
Это обеспечивает совместимость с:
При необходимости можно генерировать несколько ключей:
for (var i = 0; i < 10; i++) {
var kp = KEYUTIL.generateKeypair("EC", "secp256r1");
console.log(kp.prvKeyObj);
}
После генерации важно:
Пример шифрования PEM:
var encPEM = KEYUTIL.getPEM(privateKey, "PKCS8PRV", "password");
Скорость генерации зависит от:
Примерные характеристики:
Работа с hex удобна для низкоуровневых операций:
console.log("Private:", prvHex);
console.log("Public:", pubHex);
Публичный ключ обычно кодируется как:
[ 04 || X || Y]
где 04 — признак не сжатого ключа.
EC-публичные ключи бывают:
В jsrsasign по умолчанию используется несжатый формат.
Каждая кривая строго задаёт длину ключа:
Попытка использовать ключ другой длины приведёт к ошибке или некорректной работе.
Такая схема лежит в основе всех операций генерации EC-ключей в jsrsasign.