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