В формате JWK (JSON Web Key) EC-ключи описываются как набор параметров, отражающих математическую природу эллиптической криптографии. Для кривых типа EC (Elliptic Curve) ключ состоит из имени кривой, координат точки открытого ключа и, при наличии, приватного скалярного значения.
crv определяет используемую эллиптическую кривую. Это строковый идентификатор, который задаёт параметры математического пространства, в котором выполняются операции над ключами. На практике в Web Crypto и JWK чаще всего встречаются:
P-256 (secp256r1)P-384P-521Каждая из этих кривых задаёт фиксированную группу параметров: модуль
поля, коэффициенты уравнения кривой и порядок базовой точки. В контексте
Jsrsasign значение crv критично для корректной
интерпретации координат x и y.
Параметры x и y представляют координаты точки на эллиптической кривой, которая является открытым ключом.
Эллиптическая кривая задаётся уравнением вида:
y^2 = x^3 + ax + b
Точка публичного ключа — это решение этого уравнения в конечном поле,
заданном кривой crv.
В JWK значения x и y не являются числами в
привычном виде. Это:
Для кривой P-256 длина каждой координаты составляет 32 байта (256 бит), для P-384 — 48 байт, для P-521 — 66 байт (с особенностью округления до байтов).
Пример структуры:
{
"kty": "EC",
"crv": "P-256",
"x": "....base64url....",
"y": "....base64url...."
}
Они вместе образуют точку Q = (x, y), которая
вычисляется из приватного ключа d через умножение базовой
точки кривой:
Q = d G
где:
d — приватный ключ (скаляр)G — базовая точка кривойQ — публичный ключПоле d присутствует только в приватном JWK. Оно представляет собой скалярное значение, которое используется для генерации публичного ключа.
Особенности d:
[1, n-1], где
n — порядок базовой точкиВ JWK структура приватного EC-ключа выглядит так:
{
"kty": "EC",
"crv": "P-256",
"x": "...",
"y": "...",
"d": "..."
}
Публичные координаты получаются детерминированно:
Q = d G
Это означает, что зная d, можно вычислить x
и y, но обратная операция вычислительно невозможна при
корректных параметрах кривой.
Библиотека Jsrsasign предоставляет инструменты для работы с EC JWK
через KEYUTIL и криптографические классы.
В Jsrsasign ключ можно создать и получить в формате JWK:
const kp = KEYUTIL.generateKeypair("EC", "P-256");
const pubJwk = KEYUTIL.getJWKFromKey(kp.pubKeyObj);
const privJwk = KEYUTIL.getJWKFromKey(kp.prvKeyObj);
В результате:
pubJwk содержит crv, x,
yprivJwk дополнительно содержит dJsrsasign позволяет импортировать JWK обратно в объект ключа:
const keyObj = KEYUTIL.getKey(jwk);
При этом библиотека:
x и y кривой
crvЕсли x и y не лежат на кривой, ключ
считается некорректным.
Все значения x, y, d в JWK
используют модифицированный Base64:
+ заменяется на -/ заменяется на _= удаляетсяЭто важно, поскольку JWK должен быть URL-safe и JSON-safe одновременно.
При работе с EC JWK важно учитывать несколько уровней корректности:
x, y кривой
crv(x, y) эллиптической кривойd (если присутствует)d · GJsrsasign выполняет часть этих проверок автоматически при создании
KeyObject.
EC JWK в Jsrsasign применяется в:
Пример подписи:
const sig = new KJUR.crypto.Signature({ "alg": "SHA256withECDSA" });
sig.init(privKeyObj);
sig.updateString("data");
const signature = sig.sign();
Публичный ключ с x и y используется для
проверки:
const ver = new KJUR.crypto.Signature({ "alg": "SHA256withECDSA" });
ver.init(pubKeyObj);
ver.updateString("data");
const isValid = ver.verify(signature);
Каждая кривая задаёт разные параметры безопасности и размер ключей:
Изменение crv напрямую влияет на:
x, y, dЧасто встречаются следующие проблемы:
x и y выбранной
кривойcrvd как публичный параметрEC JWK можно рассматривать как строгую связку трёх уровней:
crv — определение математической системыx, y — публичное представление точкиd — приватный генератор этой точкиЭта модель делает EC-ключи компактными, но требует строгой дисциплины при кодировании и декодировании данных, особенно в Jsrsasign, где низкоуровневые ошибки часто проявляются только на этапе криптографических операций.