Недавно я попытался воспроизвести результаты вопроса, который задал Руджеро и на который Самуэль Невес ответил здесь: Понимание Twist Security относительно коротких кривых Вейерштрасса
В моей попытке воспроизвести это я обнаружил, что атака не работает для некоторых точек. Первоначально я предполагал, что это произошло из-за твист-фактора. $д$ в моем случае не было $-1 \mod p$. Поэтому я задал этот вопрос: Недопустимая точечная атака на квадратичное скручивание эллиптической кривой, когда -1 является квадратичным вычетом. Однако по мере дальнейшего изучения мне стало ясно, что атака не работает не по этой причине. Вместо этого с помощью самого кода исходного ответа я также могу надежно продемонстрировать, что реальная реализация лестницы только для X работает для точек порядка 100+, но не работает (надежно) для точек более низкого порядка.
Я изменил сценарий Самуэля, чтобы детерминистически показать это поведение для точки порядка 7:
# Поля настройки
р = 2^127-1
d = -1 # не квадрат в поле
К = GF(p)
K2.<z> = GF(p^2)
# эта кривая имеет простой порядок, но 2^44-гладкий поворот
а = -3
б = 2045
E = Эллиптическая кривая (K, [a, b])
Et = эллиптическая кривая (K, [d ^ 2 * a, d ^ 3 * b])
E2 = Эллиптическая кривая (K2, [a, b])
# предварительно вычислить заказы
печать (E.order().factor());
печать (Et.order().factor());
печать (E2.order().factor());
# сгенерировать дискретный логарифм для решения
с = 123456789123456789123456789
P = E([0, 26743016104147931148362869907315104519])
Q = с * П
P_ = E2.lift_x(K(163965092228135290549051973720749297665))
факт = 7
P_ *= Et.order() // факт
печать (P_)
Q_ = s * P_ # запрос -- представьте, что это делается с помощью лестницы только для x
# решить лог прямо на E2
х1 = Р_[0]
печать("x1_p2", x1)
х2 = Q_[0]
s_ = E2.lift_x(x1).discrete_log(E2.lift_x(x2))
# сопоставить с Et (необязательно) и решить
х1 = д * Р_[0]
печать("x1_t", x1)
х2 = д * Q_[0]
s__ = Et.lift_x(x1).discrete_log(Et.lift_x(x2))
для результата в [153050600407045353908344231774077597412, 109343643823296263382915152331234715795]:
для x в [K(результат), K(результат) * d]:
для c в [Et, E2]:
пытаться:
P = c.lift_x (x)
кроме ValueError как e:
печать (е)
Продолжить
печать (P, P.order())
печать (s % факт)
print (s_, -s_ % fact) # либо то, либо другое
print (s__, -s__ % fact) # либо то, либо другое
Значения 15305... и 1093... - это те, которые дает реализация релейной схемы только для X при задании координат x1_p1
или же x1_t
.
Обратите внимание, что этот код и моя реализация лестницы только для X отлично работают для всех точек с порядком 73 или выше. Это просто не работает для заказов 3 или 7. Вот вывод скрипта:
170141183460469231713519983870624230867
3 * 7^2 * 73 * 207464639 * 4221589732069 * 18102941371909
3 * 7^2 * 73 * 207464639 * 4221589732069 * 18102941371909 * 170141183460469231713519983870624230867
(31638283026303721859929793126783073834 : 8180858091114185696092778095200036260*z + 4090429045557092848046389047600018130 : 1)
x1_p2 31638283026303721859929793126783073834
x1_t 138502900434165509871757510589101031893
No point with x-coordinate 153050600407045353908344231774077597412 on Elliptic Curve defined by y^2 = x^3 + 170141183460469231731687303715884105724*x + 170141183460469231731687303715884103682 over Finite Field of size 170141183460469231731687303715884105727
(153050600407045353908344231774077597412 : 120638375417041763806996747829917991029*z + 145389779438755497769342025772901048378 : 1) 56713727820156410583284874520381326863
(17090583053423877823343071941806508315 : 41244633631159509998704366741778119200 : 1) 56713727820156410583284874520381326863
(17090583053423877823343071941806508315 : 28961826547573943769330362324255518848 : 1) 170141183460469231713519983870624230867
No point with x-coordinate 109343643823296263382915152331234715795 on Elliptic Curve defined by y^2 = x^3 + 170141183460469231731687303715884105724*x + 170141183460469231731687303715884103682 over Finite Field of size 170141183460469231731687303715884105727
(109343643823296263382915152331234715795 : 127120934962706688155967022405858199927 : 1) 170141183460469231713519983870624230867
No point with x-coordinate 60797539637172968348772151384649389932 on Elliptic Curve defined by y^2 = x^3 + 170141183460469231731687303715884105724*x + 170141183460469231731687303715884103682 over Finite Field of size 170141183460469231731687303715884105727
(60797539637172968348772151384649389932 : 17145369941110587676988010143957064222 : 1) 170141183460469231713519983870624230867
1
1 6
1 6
Почему эта атака работает в теории (поскольку умножение Q_ = с * P_
моделирует), но работает на практике только для точек достаточно высокого порядка?