Кривые NIST и их параметры

Кривые семейства NIST (National Institute of Standards and Technology) представляют собой набор параметризованных эллиптических кривых, предназначенных для криптографического применения. Они широко используются в протоколах электронной подписи, шифрования и аутентификации, включая ECDSA, ECDH и другие алгоритмы на основе эллиптических кривых.

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


Общая форма эллиптической кривой

Кривые NIST определены над конечным полем и имеют уравнение вида:

  • Для простых полей (prime field, GF(p)):

    y² = x³ + ax + b (mod p)

Параметры кривой включают:

  • p — простое число, задающее поле
  • a, b — коэффициенты уравнения
  • G (base point) — базовая точка
  • n — порядок точки G
  • h — кофактор

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

P-192 (secp192r1)

  • Размер ключа: 192 бита
  • Поле: GF(p), где p ≈ 2¹⁹²
  • Используется редко из-за недостаточной криптостойкости по современным меркам

Параметры:

  • p = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF
  • a = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC
  • b = 64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1

P-224 (secp224r1)

  • Размер ключа: 224 бита
  • Повышенная стойкость по сравнению с P-192
  • Используется в некоторых старых системах

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

  • Оптимизирована для повышения эффективности вычислений
  • Использует специальную форму числа p

P-256 (secp256r1)

  • Один из наиболее широко применяемых стандартов
  • Размер ключа: 256 бит
  • Используется в TLS, JWT, WebAuthn

Параметры:

  • p = FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF
  • a = FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC
  • b = 5AC635D8AA3A93E7B3EBBD55AA06295CE870B07029BFCDB2DCE28D959F2815B16

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

  • Хороший баланс между безопасностью и производительностью
  • Поддерживается большинством криптографических библиотек

P-384 (secp384r1)

  • Размер ключа: 384 бита
  • Повышенная криптостойкость
  • Используется в системах с высокими требованиями безопасности

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

  • Более высокая вычислительная нагрузка
  • Часто применяется в государственных и корпоративных системах

P-521 (secp521r1)

  • Размер ключа: 521 бит
  • Максимальный уровень безопасности среди стандартных кривых NIST

Параметры:

  • p = 2⁵²¹ − 1 (число Мерсенна)
  • Обеспечивает высокий уровень защиты даже против перспективных атак

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

  • Значительно медленнее в вычислениях
  • Используется в критически важных системах

Представление кривых в Jsrsasign

В Jsrsasign кривые задаются через строковые идентификаторы:

  • "secp256r1" (или "P-256")
  • "secp384r1" (или "P-384")
  • "secp521r1" (или "P-521")

Пример генерации ключевой пары:

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

Результат включает:

  • ecprvhex — приватный ключ
  • ecpubhex — публичный ключ

Базовая точка (Generator Point)

Каждая кривая содержит фиксированную базовую точку G, используемую для генерации ключей:

  • Приватный ключ: случайное число d
  • Публичный ключ: Q = d * G

Это умножение точки на скаляр — основа безопасности эллиптической криптографии.


Порядок группы (n)

Параметр n определяет количество точек в подгруппе, порождённой G.

Ключевые свойства:

  • n — большое простое число
  • Обеспечивает невозможность обратного вычисления d по Q

Кофактор (h)

Кофактор определяется как:

  • h = (#E(Fp)) / n

Где #E(Fp) — общее число точек на кривой.

Для кривых NIST:

  • h = 1

Это означает отсутствие дополнительных подгрупп, что упрощает реализацию и повышает безопасность.


Выбор кривой в зависимости от задач

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

Кривые P-192 и P-224 считаются устаревшими и не рекомендуются для новых систем.


Использование в цифровой подписи (ECDSA)

Jsrsasign реализует ECDSA с использованием выбранной кривой:

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

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

var sig = new KJUR.crypto.Signature({"alg": "SHA256withECDSA"});
sig.init({xy: pubKeyHex, curve: "secp256r1"});
sig.updateString("message");
var isValid = sig.verify(signature);

Влияние параметров на безопасность

  • Размер поля (p) влияет на сложность атак перебора
  • Порядок (n) определяет стойкость к атакам на дискретный логарифм
  • Коэффициенты (a, b) задают форму кривой и её криптографические свойства

Кривые NIST прошли криптографическую экспертизу, однако в последние годы обсуждаются альтернативы (например, Curve25519), обладающие более прозрачными параметрами.


Внутренние оптимизации в Jsrsasign

Библиотека использует:

  • Представление больших чисел через BigInteger
  • Алгоритмы быстрого умножения точек (double-and-add)
  • Оптимизации для конкретных кривых (предвычисления)

Это позволяет эффективно выполнять операции даже в браузере.


Представление ключей

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

  • Uncompressed: 04 || X || Y
  • Compressed: 02/03 || X

Jsrsasign поддерживает оба формата, но по умолчанию использует uncompressed.


Совместимость и стандарты

Кривые NIST используются в:

  • X.509 сертификатах
  • JWT (ES256, ES384, ES512)
  • TLS (ECDHE, ECDSA)

Jsrsasign обеспечивает совместимость с этими стандартами, что делает её удобной для веб-криптографии.


Ограничения и рекомендации

  • Не использовать устаревшие кривые (P-192, P-224)
  • Всегда выбирать длину ключа не менее 256 бит
  • Следить за корректной генерацией случайных чисел
  • Использовать современные хеш-функции (SHA-256 и выше)

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

Jsrsasign позволяет добавлять пользовательские кривые через определение параметров, однако это требует глубокого понимания криптографии и не рекомендуется без необходимости.

Стандартные кривые NIST покрывают большинство практических задач и обеспечивают высокий уровень безопасности при корректной реализации.