ECDH-ES (Elliptic Curve Diffie-Hellman Ephemeral Static) — механизм согласования ключа, используемый в спецификации JWE (JSON Web Encryption) в экосистеме JOSE. Он основан на эллиптической криптографии и предназначен для безопасного формирования общего симметричного ключа между отправителем и получателем без его прямой передачи.
В отличие от классических схем шифрования, где используется заранее распределённый симметричный ключ или RSA-шифрование ключа, ECDH-ES реализует модель key agreement, в которой итоговый ключ вычисляется обеими сторонами независимо.
ECDH-ES строится на классическом алгоритме Диффи—Хеллмана на эллиптических кривых:
Z = d_A Q_B = d_B Q_A
где:
Полученный общий секрет далее не используется напрямую как ключ шифрования. Он проходит через KDF (Key Derivation Function), чтобы получить симметричный ключ для алгоритмов вроде AES-GCM.
В спецификации JOSE алгоритм ECDH-ES применяется как alg
в заголовке JWE:
ECDH-ES — прямое использование общего секрета как
источника ключа;ECDH-ES+A128KW, ECDH-ES+A256KW —
использование общего секрета для обёртки (key wrapping) контентного
ключа.В библиотеке JavaScript Jose (например, jose от Panva)
этот механизм реализован через модуль JWE.
Эфемерные ключи — временные ключевые пары, генерируемые для одной операции шифрования.
В ECDH-ES они играют ключевую роль:
Ключевая характеристика:
каждое сообщение использует уникальный набор ключей
Это обеспечивает:
Типичная структура JWE при использовании ECDH-ES:
В заголовке:
{
"alg": "ECDH-ES",
"enc": "A256GCM",
"epk": {
"kty": "EC",
"crv": "P-256",
"x": "...",
"y": "..."
}
}
epk — ephemeral public key, передаваемый
отправителем.
Процесс можно разделить на этапы:
Отправитель создаёт временную EC-пару:
Получателю передаётся:
epk)Получатель использует:
и вычисляет shared secret.
Общий секрет преобразуется через KDF:
Результат:
В режиме чистого ECDH-ES (alg: "ECDH-ES") происходит
прямое получение CEK:
Это делает схему более компактной, но менее гибкой.
В вариантах:
ECDH-ES+A128KWECDH-ES+A256KWпроцесс разделяется:
Такой подход позволяет:
Библиотека jose реализует ECDH-ES через API JWE:
import { generateKeyPair } from 'jose';
const { publicKey, privateKey } = await generateKeyPair('ECDH-ES', {
crv: 'P-256'
});
import { CompactEncrypt } from 'jose';
const encoder = new TextEncoder();
const jwe = await new CompactEncrypt(
encoder.encode('secret data')
)
.setProtectedHeader({
alg: 'ECDH-ES',
enc: 'A256GCM'
})
.encrypt(publicKey);
import { compactDecrypt } from 'jose';
const { plaintext } = await compactDecrypt(jwe, privateKey);
console.log(new TextDecoder().decode(plaintext));
В библиотеке jose генерация ephemeral key происходит
автоматически при шифровании.
Особенности:
epk;При необходимости ручного контроля можно использовать более
низкоуровневые API generateKeyPair.
Ключевые свойства безопасности:
Слабые места возникают при:
| Свойство | RSA | ECDH-ES |
|---|---|---|
| Модель | key transport | key agreement |
| Эфемерные ключи | нет | да |
| Forward secrecy | отсутствует | присутствует |
| Нагрузка | выше | ниже |
| Масштабируемость | хуже | лучше |
ECDH-ES применяется в JOSE-системах, где требуется:
Поддерживаемые кривые в jose:
Выбор кривой влияет на:
После derivation ключа используется AEAD-шифрование:
C = (K_{CEK}, P, IV)
где:
KDF является критическим элементом:
Используемая функция:
При работе с ECDH-ES в jose важны детали:
alg должен совпадать у обеих сторон;enc определяет симметричный шифр;Ошибки чаще всего возникают при:
ECDH-ES стал частью JOSE как развитие моделей:
Современные реализации JavaScript-библиотек криптографии постепенно смещаются в сторону X25519 как наиболее удобного варианта ECDH-ES.