Кривые P-256, P-384, P-521: сравнение и выбор

В Web Crypto API эллиптические кривые семейства NIST P-256, P-384 и P-521 используются в алгоритмах ECDH и ECDSA. Эти кривые определяют математическую основу для асимметричной криптографии на эллиптических кривых и задают уровень криптографической стойкости, размер ключей и производительность операций.

Поддержка в Web Crypto API выражается через именованные параметры при генерации ключей:

  • P-256namedCurve: "P-256"
  • P-384namedCurve: "P-384"
  • P-521namedCurve: "P-521"

Использование происходит через SubtleCrypto.generateKey, sign, verify, deriveKey, deriveBits.


Математическая основа и особенности семейств кривых

Эллиптические кривые NIST определяются над конечными полями простого порядка. Каждая кривая задаётся уравнением вида:

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

где параметры различаются для каждой кривой.

P-256 (secp256r1)

Наиболее широко используемая кривая в прикладной криптографии.

  • Размер ключа: 256 бит
  • Уровень безопасности: ~128 бит
  • Оптимизирована для большинства аппаратных платформ
  • Используется по умолчанию во многих TLS-конфигурациях

Характерные свойства:

  • Хороший баланс между скоростью и стойкостью
  • Широкая аппаратная поддержка (CPU инструкции, HSM)
  • Минимальная задержка операций подписи и проверки

P-384 (secp384r1)

Кривая с увеличенной длиной ключа и более высоким уровнем стойкости.

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

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

  • Устойчивость к атакам с более высоким вычислительным ресурсом
  • Часто применяется в государственных и финансовых системах
  • Более высокая стоимость операций ECDSA и ECDH

P-521 (secp521r1)

Кривая с максимальным уровнем безопасности среди стандартных NIST-кривых.

  • Размер ключа: 521 бит
  • Уровень безопасности: ~256 бит
  • Наиболее затратная по вычислениям
  • Использует нестандартную длину поля (не кратную байтам)

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

  • Максимальная криптографическая стойкость в WebCrypto из стандартных вариантов
  • Существенно более медленная генерация и операции подписи
  • Используется редко, в системах с долгим горизонтом безопасности

Поддержка в Web Crypto API

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

const keyPair = await crypto.subtle.generateKey(
  {
    name: "ECDSA",
    namedCurve: "P-256"
  },
  true,
  ["sign", "verify"]
);

Аналогично для других кривых:

namedCurve: "P-384"
namedCurve: "P-521"

ECDH:

const keyPair = await crypto.subtle.generateKey(
  {
    name: "ECDH",
    namedCurve: "P-256"
  },
  true,
  ["deriveKey", "deriveBits"]
);

Сравнение характеристик

Кривая Длина ключа Уровень безопасности Производительность Область применения
P-256 256 бит ~128 бит высокая Web, TLS, мобильные приложения
P-384 384 бит ~192 бит средняя финансы, государственные системы
P-521 521 бит ~256 бит низкая долгосрочная защита, специализированные системы

Производительность и практические различия

Разница между кривыми становится критичной при массовых криптографических операциях:

Операции подписи (ECDSA)

  • P-256 выполняет подпись значительно быстрее благодаря оптимизациям процессоров
  • P-384 требует примерно на 40–70% больше времени
  • P-521 может быть в 2–4 раза медленнее P-256

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

ECDH чувствителен к размеру скаляра:

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

Криптографическая стойкость

Уровни безопасности соответствуют приблизительной стойкости к атаке перебором:

  • P-256 → ~2^128 операций
  • P-384 → ~2^192 операций
  • P-521 → ~2^256 операций

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


Совместимость и экосистема

P-256

  • Поддерживается всеми современными браузерами
  • Широко используется в TLS 1.2 и 1.3
  • Поддержка в аппаратных криптомодулях

P-384

  • Поддерживается во всех современных браузерах
  • Используется в TLS-шифрах с повышенной стойкостью
  • Часто применяется в цифровых сертификатах высокого уровня доверия

P-521

  • Поддержка есть, но реже используется в реальных веб-сценариях
  • Может отсутствовать в некоторых аппаратных ускорителях
  • Часто заменяется P-384 как компромисс

Практическое применение в WebCrypto

Подпись данных (ECDSA)

const signature = await crypto.subtle.sign(
  {
    name: "ECDSA",
    hash: "SHA-256"
  },
  privateKey,
  data
);

Выбор хэша часто зависит от кривой:

  • P-256 → SHA-256
  • P-384 → SHA-384
  • P-521 → SHA-512

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

const valid = await crypto.subtle.verify(
  {
    name: "ECDSA",
    hash: "SHA-256"
  },
  publicKey,
  signature,
  data
);

ECDH и вывод общего секрета

const secret = await crypto.subtle.deriveBits(
  {
    name: "ECDH",
    public: otherPublicKey
  },
  privateKey,
  256
);

Размер выходных данных обычно сопоставляется с уровнем выбранной кривой.


Выбор кривой в реальных системах

P-256 используется, когда:

  • важна скорость
  • высокая нагрузка на сервер
  • стандартные веб-приложения
  • мобильные клиенты

P-384 используется, когда:

  • требуется повышенная криптостойкость
  • финансовые транзакции
  • корпоративные PKI

P-521 используется, когда:

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

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

  • Нет возможности задавать произвольные кривые — только фиксированный набор NIST
  • Поведение зависит от реализации браузера и ОС
  • Производительность может меняться при аппаратном ускорении
  • Некоторые устройства не ускоряют P-384 и P-521

Безопасные практики выбора

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