Кривые RFC 8422

RFC 8422 определяет использование эллиптической криптографии (ECC) в протоколе TLS, включая перечень поддерживаемых кривых (Named Groups) и правила их согласования между клиентом и сервером. В библиотеке jsrsasign реализация ECC опирается на набор стандартных кривых, соответствующих рекомендациям RFC, включая те, что упоминаются в RFC 8422 и последующих обновлениях TLS 1.2/1.3.

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

  • генерации ключевых пар (ECDSA, ECDH),
  • цифровой подписи,
  • обмена ключами,
  • проверки сертификатов X.509.

Поддерживаемые кривые и их идентификаторы

RFC 8422 определяет именованные группы (Named Groups), ранее называвшиеся Named Curves. В jsrsasign кривые задаются строковыми идентификаторами, соответствующими стандартным именам.

Основные кривые

Имя (RFC) Имя в jsrsasign Описание
secp256r1 P-256 Наиболее распространённая кривая
secp384r1 P-384 Повышенная безопасность
secp521r1 P-521 Максимальный уровень безопасности
secp256k1 secp256k1 Используется в блокчейн-системах

Внутри jsrsasign эти кривые доступны через объект KJUR.crypto.ECDSA.


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

Генерация ECC-ключей производится через класс ECDSA. Важно указывать правильное имя кривой.

var ec = new KJUR.crypto.ECDSA({curve: "P-256"});
var keypair = ec.generateKeyPairHex();

var pubKeyHex = keypair.ecpubhex;
var privKeyHex = keypair.ecprvhex;

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

  • curve должен совпадать с поддерживаемыми значениями RFC 8422.
  • ключи возвращаются в шестнадцатеричном формате.
  • приватный ключ представляет собой скаляр, публичный — точку на кривой.

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

Публичный ключ в ECC — это точка (x, y) на эллиптической кривой. В jsrsasign используется несжатый формат:

04 || X || Y

Где:

  • 04 — префикс несжатого ключа,
  • X и Y — координаты точки.

Подпись и проверка (ECDSA)

Создание подписи

var sig = new KJUR.crypto.Signature({
  alg: "SHA256withECDSA"
});

sig.init({d: privKeyHex, curve: "P-256"});
sig.updateString("message");

var signatureHex = sig.sign();

Проверка подписи

var sig = new KJUR.crypto.Signature({
  alg: "SHA256withECDSA"
});

sig.init({xy: pubKeyHex, curve: "P-256"});
sig.updateString("message");

var isValid = sig.verify(signatureHex);

Ключевые моменты:

  • Алгоритм должен соответствовать выбранной кривой (например, SHA256 для P-256).
  • RFC 8422 требует согласованности алгоритмов между сторонами TLS-сессии.

Обмен ключами (ECDH)

Для реализации ECDH jsrsasign предоставляет низкоуровневые инструменты работы с точками кривых.

Вычисление общего секрета

var ec = new KJUR.crypto.ECDSA({curve: "P-256"});

var sharedKey = ec.getSecretKeyHex(
  privKeyHex,
  pubKeyHexOtherParty
);

Принцип:

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

ASN.1 и кодирование ключей

RFC 8422 подразумевает использование стандартных форматов кодирования ключей. jsrsasign поддерживает:

  • PKCS#8 — приватные ключи,
  • X.509 SubjectPublicKeyInfo — публичные ключи,
  • PEM / DER форматы.

Пример экспорта ключа

var pem = KJUR.KEYUTIL.getPEM({
  curve: "P-256",
  d: privKeyHex
}, "PKCS8PRV");

Связь с TLS и RFC 8422

В контексте TLS:

  • клиент отправляет список поддерживаемых кривых (Named Groups),
  • сервер выбирает одну из них,
  • происходит обмен ключами (обычно ECDHE),
  • подписи выполняются с использованием ECDSA.

jsrsasign не реализует TLS напрямую, но:

  • предоставляет криптографические примитивы,
  • полностью совместим с требованиями RFC,
  • может использоваться для тестирования TLS-реализаций.

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

1. Отсутствие автоматического выбора кривой

Разработчик явно указывает кривую. В отличие от TLS-стека, библиотека не выполняет negotiation.

2. Безопасность генерации случайных чисел

ECDSA критически зависит от случайного параметра k. В jsrsasign используется встроенный генератор, но:

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

3. Совместимость с RFC 8446 (TLS 1.3)

RFC 8422 частично устарел, и многие положения перенесены в TLS 1.3:

  • Named Groups расширены,
  • добавлены кривые X25519 и X448 (не полностью поддерживаются jsrsasign).

Расширенные кривые и их поддержка

jsrsasign в основном ориентирован на классические кривые NIST:

  • P-256
  • P-384
  • P-521

Поддержка современных кривых (например, Curve25519) ограничена или отсутствует, что важно учитывать при реализации современных TLS-решений.


Практическое сопоставление с RFC 8422

Концепция RFC 8422 Реализация в jsrsasign
Named Groups curve: "P-256"
ECDSA подпись Signature
ECDH обмен getSecretKeyHex
Кодирование ключей KEYUTIL

Проверка сертификатов с ECC

jsrsasign позволяет проверять сертификаты X.509, содержащие ECC-ключи:

var cert = new X509();
cert.readCertPEM(pemCert);

var pubKey = cert.getPublicKey();

После извлечения ключа можно:

  • проверить подпись,
  • использовать его в криптографических операциях.

Выбор кривой: практические рекомендации

  • P-256 — баланс безопасности и производительности
  • P-384 — для усиленной защиты
  • P-521 — редко используется из-за высокой вычислительной стоимости

RFC 8422 рекомендует избегать устаревших кривых и использовать проверенные стандартизированные параметры.


Взаимодействие с другими библиотеками

jsrsasign может использоваться совместно с:

  • Web Crypto API
  • OpenSSL
  • Node.js crypto

При этом важно учитывать:

  • формат ключей,
  • порядок байтов,
  • кодировку точек.

Типичные ошибки

  1. Несоответствие кривой и алгоритма подписи
  2. Неверный формат публичного ключа
  3. Использование неподдерживаемых кривых
  4. Ошибки при ASN.1 кодировании

Внутренняя архитектура ECC в jsrsasign

Основные компоненты:

  • ECDSA — генерация ключей и подписи
  • ECParameterDB — база параметров кривых
  • BigInteger — арифметика больших чисел
  • ECPoint — работа с точками кривой

Итоговая структура работы с кривыми

  1. Выбор кривой (RFC 8422)
  2. Генерация ключей
  3. Использование ключей (подпись / обмен)
  4. Кодирование и передача
  5. Проверка на принимающей стороне

Такая последовательность полностью соответствует модели, описанной в RFC 8422, и реализуется средствами jsrsasign без необходимости внешних зависимостей.