Алгоритмы на основе эллиптических кривых (Elliptic Curve Cryptography, ECC) опираются на математические свойства точек на кривой вида:
y^2 = x^3 + ax + b
Безопасность схем строится на сложности задачи дискретного логарифмирования в группе точек кривой. В отличие от RSA, где ключи оперируют с большими числами, ECC обеспечивает сопоставимую криптостойкость при существенно меньших размерах ключей.
EC-ключ в контексте JavaScript-библиотеки Jsrsasign представляет собой пару:
где G — базовая точка генератора.
Публичный ключ кодируется как координаты точки (x, y), а приватный — как число фиксированной длины.
В Jsrsasign используются стандартные именованные кривые, например:
Кривая определяет:
На практике чаще всего используется secp256r1 как баланс
между безопасностью и производительностью.
Основной механизм генерации ключевых пар в Jsrsasign реализован через
KEYUTIL.generateKeypair.
Базовый сценарий генерации EC-ключа:
const kp = KEYUTIL.generateKeypair("EC", "secp256r1");
const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;
Результатом является объект с двумя криптографическими сущностями:
prvKeyObj — приватный ключpubKeyObj — публичный ключКаждый из них может быть экспортирован в различные форматы.
Для взаимодействия с внешними системами ключи обычно сериализуются в PEM.
Приватный ключ:
const prvPEM = KEYUTIL.getPEM(privateKey, "PKCS8PRV");
Публичный ключ:
const pubPEM = KEYUTIL.getPEM(publicKey);
PEM-структура представляет собой Base64-кодированный DER-блок с заголовками:
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
и
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
Внутри библиотеки EC-ключи представлены через объекты:
KJUR.crypto.ECDSAKEYUTILГенерация включает несколько этапов:
С точки зрения реализации:
const ec = new KJUR.crypto.ECDSA({ curve: "secp256r1" });
Однако прямое использование ECDSA для генерации ключей встречается реже, чем KEYUTIL.
Ключевой элемент генерации — источник энтропии. Jsrsasign опирается на:
window.crypto в браузереcrypto модуль в Node.jsЕсли доступ к CSPRNG отсутствует, генерация становится небезопасной или невозможной.
После генерации доступны свойства ключей.
Приватный ключ:
console.log(privateKey.d.toString(16));
Публичный ключ:
console.log(publicKey.getX().toString(16));
console.log(publicKey.getY().toString(16));
Координаты X и Y представляют точку на эллиптической кривой.
Jsrsasign поддерживает несколько форматов:
Пример экспорта в PKCS#8:
const pkcs8 = KEYUTIL.getPEM(privateKey, "PKCS8PRV");
Совместимость обеспечивается с:
EC-ключи чаще всего применяются для цифровой подписи.
Создание подписей:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withECDSA" });
sig.init(privateKey);
sig.updateString("message");
const signature = sig.sign();
Проверка:
const ver = new KJUR.crypto.Signature({ alg: "SHA256withECDSA" });
ver.init(publicKey);
ver.updateString("message");
const isValid = ver.verify(signature);
Ключевая особенность ECC — компактность подписи при высокой стойкости.
Использование несуществующего OID приводит к ошибке генерации:
Unsupported EC curve
При отсутствии криптографического источника случайности:
No secure random available
Попытка сериализации ключа без указания формата приводит к некорректному PEM.
Генерация EC-ключей значительно быстрее RSA благодаря:
На практике ключ EC-256 генерируется практически мгновенно даже в ограниченных средах исполнения JavaScript.
EC-ключи Jsrsasign часто используются в сценариях:
При интеграции важно учитывать соответствие кривой и алгоритма подписи:
Несовпадение параметров делает подпись недействительной.
Хотя Jsrsasign генерирует ключи автоматически, структура EC-ключа концептуально сводится к:
Q = dG
где:
Эта формула лежит в основе всей EC-криптографии и напрямую отражается в работе Jsrsasign.