Принцип ECDH и обмен ключами

ECDH (Elliptic Curve Diffie–Hellman) представляет собой механизм установления общего секретного ключа между двумя сторонами по небезопасному каналу связи. В основе лежит асимметричная криптография на эллиптических кривых, обеспечивающая высокую стойкость при относительно небольших размерах ключей и высокой производительности.

В основе алгоритма лежит операция скалярного умножения точки на эллиптической кривой:

Q = d × G

где:

  • G — базовая точка (generator point)
  • d — приватный ключ (случайное число)
  • Q — публичный ключ (точка на кривой)

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

  • вычислить Q из d и G легко
  • восстановить d из Q и G вычислительно практически невозможно (задача дискретного логарифма на эллиптических кривых)

Это создаёт асимметрию, на которой строится обмен ключами.

Принцип обмена ключами

ECDH позволяет двум сторонам — условно Alice и Bob — получить одинаковый общий секрет, не передавая его напрямую.

Генерация ключевых пар

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

  • выбирает случайный приватный ключ:

    d_A, d_B

  • вычисляет публичные ключи:

    Q_A = d_A × G Q_B = d_B × G

Публичные ключи передаются по открытому каналу.

Вычисление общего секрета

После обмена публичными ключами:

  • Alice вычисляет:

    S = d_A × Q_B

  • Bob вычисляет:

    S = d_B × Q_A

За счёт свойств эллиптических кривых:

d_A × Q_B = d_A × (d_B × G) = d_B × (d_A × G) = d_B × Q_A

Таким образом обе стороны получают одинаковую точку S, которая используется как общий секрет.

Свойства безопасности

ECDH обеспечивает следующие ключевые свойства:

Прямая секретность

Компрометация приватного ключа в будущем не раскрывает прошлые сессии при использовании ephemeral-ключей.

Стойкость к перехвату

Атакующий, имея только публичные ключи, не может вычислить общий секрет без решения задачи дискретного логарифма.

Компактность ключей

256-битные ключи ECC обеспечивают уровень безопасности, сопоставимый с 3072-битным RSA.

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

Библиотека SJCL (Stanford Javascript Crypto Library) предоставляет инструменты для работы с эллиптическими кривыми и ECDH через модуль sjcl.ecc.

Генерация ключевой пары

const keypair = sjcl.ecc.elGamal.generateKeys(256);

const publicKey = keypair.pub;
const privateKey = keypair.sec;

В SJCL используется схема ElGamal поверх эллиптических кривых, которая включает ECDH-операции как базовый механизм получения общего секрета.

Формирование общего секрета

Обмен ключами в SJCL реализуется через операцию умножения закрытого ключа на публичный ключ другой стороны.

Пример вычисления секрета

// Alice
const alice = sjcl.ecc.elGamal.generateKeys(256);

// Bob
const bob = sjcl.ecc.elGamal.generateKeys(256);

// Alice вычисляет общий секрет
const secretAlice = alice.sec.dh(bob.pub);

// Bob вычисляет общий секрет
const secretBob = bob.sec.dh(alice.pub);

Обе переменные secretAlice и secretBob содержат одинаковое значение.

Преобразование секрета в симметричный ключ

Полученная точка эллиптической кривой не используется напрямую как ключ для AES или других алгоритмов. Обычно выполняется хеширование:

const sharedPoint = alice.sec.dh(bob.pub);

const sharedKeyBits = sjcl.hash.sha256.hash(sharedPoint.toBits());
const aesKey = new sjcl.cipher.aes(sharedKeyBits);

Таким образом обеспечивается:

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

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

Использование фиксированных кривых

SJCL поддерживает несколько стандартных кривых, например:

  • secp256r1 (P-256)
  • secp192r1

Выбор кривой влияет на:

  • производительность
  • уровень безопасности
  • совместимость с другими системами

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

SJCL использует внутренний формат bitArray:

const bits = sjcl.codec.hex.toBits("a1b2c3d4");

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

Практическая схема обмена в реальном приложении

Типичный поток выглядит следующим образом:

  1. Генерация ключей на клиенте A
  2. Генерация ключей на клиенте B
  3. Обмен публичными ключами
  4. Вычисление общего секрета через ECDH
  5. Производство симметричного ключа через SHA-256
  6. Использование AES для шифрования сообщений

Защита от атак

Man-in-the-Middle

ECDH сам по себе не защищает от MITM-атак. Без аутентификации злоумышленник может подменить публичные ключи.

Решение:

  • цифровые подписи
  • сертификаты
  • предварительно распределённые ключи

Replay-атаки

Использование ephemeral-ключей (одноразовых) предотвращает повторное использование перехваченных сессий.

Weak random

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

Типичные ошибки при использовании ECDH в SJCL

Повторное использование приватных ключей

Использование одного и того же ключа для множества сессий снижает уровень forward secrecy.

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

Недопустимо использовать результат ECDH без хеширования.

Игнорирование проверки публичных ключей

Публичный ключ должен проверяться на принадлежность к корректной кривой.

Структура криптографического канала на ECDH

В практических системах ECDH используется как часть гибридной схемы:

  • ECDH → согласование ключа
  • SHA-2 / HKDF → деривация ключей
  • AES-GCM → симметричное шифрование

SJCL позволяет реализовать такую схему полностью на стороне JavaScript без внешних зависимостей.

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

ECDH на эллиптических кривых оптимизирован для:

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

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

Совместимость с другими реализациями

ECDH в SJCL совместим с:

  • OpenSSL (при совпадении кривых)
  • WebCrypto API
  • большинством TLS-реализаций

Основное условие — одинаковая кривая и корректная сериализация публичных ключей.

Представление ключей в реальных системах

Публичные ключи обычно сериализуются в:

  • HEX
  • Base64
  • ASN.1 / DER (в интеграции с TLS)

SJCL предоставляет кодеки для преобразования:

sjcl.codec.hex.fromBits(pub.get().x);

Роль ECDH в современных протоколах

ECDH используется в:

  • TLS 1.2 / 1.3 (ECDHE)
  • Signal Protocol
  • WebRTC
  • защищённых мессенджерах

Везде применяется вариация ephemeral ECDH для обеспечения forward secrecy.

Интеграция ECDH в архитектуру приложения

В клиентских JavaScript-приложениях SJCL позволяет реализовать:

  • end-to-end шифрование
  • защищённый обмен ключами без серверного хранения секретов
  • генерацию временных сессий без долговременных ключей

ECDH становится центральным механизмом установления доверенного канала поверх небезопасного HTTP или WebSocket соединения.