Источник: https://github.com/AnaktaCTF/CTF/blob/main — Cryptography/ECC.md
Эллиптические кривые (Elliptic Curve Cryptography, ECC) — один из самых эффективных современных методов криптографии, основанный на сложных математических проблемах.
В отличие от традиционных алгоритмов, таких как RSA, криптосистемы ECC обеспечивают высокий уровень безопасности при значительно меньших размерах ключей. Это делает ECC привлекательным выбором для защищённого обмена данными, цифровых подписей и аутентификации. Однако, несмотря на преимущества эллиптических кривых, ECC не являются абсолютной защитой от криптоаналитических атак.
В данной статье рассматриваются основные методы атак на ECC, включая атаки на дискретный логарифм, атаки Полларда «ро», атаки на некорректные параметры и атаки по сторонним каналам. В завершение проведён разбор задачи по данной теме.
Алгоритм ECC
Основное преимущество ECC заключается в проблеме дискретного логарифма (ECDLP) — задаче нахождения числа n, такого что:
$$
Q=nG
$$
где:
- G — фиксированная генераторная точка на эллиптической кривой,
- Q — публичный ключ (точка на кривой),
- n — закрытый ключ (скаляр, который мы хотим найти).
Основная сложность состоит в том, что даже при известном G и Q, вычислить n практически невозможно при достаточно больших значениях параметров.
В общем виде эллиптическая кривая в конечном поле GF(p) задаётся уравнением:
$$
y^2 \equiv x^3 + ax + b \mod p
$$
где p — простое число, а a и b — параметры кривой. Чтобы кривая была корректной, должно выполняться условие:
$$
4a^3 + 27b^2 \not\equiv 0 \mod p
$$
Это гарантирует, что уравнение действительно определяет эллиптическую кривую, а не особую форму (сингулярную кривую).
Арифметика эллиптических кривых
Для работы с ECC определены три базовые операции:

- Сложение точек. Если даны две точки
PиQ, то их суммаR=P+Qвычисляется по формулам, зависящим от положения точек на кривой. - Удвоение точки. Операция
P+Pаналогична сложению, но требует других формул. - Умножение точки на скаляр. Для вычисления
nGиспользуется метод двойного и добавочного шагов, аналогичный быстрому возведению в степень.
Эти операции являются основой криптографических протоколов на эллиптических кривых.
Применение ECC в криптографии
Криптосистемы на эллиптических кривых широко применяются в:
- протоколах обмена ключами (ECDH – Elliptic Curve Diffie-Hellman),
- цифровых подписях (ECDSA – Elliptic Curve Digital Signature Algorithm),
- шифровании данных (ECIES – Elliptic Curve Integrated Encryption Scheme).
Главное преимущество ECC перед классическими схемами (RSA, DSA) — это меньший размер ключа при аналогичном уровне безопасности. Например:
- ECC-256 даёт уровень безопасности, эквивалентный RSA-3072,
- ECC-384 эквивалентен RSA-7680.
Атаки на ECC
-
Атака Полларда «ро» на ECDLP
Одним из наиболее мощных методов нахождения
nявляется метод Полларда «ро», использующий принцип поиска коллизий. Этот метод позволяет решать ECDLP за времяO(√n), что значительно быстрее полного перебора.Алгоритм:
- создаётся случайное разбиение множества точек на эллиптической кривой,
- генерируются две последовательности точек,
X_iиX_j, с различными коэффициентамиaиb, определяющими их представление в видеX = aG + bQ, - вычисления выполняются до тех пор, пока не обнаружится коллизия
X_i = X_j, - используя полученные значения
aиb, восстанавливаетсяnс помощью модулярной арифметики.
Метод Полларда применяется при атаках на ECC Diffie-Hellman, цифровые подписи (ECDSA) и схемы аутентификации.
-
Атака на некорректные параметры (Invalid Curve Attack)
Некорректные параметры эллиптической кривой могут привести к ослаблению безопасности. В частности, если атакующий может заставить жертву использовать кривую с низким порядком, вычисление закрытого ключа становится тривиальной задачей.
Пример атаки:
- атакующий предлагает использовать заведомо слабую кривую с малым количеством точек,
- жертва выполняет операции с этой кривой, не проверяя её корректность,
- атакующий перебирает возможные закрытые ключи, поскольку их количество мало.
Такие атаки можно предотвратить проверкой параметров кривой и использованием только утверждённых стандартов (например, NIST P-256, Curve25519).
-
Атаки по сторонним каналам (Side-Channel Attacks)
Криптографические системы ECC могут быть уязвимы к атакам, использующим утечки информации через потребление энергии, время выполнения операций или электромагнитное излучение.
Примеры атак:
- атака по времени: анализ разницы времени выполнения сложения точек ECC позволяет восстановить закрытый ключ,
- атака по потреблению питания: измеряя колебания потребляемой энергии, можно определить операции скалярного умножения,
- электромагнитные атаки: регистрируя излучение устройства, можно извлечь информацию о ключах.
Противодействие таким атакам включает в себя использование константного времени вычислений, специальных защитных схем и аппаратных решений для экранирования.
Разбор задачи на криптографию эллиптических кривых
Эта задача связана с обменом ключами по эллиптической кривой (ECC Diffie-Hellman) и вычислением SHA1-хэша общего секрета.


Условие
- Эллиптическая кривая:
$$
E : y^2 \equiv x^3 + 497x + 1768 \mod 9739
$$
- Генераторная точка:
G = (1804, 5368). - Публичный ключ Алисы:
Q_A = (815, 3190). - Секретный ключ Боба:
n_B = 1829.
Необходимо вычислить общий секрет и взять SHA1-хэш от координаты x.
Полный код решения
from hashlib import sha1
def elliptic_addition(params, P, Q):
a, b, p = params
if P == (0, 0):
return Q
if Q == (0, 0):
return P
x1, y1 = P
x2, y2 = Q
if x1 == x2 and y1 == -y2:
return (0, 0)
if P == Q:
slope = ((3 * x1 ** 2 + a) * pow(2 * y1, -1, p)) % p
else:
slope = ((y2 - y1) * pow(x2 - x1, -1, p)) % p
x3 = (slope ** 2 - x1 - x2) % p
y3 = (slope * (x1 - x3) - y1) % p
return (x3, y3)
def scalar_multiplication(params, P, n):
result = (0, 0)
temp = P
while n:
if n & 1:
result = elliptic_addition(params, result, temp)
temp = elliptic_addition(params, temp, temp)
n >>= 1
return result
# Параметры кривой
a, b, p = 497, 1768, 9739
curve_params = (a, b, p)
# Заданные точки и скаляр
Q_A = (815, 3190)
n_B = 1829
shared_secret = str(scalar_multiplication(curve_params, Q_A, n_B)[0])
hash_obj = sha1()
hash_obj.update(shared_secret.encode())
hash_digest = hash_obj.hexdigest()
print(f"flag : crypto{{{hash_digest}}}")
Разбор кода
В данном коде реализован процесс нахождения общего секрета с использованием эллиптических кривых (ECC) и хэш-функции SHA1. Код выполняет три ключевых операции:
-
Сложение точек на эллиптической кривой (
elliptic_addition)- реализует сложение двух точек
PиQ, - использует разные формулы для сложения одинаковых и разных точек,
- обрабатывает случай, когда точки противоположны (результат — точка на бесконечности).
- реализует сложение двух точек
-
Умножение точки на число (
scalar_multiplication)- реализует метод двойного и добавочного шагов,
- умножает публичный ключ Алисы
Q_Aна секретный ключ Бобаn_B.
-
SHA1-хэширование полученного секрета
- берёт
x-координату общего секрета, - применяет SHA1 и выводит флаг.
- берёт
Запустив код, получаем флаг.

Заключение
Эллиптические кривые (ECC) являются мощным инструментом криптографии, обеспечивающим высокую безопасность при сравнительно небольших размерах ключей. Однако, как и любая криптографическая система, ECC не является полностью защищённой от атак.
Основная безопасность ECC основана на сложности задачи дискретного логарифма в группе точек эллиптической кривой (ECDLP). Однако существуют методы, которые могут значительно уменьшить сложность этой задачи, включая атаку Полларда "ро", атаку на некорректные параметры и атаки по сторонним каналам.
В рассмотренной задаче было продемонстрировано использование базовых операций ECC: сложение точек, удвоение и умножение точки на скаляр. В результате был вычислен общий секрет между двумя сторонами и получили SHA1-хэш от x-координаты точки общего секрета. Этот процесс иллюстрирует, как ECC может быть использована в криптографических протоколах, таких как ECDH (Elliptic Curve Diffie-Hellman).