Таблица поддерживаемых кривых

В библиотеке Jsrsasign работа с асимметричной криптографией на эллиптических кривых опирается на набор стандартизированных параметров, определяющих форму кривой, размер поля, базовую точку и идентификатор OID. Эти параметры используются при генерации ключей, формировании подписи ECDSA и проверке подписей в различных криптографических протоколах (JWT, X.509, TLS-совместимые сценарии).

Каждая эллиптическая кривая в контексте Jsrsasign описывается набором характеристик:

  • Имя кривой (curve name) — строковый идентификатор
  • OID — объектный идентификатор в ASN.1
  • Размер ключа — в битах
  • Тип поля — обычно prime field (Fp)
  • Параметры кривой — коэффициенты a и b
  • Базовая точка G
  • Порядок группы n
  • Хэш-алгоритм по умолчанию (в некоторых сценариях)

В Jsrsasign эти параметры инкапсулированы внутри модулей KJUR.crypto, KEYUTIL и KJUR.asn1.x509.

Основные поддерживаемые кривые

NIST P-256 (secp256r1 / prime256v1)

Параметр Значение
Имя secp256r1 / prime256v1
OID 1.2.840.10045.3.1.7
Размер ключа 256 бит
Тип Weierstrass (Fp)
Уровень безопасности ~128 бит

Наиболее широко используемая кривая в TLS, JWT ES256, Apple и Google экосистемах.

Пример использования:

const ec = new KJUR.crypto.ECDSA({ curve: "secp256r1" });
const keypair = ec.generateKeyPairHex();

NIST P-384 (secp384r1)

Параметр Значение
Имя secp384r1
OID 1.3.132.0.34
Размер ключа 384 бит
Тип Weierstrass (Fp)
Уровень безопасности ~192 бит

Используется в высокозащищённых системах и криптографических протоколах уровня enterprise.

Пример:

const ec = new KJUR.crypto.ECDSA({ curve: "secp384r1" });
const kp = ec.generateKeyPairHex();

NIST P-521 (secp521r1)

Параметр Значение
Имя secp521r1
OID 1.3.132.0.35
Размер ключа 521 бит
Тип Weierstrass (Fp)
Уровень безопасности ~256 бит

Используется в системах с повышенными требованиями к стойкости, включая государственные стандарты некоторых стран.

Особенность: нестандартный размер ключа (не кратен 8 бит).


secp256k1

Параметр Значение
Имя secp256k1
OID 1.3.132.0.10
Размер ключа 256 бит
Тип Koblitz curve
Основное применение Bitcoin, Ethereum

Кривая с уникальными математическими свойствами, оптимизированная для быстрого умножения точек.

Пример:

const ec = new KJUR.crypto.ECDSA({ curve: "secp256k1" });
const keys = ec.generateKeyPairHex();

Сводная таблица поддерживаемых кривых

Кривая OID Размер Безопасность Основное применение
secp256r1 1.2.840.10045.3.1.7 256 128-bit TLS, JWT ES256
secp384r1 1.3.132.0.34 384 192-bit Enterprise PKI
secp521r1 1.3.132.0.35 521 256-bit High-security systems
secp256k1 1.3.132.0.10 256 128-bit Blockchain (BTC/ETH)

Внутреннее представление кривых в Jsrsasign

Внутри библиотеки параметры кривых хранятся в структуре, аналогичной:

KJUR.crypto.ECDSA.getInstanceByName("secp256r1")

или через фабрику ключей:

KEYUTIL.generateKeypair("EC", "secp256r1")

При этом происходит:

  • загрузка параметров кривой из внутреннего справочника
  • инициализация BigInt-арифметики
  • настройка генератора точек
  • подготовка контекста для ECDSA

Применение кривых в ECDSA подписи

Каждая кривая напрямую влияет на формат подписи:

  • размер r и s зависит от размера поля
  • хэш-функция подбирается в соответствии с уровнем безопасности
  • длина ключа определяет стойкость подписи

Пример формирования подписи:

const sig = new KJUR.crypto.Signature({ alg: "SHA256withECDSA" });
sig.init({ d: privateKeyHex, curve: "secp256r1" });
sig.updateString("data");
const signature = sig.sign();

Особенности поддержки кривых

Совместимость с JWK

Jsrsasign поддерживает экспорт/импорт ключей:

  • kty: "EC"
  • crv: "P-256" | "P-384" | "P-521" | "secp256k1"

Соответствие:

JWK crv Jsrsasign curve
P-256 secp256r1
P-384 secp384r1
P-521 secp521r1
secp256k1 secp256k1

ASN.1 представление

Каждая кривая имеет ASN.1 OID, используемый при генерации сертификатов X.509:

const cert = new X509();
cert.readCertPEM(pem);

Внутри сертификата кривая определяется через:

id-ecPublicKey + namedCurve OID

Ограничения и нюансы реализации

  • Поддержка кривых ограничена списком встроенных параметров
  • Добавление пользовательских кривых требует модификации KJUR.crypto.ECDSA
  • Производительность зависит от реализации BigInt-операций в JS
  • secp256k1 реализована отдельно от NIST-кривых и имеет отличия в алгоритмах оптимизации

Использование в JWT (ES256, ES384, ES512)

Кривые напрямую связаны с алгоритмами подписи:

Алгоритм Кривая
ES256 secp256r1
ES384 secp384r1
ES512 secp521r1

Пример:

const sHeader = { alg: "ES256" };
const sPayload = { sub: "1234567890" };

const token = KJUR.jws.JWS.sign(
  "ES256",
  sHeader,
  sPayload,
  privateKey
);

Криптографическая значимость выбора кривой

Выбор кривой определяет:

  • устойчивость к атакам на дискретный логарифм
  • размер подписи
  • скорость генерации и проверки
  • совместимость с внешними системами

secp256r1 остаётся балансом между производительностью и безопасностью, secp521r1 — максимальная стойкость в рамках ECDSA, secp256k1 — специализированный вариант для блокчейн-систем.