Поддерживаемые кривые: secp256r1, secp384r1, secp521r1

Библиотека Jsrsasign предоставляет поддержку криптографии на эллиптических кривых (ECC), включая набор стандартных кривых, используемых в современных протоколах цифровой подписи, TLS и JWT. Наиболее распространённые из них — secp256r1, secp384r1, secp521r1, входящие в семейство кривых NIST (также известны как P-256, P-384 и P-521).

Эти кривые реализованы в соответствии со стандартами ECDSA (Elliptic Curve Digital Signature Algorithm) и используются для создания ключевых пар, подписи сообщений и проверки подписи.


Общая модель ECC в Jsrsasign

В основе ECC в Jsrsasign лежит работа с точками на эллиптической кривой, где безопасность определяется сложностью задачи дискретного логарифмирования.

Основные сущности:

  • Приватный ключ (d) — случайное число
  • Публичный ключ (Q) — точка на кривой, вычисляемая как Q = d × G
  • Базовая точка (G) — фиксированная точка генератора
  • Порядок кривой (n) — определяет размер ключевого пространства

В Jsrsasign работа с ECC осуществляется через:

  • KEYUTIL — генерация и импорт ключей
  • KJUR.crypto.ECDSA — операции подписи и проверки
  • KJUR.crypto.ECDSA.generateKeyPair (в зависимости от версии)

secp256r1 (P-256)

Характеристики

  • Размер ключа: 256 бит
  • Уровень безопасности: ~128 бит
  • Наиболее распространённая кривая в веб-экосистеме
  • Используется в TLS 1.2/1.3, JWT ES256

Кривая задаётся уравнением:

y^2 = x^3 - 3x + b

где коэффициенты стандартизированы для P-256.


Использование в Jsrsasign

Генерация ключевой пары:

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);

Особенности secp256r1

  • Оптимальный баланс между скоростью и безопасностью
  • Поддерживается аппаратными модулями (HSM, TPM)
  • Широко используется в браузерах и мобильных устройствах
  • Минимальные требования к вычислительным ресурсам

secp384r1 (P-384)

Характеристики

  • Размер ключа: 384 бит
  • Уровень безопасности: ~192 бит
  • Более высокий уровень защиты по сравнению с P-256
  • Используется в высокозащищённых системах (госструктуры, финансовые сервисы)

Математическая форма

y^2 = x^3 - 3x + b

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


Использование в Jsrsasign

Генерация ключей:

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);

Особенности secp384r1

  • Существенно более высокая криптостойкость
  • Более медленные операции по сравнению с P-256
  • Рекомендуется для долгоживущих сертификатов
  • Используется в TLS с высокими требованиями к безопасности

secp521r1 (P-521)

Характеристики

  • Размер ключа: 521 бит
  • Уровень безопасности: ~256 бит
  • Максимальная стойкость среди NIST-кривых
  • Используется в системах с повышенными требованиями к долговременной защите

Математическая форма

y^2 = x^3 - 3x + b

Особенность P-521 заключается в нецелочисленном размере поля (521 бит), что требует специфической обработки в реализации.


Использование в Jsrsasign

Генерация ключей:

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);

Особенности secp521r1

  • Наивысшая криптографическая стойкость среди P-256/P-384/P-521
  • Существенно более высокая вычислительная стоимость
  • Увеличенные размеры ключей и подписей
  • Используется в системах с длительным сроком хранения секретов

Сравнение кривых в контексте Jsrsasign

Уровень безопасности

  • secp256r1 → базовый уровень (128-bit security)
  • secp384r1 → усиленный уровень (192-bit security)
  • secp521r1 → максимальный уровень (256-bit security)

Производительность

  • secp256r1 — самая быстрая
  • secp384r1 — средняя нагрузка
  • secp521r1 — наиболее затратная по вычислениям

Поддержка алгоритмов ECDSA в Jsrsasign

Связка алгоритмов подписи:

  • secp256r1 → SHA256withECDSA
  • secp384r1 → SHA384withECDSA
  • secp521r1 → SHA512withECDSA

Эта связка обусловлена соответствием длины хэша уровню безопасности кривой.


Формирование ключей и внутренние структуры

Jsrsasign использует объектную модель, в которой ключи ECC представлены через ASN.1 структуры.

Пример внутреннего представления публичного ключа:

{
  type: "EC",
  curve: "secp256r1",
  x: "...",
  y: "..."
}

Приватный ключ:

{
  type: "EC",
  curve: "secp256r1",
  d: "private scalar"
}

Подпись и проверка в архитектуре ECC

Процесс ECDSA в Jsrsasign включает:

  1. Хеширование сообщения
  2. Генерацию случайного числа k
  3. Вычисление точки R = k × G
  4. Формирование подписи (r, s)
  5. Проверку через публичный ключ

Для всех трёх кривых структура подписи идентична, различие заключается в размере чисел и криптостойкости.


Применение в JWT (JWS)

ECC-кривые используются в JSON Web Signature:

  • ES256 → secp256r1
  • ES384 → secp384r1
  • ES512 → secp521r1

Пример создания JWS:

const sHeader = { alg: "ES256" };
const sPayload = { data: "value" };

const sJWS = KJUR.jws.JWS.sign(
  "ES256",
  sHeader,
  sPayload,
  kp.prvKeyObj
);

Особенности реализации Jsrsasign для ECC

  • Поддержка ASN.1 сериализации ключей
  • Совместимость с PKCS#8 и X.509
  • Поддержка PEM/HEX/Base64 форматов
  • Возможность импорта OpenSSL-ключей
  • Реализация полностью на JavaScript без внешних зависимостей

Практическая модель выбора кривой

  • secp256r1 — для веб-приложений и API с высокой нагрузкой
  • secp384r1 — для корпоративных и финансовых систем
  • secp521r1 — для долгосрочного хранения и критически важных данных

Внутренние ограничения и нюансы

  • Размер подписей увеличивается пропорционально размеру кривой
  • Время генерации ключей резко возрастает от P-256 к P-521
  • Некоторые браузерные реализации могут ограничивать P-521
  • Производительность ECDSA зависит от качества генератора случайных чисел