Алгоритм Ed25519: математическая основа

Ed25519 построен на эллиптической кривой в форме twisted Edwards:

x² + y² = 1 + d·x²y²

где вычисления выполняются в конечном поле ?ₚ с модулем:

p = 2²⁵⁵ − 19

Параметр кривой:

d = −121665 / 121666 (по модулю p)

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

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


Поле ?ₚ и арифметика модульных чисел

Все операции в Ed25519 выполняются по модулю p:

  • сложение: (a + b) mod p
  • умножение: (a · b) mod p
  • обратные элементы вычисляются через расширенный алгоритм Евклида

Число p = 2²⁵⁵ − 19 выбрано для ускорения редукции: оно близко к степени двойки, что позволяет оптимизировать операции на уровне битовых представлений.


Базовая точка и подгруппа

Кривая содержит циклическую подгруппу большого простого порядка:

l = 2²⁵² + 27742317777372353535851937790883648493

Генератором является фиксированная базовая точка B.

Любой приватный ключ s интерпретируется как скаляр:

A = s · B

где A — публичный ключ.


Формирование ключей

Приватный ключ

В Ed25519 приватный ключ не используется напрямую как число. Он формируется через хэширование:

  1. Берётся 32-байтовый seed
  2. Вычисляется SHA-512: H = SHA-512(seed)
  3. Левая половина хэша модифицируется (clamping)

Clamping — критически важная операция:

  • обнуляются младшие 3 бита
  • устанавливается фиксированный старший бит
  • очищается один бит перед старшими разрядами

Это гарантирует, что скаляр принадлежит корректному подмножеству группы.


Математика подписи Ed25519

Схема подписи строится на комбинации хэширования и скалярной арифметики.

Пусть:

  • M — сообщение
  • s — секретный скаляр
  • A = s·B — публичный ключ

Шаг 1. Ненцевая часть (nonce)

r = SHA-512(prefix || M)

где prefix — правая половина хэша приватного ключа.

Далее:

R = r · B


Шаг 2. Хэш вызова

k = SHA-512(R || A || M)

Хэш связывает:

  • точку R
  • публичный ключ A
  • сообщение M

Это предотвращает подмену элементов подписи.


Шаг 3. Формирование s-компоненты

S = (r + k · s) mod l


Итоговая подпись

Подпись состоит из двух элементов:

(R, S)

  • R — точка на кривой
  • S — скаляр

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

Проверка основана на равенстве:

S·B = R + k·A

где:

  • k = SHA-512(R || A || M)

Если равенство выполняется, подпись считается корректной.


Геометрия сложения точек

Для twisted Edwards-кривых операция сложения точек (x₁, y₁) и (x₂, y₂) задаётся формулами:

x₃ = (x₁y₂ + y₁x₂) / (1 + d·x₁x₂y₁y₂)

y₃ = (y₁y₂ − x₁x₂) / (1 − d·x₁x₂y₁y₂)

Деление выполняется через умножение на обратный элемент в поле ?ₚ.


Проективные координаты

Для устранения дорогостоящих операций деления используется переход к проективным координатам:

(x, y) → (X, Y, Z)

где:

x = X / Z y = Y / Z

Это позволяет заменить деления умножениями и ускоряет scalar multiplication.


Скаляры и разложение числа

Скаляр s разбивается на 256-битное число с дополнительной обработкой:

  • используется radix-2⁵ или radix-2¹⁰ представление
  • применяются signed digits (−1, 0, 1)

Это уменьшает количество сложений точек при умножении на скаляр.


Хэш-функция SHA-512 в структуре алгоритма

SHA-512 выполняет две разные роли:

  • генерация детерминированного nonce r
  • вычисление вызова k

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


Защита от атак повторного использования nonce

Ключевая проблема схем подписи — утечка nonce r.

В Ed25519 nonce:

r = SHA-512(prefix || M)

Это делает его:

  • детерминированным
  • зависящим от сообщения
  • независимым от внешних случайных генераторов

Тем самым устраняется класс атак, связанных с плохими RNG.


Связь с реализацией TweetNaCl.js / nacl.js

В реализациях на Jav * aScript:

  • все операции выполняются над Uint8Array
  • арифметика поля реализуется через 32- и 64-битные промежуточные значения
  • критические части оптимизированы под отсутствие ветвлений
  • используются заранее вычисленные таблицы кратных точек B

Scalar multiplication обычно реализуется через алгоритм double-and-add с оптимизациями windowing.


Константное время выполнения

Для криптографической устойчивости важно отсутствие зависимостей времени выполнения от секретных данных.

В реализации:

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

Это снижает риск timing-атак.


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

Уравнение:

S·B = R + k·A

можно интерпретировать как доказательство знания s, без его раскрытия.

Если переписать:

S·B = r·B + k·s·B

то становится видно, что:

S ≡ r + k·s (mod l)

Подпись связывает случайность r, сообщение M и секрет s в единую алгебраическую структуру.