Рейтинг:2

Недопустимая точечная атака на квадратичное скручивание эллиптической кривой, когда -1 является квадратичным вычетом

флаг ma

Я воспроизвел недопустимую точечную атаку на ECC, используя короткие кривые Вейерштрасса. Для этого я написал «глупую» реализацию, которая не проверяет, находятся ли точки на кривой, прежде чем перейти к скалярному умножению. Для плана атаки я в значительной степени заимствовал превосходное описание Самуэля Невеса, которое он дал здесь: Понимание Twist Security относительно коротких кривых Вейерштрасса

Я могу воспроизвести это без каких-либо проблем, когда $д = -1$ является квадратичным невычетом в $\mathbb{F}_p$, то все работает "из коробки". Однако, когда $р$ так что $-1$ является квадратичным вычетом, и поэтому мне нужно выбрать другое значение для $д$, все разваливается.

Для простоты в первом запуске я не использую кривые в $\mathbb{F}_{p^2}$ потому что для малого $р$ исчерпывающее перечисление для нахождения младших точек не является проблемой.

В качестве примера, скажем, моя кривая определена $\mathbb{F}_{101}$; здесь, $-1$ является квадратичным модом остатка $р$, поскольку $10 \cdot 10 = -1 \mod 101$. Моя кривая дается

$Е: у^2 = х^3 + 13х + 29$

И с $д = 2$, квадратичный невычет по модулю 101,

$E^d: у^2 = х^3 + 52х + 30$

Получатель чего-то $E^d$ является 111$ = 3\cdot 37$. Я выбрал две точки на $E^d$ которые имеют заказы 3 и 37 соответственно:

$P_1 = (28, 62)$

$P_2 = (8, 7)$

Когда я запускаю эти значения через скалярное умножение без проверки точки (для закрытого ключа $ д = 58 $, я получаю следующий вывод:

$S_1 = (94, 53)$

$S_2 = (32, 14)$

Ни один $S_1$ ни $S_2$ является точкой на квадратичном повороте $E^d$. Я могу поднять любую координату X в $E^d$, но тогда порядок точек неправильный.

Вот мой пример кода:

Fp = GF(101)
Д = Fp(2)
    
print(D, "является квадратным?", D.is_square())
(а, б) = (13, 29)

E = Эллиптическая кривая (Fp, [a, b])
Et = EllipticCurve(Fp, [a*D^2, b*D^3])

print("Et.order()", фактор(Et.order())))

очки атаки = [
    Et(28, 62),
    Ет(8, 7),
]
печать (Е)
печать(и)
для P в Attack_points:
    печать (P, P.order())

# закрытый ключ d = 58
mul_results = [ 
    Et(94, 53), 
    Ет(32, 14), 
]
#print(Et.lift_x(94).order())
#print(Et.lift_x(32).order())

Что выводит:

2 квадрат? ЛОЖЬ
Эт.заказ() 3 * 37
Эллиптическая кривая, определяемая y^2 = x^3 + 13*x + 29 над конечным полем размером 101
Эллиптическая кривая, определяемая y ^ 2 = x ^ 3 + 52 * x + 30 над конечным полем размером 101
(28 : 62 : 1) 3
(8 : 7 : 1) 37
Ошибка типа: координаты [94, 53, 1] не определяют точку на эллиптической кривой, определяемую y^2 = x^3 + 52*x + 30 над конечным полем размером 101

Как я могу выполнить эту атаку для квадратичного поворота, где $d \neq -1$?

kelalaka avatar
флаг in
Это может быть не ваша проблема. Исходный код также больше не работает на SageMath. Высоко, вероятно, есть изменение в библиотеке, которое предотвращает такие вычисления...
флаг ma
У меня недостаточно репутации, чтобы комментировать в другом посте, но решение Neves работает, просто не из коробки: операторы печати нуждаются в скобках, а вызовы .lift_x(randint(...)) необходимо заменить. by .lift_x(K(randint(...))), то все работает как по маслу. Я мог бы идеально воспроизвести это с d = -1, но, как я написал, -1 является квадратичным остатком в некоторых полях (например, GF (101), как показано здесь).
kelalaka avatar
флаг in
Я изменил ответ, не могли бы вы также проверить это?
флаг ma
Спасибо, код теперь работает, но по-прежнему не отвечает на мой вопрос (т. Е. Он явно использует d = -1) - есть идеи, как заставить его работать с другим d?
kelalaka avatar
флаг in
Да, я знаю. Алгебраическая геометрия (эллиптические кривые являются ее частью) должна быть сделана на алгебраическом замыкании. Ответ Самуэля Невеса, как видите, работает на закрытии, а вы нет.
kelalaka avatar
флаг in
См. документ Curve25519 об атаке малых подгрупп.
флаг kr
Я предполагаю, что с d!=-1 вам нужно преобразовать свою точку из $E$ и $E^{d}$, и вы не можете просто использовать простую координату x. Было бы полезно, если бы вы могли опубликовать мудрый скрипт для своего скалярного умножения, поскольку использование $y$ меня смущает, почему бы не сделать атаку с недопустимой кривой (не беспокоясь о повороте)?
флаг ma
@kelalaka Пример, который я привожу здесь, предназначен только для простоты - он работает с полем квадратичного расширения, но это также не работает для d != -1, если вы измените его сценарий, чтобы использовать другие параметры домена. То есть, я боюсь, что это не основная причина проблемы. Я просто опустил его здесь для краткости, чтобы иметь минимальный пример, демонстрирующий проблему.
флаг ma
@Ruggero Я проглядел твой ответ. Да, я считаю, что требуется некоторое преобразование, но я не могу понять, как это сделать: перед тем, как поместить его в качестве входа в лестницу или после выхода из лестницы (или, возможно, и то, и другое). Некоторое преобразование определенно необходимо, а также обратите внимание, что -1 ^ 2 = 1, т.е. если бы была умножена/делена четная степень, мы бы никогда не узнали в случае d = -1. Ваше замечание о лестнице только для X верно. В своем отчаянии я перепробовал все: простой mul-and-add (работает и для d=-1!), X-ладдер Brier/Joye и аддитивные X-only ладдеры. Все они вычисляют правильно, поэтому я точно не понимаю преобразование.
Рейтинг:0
флаг ma

Проблема не в том, что d является QNR, отличным от -1.

Вместо этого это проблема малых модулей. Я могу надежно продемонстрировать это, используя модифицированный сценарий Самуэля Невеса: Неверная точечная атака дает неправильные результаты для точек низкого порядка

это вообще не ответ Почему это не работает, но, по крайней мере, это демонстрирует, что $d \neq -1$ не является основной причиной моей проблемы.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.