Библиотека Jsrsasign предоставляет поддержку криптографии на эллиптических кривых (ECC), включая набор стандартных кривых, используемых в современных протоколах цифровой подписи, TLS и JWT. Наиболее распространённые из них — secp256r1, secp384r1, secp521r1, входящие в семейство кривых NIST (также известны как P-256, P-384 и P-521).
Эти кривые реализованы в соответствии со стандартами ECDSA (Elliptic Curve Digital Signature Algorithm) и используются для создания ключевых пар, подписи сообщений и проверки подписи.
В основе ECC в Jsrsasign лежит работа с точками на эллиптической кривой, где безопасность определяется сложностью задачи дискретного логарифмирования.
Основные сущности:
В Jsrsasign работа с ECC осуществляется через:
KEYUTIL — генерация и импорт ключейKJUR.crypto.ECDSA — операции подписи и проверкиKJUR.crypto.ECDSA.generateKeyPair (в зависимости от
версии)Кривая задаётся уравнением:
y^2 = x^3 - 3x + b
где коэффициенты стандартизированы для P-256.
Генерация ключевой пары:
const kp = KEYUTIL.generateKeypair("EC", "secp256r1");
Извлечение ключей:
const prv = kp.prvKeyObj;
const pub = kp.pubKeyObj;
Подпись данных:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withECDSA" });
sig.init(prv);
sig.updateString("data");
const signature = sig.sign();
Проверка подписи:
const sig2 = new KJUR.crypto.Signature({ alg: "SHA256withECDSA" });
sig2.init(pub);
sig2.updateString("data");
const isValid = sig2.verify(signature);
y^2 = x^3 - 3x + b
Параметры кривой увеличены, что значительно усложняет криптоанализ.
Генерация ключей:
const kp = KEYUTIL.generateKeypair("EC", "secp384r1");
ECDSA подпись:
const sig = new KJUR.crypto.Signature({ alg: "SHA384withECDSA" });
sig.init(kp.prvKeyObj);
sig.updateString("secure data");
const sigValue = sig.sign();
Проверка:
const verifier = new KJUR.crypto.Signature({ alg: "SHA384withECDSA" });
verifier.init(kp.pubKeyObj);
verifier.updateString("secure data");
const ok = verifier.verify(sigValue);
y^2 = x^3 - 3x + b
Особенность P-521 заключается в нецелочисленном размере поля (521 бит), что требует специфической обработки в реализации.
Генерация ключей:
const kp = KEYUTIL.generateKeypair("EC", "secp521r1");
Подпись:
const sig = new KJUR.crypto.Signature({ alg: "SHA512withECDSA" });
sig.init(kp.prvKeyObj);
sig.updateString("very sensitive data");
const signature = sig.sign();
Проверка подписи:
const verifier = new KJUR.crypto.Signature({ alg: "SHA512withECDSA" });
verifier.init(kp.pubKeyObj);
verifier.updateString("very sensitive data");
const valid = verifier.verify(signature);
Связка алгоритмов подписи:
Эта связка обусловлена соответствием длины хэша уровню безопасности кривой.
Jsrsasign использует объектную модель, в которой ключи ECC представлены через ASN.1 структуры.
Пример внутреннего представления публичного ключа:
{
type: "EC",
curve: "secp256r1",
x: "...",
y: "..."
}
Приватный ключ:
{
type: "EC",
curve: "secp256r1",
d: "private scalar"
}
Процесс ECDSA в Jsrsasign включает:
Для всех трёх кривых структура подписи идентична, различие заключается в размере чисел и криптостойкости.
ECC-кривые используются в JSON Web Signature:
Пример создания JWS:
const sHeader = { alg: "ES256" };
const sPayload = { data: "value" };
const sJWS = KJUR.jws.JWS.sign(
"ES256",
sHeader,
sPayload,
kp.prvKeyObj
);