Алгоритмы семейства EC (эллиптические кривые)

Эллиптические кривые занимают центральное место в современных схемах цифровой подписи и распределения ключей. В контексте JOSE (JSON Object Signing and Encryption) они используются в двух основных направлениях: цифровые подписи (JWS) и согласование ключей (JWE через ECDH-ES). Библиотека jose в JavaScript предоставляет унифицированный интерфейс для работы с этими механизмами, скрывая сложность низкоуровневой криптографии и обеспечивая корректную реализацию стандартов.

Математическая основа эллиптических кривых

Эллиптическая кривая в криптографии задаётся уравнением вида:

y^2 = x^3 + ax + b

где коэффициенты (a) и (b) выбираются так, чтобы кривая не содержала особенностей (дискриминант не равен нулю). Множество точек на такой кривой вместе с точкой на бесконечности образуют абелеву группу.

Ключевая операция — скалярное умножение точки:

Q = d G

где:

    1. — базовая точка (generator point),
    1. — приватный ключ,
    1. — публичный ключ.

Сложность обратной задачи (дискретный логарифм на эллиптической кривой) обеспечивает криптографическую стойкость.

Кривые, используемые в JOSE

В спецификациях JOSE поддерживаются стандартные кривые, определённые NIST:

  • P-256 (secp256r1) — наиболее распространённая
  • P-384 — повышенная криптостойкость
  • P-521 — максимальный уровень в рамках JOSE EC

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

  • ES256 → ECDSA с P-256 и SHA-256
  • ES384 → ECDSA с P-384 и SHA-384
  • ES512 → ECDSA с P-521 и SHA-512

ECDSA в JOSE (цифровая подпись)

ECDSA (Elliptic Curve Digital Signature Algorithm) применяется в JWS (JSON Web Signature). Библиотека jose реализует формирование подписи как детерминированный процесс над хэшем сообщения.

Схема подписи:

  1. Вычисление хэша сообщения:

    • SHA-256 / SHA-384 / SHA-512
  2. Генерация случайного числа (k)

  3. Вычисление точек на кривой

  4. Формирование пары значений (r, s)

Подпись представляется как конкатенация двух чисел фиксированной длины.

В JOSE подпись применяется к структуре:

BASE64URL(header) + "." + BASE64URL(payload)

и результат кодируется в base64url.

Пример использования jose для ES256

import { SignJWT, importPKCS8 } from 'jose'

const privateKey = await importPKCS8(pemPrivateKey, 'ES256')

const jwt = await new SignJWT({ sub: '1234567890' })
  .setProtectedHeader({ alg: 'ES256' })
  .setIssuedAt()
  .setExpirationTime('2h')
  .sign(privateKey)

При проверке:

import { jwtVerify, importSPKI } from 'jose'

const publicKey = await importSPKI(pemPublicKey, 'ES256')

const { payload } = await jwtVerify(token, publicKey)

Формат ключей EC в JOSE

Ключи на эллиптических кривых в JOSE кодируются в формате JWK (JSON Web Key).

Пример EC ключа:

{
  "kty": "EC",
  "crv": "P-256",
  "x": "base64url_x_coordinate",
  "y": "base64url_y_coordinate",
  "d": "base64url_private_scalar"
}

Поля:

  • kty — тип ключа (EC)
  • crv — кривая
  • x, y — координаты публичной точки
  • d — приватный ключ (только для приватных ключей)

Публичный ключ содержит только x и y.

ECDH-ES: согласование ключей

ECDH (Elliptic Curve Diffie-Hellman) используется в JWE (JSON Web Encryption) для безопасного обмена симметричным ключом.

Базовая формула общего секрета:

S = d_A Q_B = d_B Q_A

где:

  • (d_A), (d_B) — приватные ключи сторон
  • (Q_A), (Q_B) — публичные ключи
    1. — общий секрет

В JOSE используется вариант ECDH-ES, где из общего секрета выводится ключ шифрования через KDF (Key Derivation Function).

ECDH-ES в библиотеке jose

Пример генерации зашифрованного JWE:

import { generateKeyPair, EncryptJWT } from 'jose'

const { publicKey, privateKey } = await generateKeyPair('ECDH-ES', {
  crv: 'P-256'
})

const jwe = await new EncryptJWT({ data: 'secret' })
  .setProtectedHeader({ alg: 'ECDH-ES', enc: 'A256GCM' })
  .setIssuedAt()
  .setExpirationTime('2h')
  .encrypt(publicKey)

Расшифрование:

import { jwtDecrypt } from 'jose'

const { payload } = await jwtDecrypt(jwe, privateKey)

KDF в ECDH-ES

После получения общего секрета применяется функция вывода ключа. В JOSE используется Concat KDF.

Упрощённая модель:

K = KDF(S, , , )

где:

    1. — общий секрет ECDH
  • alg — алгоритм шифрования
  • apu, apv — дополнительные параметры участников

Особенности реализации в jose

Библиотека jose строго следует спецификации RFC 7518:

  • запрещено использование устаревших или нестандартных кривых
  • проверка корректности публичных точек обязательна
  • подписи нормализуются для предотвращения malleability-атак
  • ключи валидируются на принадлежность кривой

ECDSA-реализация использует deterministic nonce (RFC 6979), что устраняет зависимость от случайности при генерации k.

Форматы сериализации подписи

Внутренне ECDSA подпись состоит из двух чисел:

  • r
  • s

В JOSE они кодируются как DER или raw формат (в зависимости от реализации), но в JWT/JWS используется base64url encoding финального бинарного представления.

Сравнение ECDSA и RSA в JOSE

ECDSA обладает рядом характеристик, определяющих его популярность в JOSE:

  • меньший размер ключей при сопоставимой стойкости
  • более высокая производительность подписи
  • компактные JWT-токены

RSA в JWS требует значительно больших ключей (2048+ бит), тогда как EC обеспечивает эквивалентную стойкость при 256 битах.

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

Безопасность EC-схем в JOSE зависит от:

  • корректного выбора кривой
  • качества реализации генерации случайных чисел (для ECDSA)
  • защиты приватных ключей
  • корректной валидации публичных точек

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

Применение в архитектуре современных приложений

EC-алгоритмы в JOSE применяются в:

  • OAuth 2.0 и OpenID Connect (подпись ID Token)
  • микросервисной аутентификации
  • мобильных приложениях с ограниченными ресурсами
  • API с высокой нагрузкой, где важна скорость проверки подписи
  • системах обмена зашифрованными данными между сервисами

Использование jose в JavaScript-экосистеме позволяет унифицировать работу с этими механизмами без прямого обращения к низкоуровневым криптобиблиотекам.