Апокриф 10

Эллиптические кривые: точки, которые нельзя принимать на веру

Эллиптические кривые: точки, которые нельзя принимать на веру

Эллиптическая криптография даёт те же гарантии, что RSA, при ключах в разы короче: 256-битная кривая сопоставима с 3072-битным RSA. Плата — более сложная арифметика и больше мест, где реализация может ошибиться. Ошибки эти не теоретические: недопустимая кривая, повтор nonce в ECDSA и утечка по времени ломали реальные библиотеки и устройства.

Тема идёт от группы точек к атакам. Сначала арифметика: сложение, удвоение, скалярное умножение, порядок точки. Потом протокол ECDH и то, что происходит, когда сервер не проверяет, лежит ли присланная точка на кривой: формулы сложения не содержат коэффициента b, поэтому точка с чужой кривой даёт ответ, из которого извлекается d mod q для малого q, а по остаткам восстанавливается весь секрет. Затем ECDSA и повтор nonce — атака, которая в 2010 году стоила Sony мастер-ключа PlayStation 3. В конце — X25519, монтирование по постоянному времени и защита от подгрупп.

Арифметика эллиптических кривых

Кривая и группа точек

Кривая над простым полем задаётся уравнением y^2 = x^3 + a·x + b (mod p). Точки кривой вместе с «точкой на бесконечности» образуют абелеву группу: есть сложение, обратный элемент, нулевой элемент. Сложение двух точек — проведение прямой и отражение третьей точки пересечения; удвоение — касательная. Формулы содержат a, но не содержат b.

Параметры и кодирование точек стандартизованы в SEC 1 1. Порядок группы N близок к p (по теореме Хассе, |N − (p+1)| ≤ 2√p). Порядок точки P — наименьшее k с k·P = O; он делит N. Криптография использует точки большого простого порядка, чтобы дискретный логарифм был трудным.

Скалярное умножение и ECDH

Скалярное умножение k·P вычисляется удвоением и сложением за O(log k) операций. ECDH: Алиса и Боб выбирают секреты a, b, обмениваются a·G и b·G, общий секрет — a·b·G. Противник видит две точки и должен решить задачу Диффи — Хеллмана на кривой.

Кривая должна быть «хорошей»: порядок группы — большое простое (или большое простое, умноженное на маленький кофактор), точка G порождает подгруппу большого простого порядка. Проверка этих свойств — часть выбора параметров, а не реализация.

Недопустимая кривая

Идея атаки

Формулы сложения точек не используют b. Если сервер принимает точку Q и отвечает d·Q, не проверяя, что Q лежит на объявленной кривой, противник присылает точку на другой кривой y^2 = x^3 + a·x + b' с тем же a. На этой кривой можно найти точку малого простого порядка q; ответ d·Q позволяет перебором найти d mod q. Собрав остатки по нескольким q с произведением больше N, противник восстанавливает d по китайской теореме об остатках 2.

Схема на рисунке 1.

Атака на недопустимую кривую
Рисунок 1. Точка с чужой кривой даёт d mod q; остатки по малым q собираются в d по CRT

Защита

Проверять, что точка лежит на кривой: y^2 = x^3 + a·x + b mod p. Проверять, что точка не является нулём и что её порядок — большой. Не использовать «голые» формулы без валидации входа. В X25519 та же проблема решена иначе: проверка не нужна, потому что скаляр кратен кофактору, а точки малого порядка дают нулевой общий секрет, который протокол обязан отвергнуть.

Инцидент с CurveSwap (2015) показал, что проверять надо и параметры кривой, а не только точку: подмена самой кривой на слабую ломает протокол целиком 4.

ECDSA и повтор nonce

Схема

Подпись ECDSA: r = (k·G)_x mod n, s = k^(−1)(z + r·d) mod n, где k — одноразовый nonce, d — закрытый ключ, а z — не сам хеш сообщения, а число, полученное из него: левые min(bitlen(n), bitlen(hash)) бит хеша, взятые как целое. Для P-256 с SHA-256 это все 256 бит, для P-256 с SHA-512 — только старшие 256 бит. Путать z с полным хешем нельзя: в формуле участвует именно усечённое значение. Проверка восстанавливает точку и сверяет r.

Если k повторился для двух сообщений, то r одинаков, и вычитание даёт k = (z_1 − z_2)/(s_1 − s_2) mod n, а затем d = (s_1·k − z_1)/r mod n. Два перехваченных сообщения — и ключ восстановлен 3. Схема на рисунке 2.

Повтор nonce в ECDSA
Рисунок 2. Совпадение r выдаёт повтор k; два уравнения дают k, затем d

Реальные последствия

В 2010 году Sony использовала в подписи прошивки PlayStation 3 фиксированный k. Этого хватило, чтобы извлечь закрытый ключ и научиться подписывать произвольный код 5. В 2013 году та же ошибка встречалась в Android-кошельках: слабая случайность давала повтор k и потерю средств.

Защита: детерминированный k по RFC 6979 (выводится из ключа и сообщения через HMAC), либо качественный CSPRNG, либо EdDSA, где nonce выводится детерминированно по построению 6.

X25519 и монтирование

Кривая и скаляр

X25519 — функция Диффи — Хеллмана на кривой Curve25519. Скаляр «зажимается»: младшие три бита обнуляются, старший устанавливается, и это не случайность, а защита: скаляр становится кратным кофактору 8, поэтому точки малого порядка дают нулевой результат. Реализация работает с x-координатой, использует монтирование по лестнице и не имеет ветвлений, зависящих от данных 7.

Постоянное время

Классическая ошибка — ветвление по битам скаляра или по координатам точки. Такое ветвление даёт утечку по времени и кэшу: по времени выполнения можно восстановить скаляр, и удалённые атаки на этом принципе практически работают 8. Монтирование по лестнице выполняет одинаковые операции на каждом бите; условный обмен реализуется через маску, а не через if.

Проверка «точка на кривой» в X25519 не требуется, но требуется проверка результата: если общий секрет — ноль, протокол обязан прерваться. Иначе атакующий присылает точку малого порядка и получает предсказуемый секрет.

Итоги темы

  • Безопасность ECC держится на выборе параметров и проверке входных точек.
  • Формулы сложения не содержат b, поэтому точка с чужой кривой проходит без проверки.
  • Малые порядки дают остатки d mod q; CRT собирает секрет.
  • Повтор nonce в ECDSA раскрывает ключ по двум подписям; RFC 6979 и EdDSA решают проблему.
  • X25519 спроектирован так, чтобы проверка входа была не нужна, но требует проверки результата на ноль.
  • Ветвления по данным — источник утечек по времени и кэшу.

Литература

  1. SEC 1: Elliptic Curve Cryptography. Standards for Efficient Cryptography Group, 2009. — параметры кривых, кодирование точек, ECDSA.
  2. Biehl I., Meyer B., Müller V. Differential Fault Analysis on Elliptic Curve Cryptosystems. CRYPTO 2000. — ранняя работа о недопустимых точках и малых подгруппах.
  3. Johnson D., Menezes A., Vanstone S. The Elliptic Curve Digital Signature Algorithm (ECDSA). 2001. — схема и требования к nonce.
  4. Adrian D. et al. Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice. CCS 2015. — CurveSwap и подмена параметров.
  5. Hotz G. Console Hacking 2010: PS3 Epic Fail. 27C3. — извлечение ключа из-за фиксированного nonce.
  6. RFC 6979: Deterministic Usage of DSA and ECDSA. 2013. — детерминированный nonce.
  7. RFC 7748: Elliptic Curves for Security. 2016. — X25519 и Curve25519.
  8. Brumley D., Boneh D. Remote Timing Attacks are Practical. 2003. — почему ветвления по данным опасны.