Алгоритмы семейства OKP: Ed25519, Ed448, X25519, X448

OKP как тип ключей в JWK и его роль в JOSE

В спецификации JOSE (JSON Object Signing and Encryption), используемой в JavaScript-библиотеке jose, тип ключа OKP (Octet Key Pair) предназначен для современных эллиптических алгоритмов на основе кривых в форме Монта/Эдвардса.

OKP объединяет несколько алгоритмов, каждый из которых решает отдельную задачу:

  • Ed25519, Ed448 — цифровые подписи (EdDSA)
  • X25519, X448 — обмен ключами (Diffie-Hellman)

В JWK (JSON Web Key) такие ключи выглядят компактно и строго типизировано:

{
  "kty": "OKP",
  "crv": "Ed25519",
  "x": "...",
  "d": "..."
}

или для публичного ключа:

{
  "kty": "OKP",
  "crv": "X25519",
  "x": "..."
}

Поле crv определяет конкретный алгоритм, а x и d содержат координаты ключей в base64url.


Ed25519

Назначение

Ed25519 используется для криптографической подписи сообщений. Это реализация схемы EdDSA (Edwards-curve Digital Signature Algorithm) на кривой Curve25519.

Свойства

  • Высокая скорость генерации и проверки подписи
  • Короткие ключи (32 байта публичный ключ)
  • Высокая устойчивость к атакам на реализацию
  • Отсутствие зависимости от случайных чисел в процессе подписи (детерминированность)

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

import { generateKeyPair, SignJWT, jwtVerify } from 'jose'

const { publicKey, privateKey } = await generateKeyPair('Ed25519')

// подпись JWT
const jwt = await new SignJWT({ sub: '123' })
  .setProtectedHeader({ alg: 'EdDSA' })
  .sign(privateKey)

// проверка
const { payload } = await jwtVerify(jwt, publicKey)

Важные особенности

  • Алгоритм всегда используется через alg: "EdDSA"
  • В JWK указывается crv: "Ed25519"
  • Подпись всегда имеет фиксированный размер (64 байта)

Ed448

Назначение

Ed448 — более современная и криптографически «запасная» версия Ed25519, основанная на кривой Curve448.

Используется также для цифровых подписей, но с повышенным уровнем безопасности.

Свойства

  • Более высокий уровень криптостойкости (примерно 224-битный уровень безопасности)
  • Более длинные ключи и подписи
  • Более медленная работа по сравнению с Ed25519
  • Подходит для долгосрочной защиты данных

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

import { generateKeyPair, SignJWT, jwtVerify } from 'jose'

const { publicKey, privateKey } = await generateKeyPair('Ed448')

const jwt = await new SignJWT({ role: 'admin' })
  .setProtectedHeader({ alg: 'EdDSA' })
  .sign(privateKey)

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

Особенности интеграции

  • Используется тот же алгоритм EdDSA
  • Отличие только в crv: "Ed448"
  • Подписи значительно длиннее (114 байт)

X25519

Назначение

X25519 применяется для обмена ключами (Diffie–Hellman). Он используется для безопасного согласования общего секрета между двумя сторонами.

Свойства

  • Высокая производительность
  • Простая и безопасная реализация ECDH
  • Устойчивость к классическим атакам на Diffie-Hellman
  • Основа многих современных протоколов (например, TLS 1.3)

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

import { generateKeyPair, deriveKey } from 'jose'

const alice = await generateKeyPair('X25519')
const bob = await generateKeyPair('X25519')

// общий секрет со стороны Alice
const secretAlice = await deriveKey({
  privateKey: alice.privateKey,
  publicKey: bob.publicKey
})

Особенности

  • Используется только для обмена ключами, не для подписи
  • В JWK: crv: "X25519"
  • Результат — общий симметричный секрет

X448

Назначение

X448 — расширенная версия X25519 с повышенным уровнем криптографической стойкости.

Используется для Diffie-Hellman обмена ключами, когда требуется более высокий запас безопасности.

Свойства

  • Увеличенный уровень защиты (224-битный уровень безопасности)
  • Более медленный по сравнению с X25519
  • Подходит для систем с долгим сроком жизни ключей

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

import { generateKeyPair, deriveKey } from 'jose'

const alice = await generateKeyPair('X448')
const bob = await generateKeyPair('X448')

const shared = await deriveKey({
  privateKey: alice.privateKey,
  publicKey: bob.publicKey
})

Особенности

  • В JWK: crv: "X448"
  • Используется только в ECDH-операциях
  • Требует больше вычислительных ресурсов

Сравнение алгоритмов OKP

Подписи

Алгоритм Назначение Скорость Уровень безопасности
Ed25519 Подпись Очень высокая 128-bit
Ed448 Подпись Средняя 224-bit

Обмен ключами

Алгоритм Назначение Скорость Уровень безопасности
X25519 ECDH Очень высокая 128-bit
X448 ECDH Средняя 224-bit

Использование OKP в структуре JOSE

В библиотеке jose алгоритмы OKP интегрированы через стандартизированные JWK и JWS/JWE механизмы.

JWK ключ

{
  "kty": "OKP",
  "crv": "Ed25519",
  "x": "publicKey",
  "d": "privateKey"
}

JWS (подпись)

  • alg: "EdDSA"
  • поддерживаемые кривые: Ed25519, Ed448

JWE (обмен ключами)

  • используется X25519 или X448
  • участвуют в механизме ECDH-ES

Внутренняя модель работы OKP в jose

Подписи (Ed25519 / Ed448)

  1. Сообщение хешируется и обрабатывается детерминированно
  2. Применяется приватный ключ
  3. Формируется подпись фиксированной длины
  4. Проверка выполняется через публичный ключ

Обмен ключами (X25519 / X448)

  1. Каждая сторона генерирует пару ключей
  2. Публичные ключи обмениваются
  3. Вычисляется общий секрет через ECDH
  4. Секрет используется для симметричного шифрования

Причины использования OKP вместо RSA и классических ECDSA

  • Меньше размер ключей и токенов
  • Быстрее вычисления
  • Меньше вероятность ошибок реализации
  • Современная криптографическая база
  • Поддержка в современных протоколах (JWT, TLS 1.3, OpenID Connect)

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

  • Требуется подпись JWT → Ed25519
  • Требуется усиленная защита на десятилетия → Ed448
  • Требуется быстрый обмен ключами → X25519
  • Требуется максимальная криптостойкость ECDH → X448