Рейтинг:2

Вопрос о коэффициенте ECDSA при решетчатой ​​атаке

флаг in
jin

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

Недавно я изучал решетчатую атаку. Я пытался использовать данные из TPM-FAIL чтобы помочь мне понять эту атаку и попытаться реализовать атаку, используя «метод учебника» (в сценариях атаки TPM-FAIL есть некоторая оптимизация). У меня возникли некоторые вопросы по прочтению материалов, в которых я не смог разобраться сам. Пожалуйста, помогите мне, если у вас есть идеи.

  1. Формула подписи DSA, наконец, может быть преобразована в следующую уравнение:

    $k_i-s_i^{-1}r_id-s_i^{-1}H(m)\equiv 0 \pmod{n}$

    где k — эфемерный ключ, (r, s,) — пара подписей, d — закрытый ключ, H(m) - это дайджест сообщения, как обычно... вы знаете, как это делается.
    Затем это можно преобразовать в решетчатую форму. Что-то вроде следующего уравнение:

    $k_i+A_id+B_i\экв 0\pmod n$, куда $A_i=-s_i^{-1}r_i$ и $B_i=-s_i^{-1}H(м)$

    Чего я не понимаю, так это почему он должен быть отрицательным? фактически пытался изменить сценарий атаки, указанный в TPM-FAIL. набор данных и обнаружил, что удаление -1 в A_i и B_i сделает атаку неуспешный. Но мы можем переписать первое уравнение так:

    $s_i^{-1}r_id+s_i^{-1}H(m)\equiv k_i\pmod{n}$

    Концепция атаки по решетке должна оставаться в силе: если решетка вектор мал, алгоритм редукции базиса должен генерировать ответ. Что я сделал не так?

  2. Во-вторых, я пытался использовать неоптимизированный подход, решетка SVP построена, как показано ниже:

$\begin{bmatrix}n&&&&&\&n&&&&&\&&\ddots&&&\&&&n&&\A_1&A_2&\dots&A_t&K/n&\ B_1&B_2&\dots&B_t&&K\end{bmatrix}$

Но мы ясно видим, что K/n будет дробным числом, которое не может использовать метод BKZ() или LLL() в sagemath. Я понимаю, что мы можем умножить все в этой матрице на n, чтобы все в этой матрице было целым числом. После применения BKZ() мы делим все на n, чтобы восстановить исходный результат: закрытый ключ должен находиться в предпоследнем столбце первой строки. Однако мне не удалось восстановить закрытый ключ. Даже если бы я использовал 100 подписей с 8-битными утечками. Верен ли мой подход?

Спасибо за вашу помощь заранее!

fgrieu avatar
флаг ng
Когда вы пишете «почему оно должно быть отрицательным?», вы спрашиваете, что
флаг cn
Может ли быть так, что перестановка знаков A и B делает атаку неудачной, поскольку оптимизация центрирования предполагает отрицательные знаки и делает атаку хуже для вашего выбора знаков? Кстати, хороший туториал по решетчатым атакам вы найдете [здесь](https://ia.cr/2020/1506).
флаг in
jin
@j.p. Можно, но на первый взгляд разницы не увидел. Я постараюсь сделать расчет самостоятельно и уточнить вопрос.
флаг cn
@jin: Не могли бы вы опубликовать свое обновление в качестве ответа и принять его, чтобы система пометила ваш вопрос как «решенный»? Заранее спасибо!
Maarten Bodewes avatar
флаг in
Жду твоего ответа с нетерпением, Джин!
Рейтинг:2
флаг in
jin
  1. Короткий ответ: в этой идее нет ничего плохого. Основная причина, по которой я не провел успешную атаку после смены знака, заключается в том, что в документе TPM-FAIL была оптимизация. Он устраняет первую подпись путем некоторого преобразования. Это может уменьшить размер решетки на 1, что немного увеличит скорость вычислений. Результатом преобразования является то, что для $B_i$ два термина вместо одного. Я изменил знак только для одного члена, поэтому атака не удалась.

    Кстати, хочу еще отметить, что в какой-то статье это уравнение преобразовано в ЗВП (задачу ближайших векторов), которая имеет вид $|\alpha \mathbf{t}-\mathbf{u}|_q < K$. Поэтому в этом случае $A_i=\mathbf{t}=s_i^{-1}r_i$ и $B_i=\mathbf{u}=-s_i^{-1}H(м)$

    Во-вторых, было опасение, что знак может повлиять на повторную настройку. Я действительно не видел, как это применялось в методе TPM-FAIL. В конце концов я использовал другую конструкцию решетки, поэтому остановил свои исследования на ней.

  2. Окончательная решетка, которую я выбрал, немного отличается от этой. Он основан на этом уравнении:

    $ |ds_i^{-1}r_i - (-s_i^{-1}H(m))|_n = k_i < n/2^l$

    Мы можем построить решетку после того, как избавимся от операции мода:

    $ d|s_i^{-1}r_i|_n - |(-s_i^{-1}H(m))|_n + C_i n=k_i < n/2^l$

    Чтобы решетчатая атака работала, нам нужно только $|к|$ быть маленьким и как $к$ всегда положительно, мы можем применить центрирование:

    $ d|s_i^{-1}r_i|_n - |(-s_i^{-1}H(m))|_n + C_i n - n/2^{l+1} =k_i - n/2^{ л+1}$ куда $ -n/2^{l+1} < k_i - n/2^{l+1} < n/2^{l+1}$

    Чтобы гарантировать, что каждый элемент в решетке является целым числом, чтобы мы могли применить LLL или BKZ, обычно мы делаем это, умножая обе части на $2^{л+1}$

    $ d[2^{l+1}\times |s_i^{-1}r_i|_n] - [2^{l+1}\times |(-s_i^{-1}H(m))|_n + n] + C_i\times 2^{l+1}n =k_i - n/2^{l+1}$

    Первая квадратная скобка будет $A_i$ а второй будет $B_i$. Обратите внимание, что центрирующий термин объединен с $B_i$ поэтому происходит смена знака.

    Есть несколько вещей, которые необходимо указать:

    • Мы должны быть осторожны, чтобы умножение $2^{л+1}$ и $|s_i^{-1}r_i|_n$ нормальное умножение, а не модульное. В sagemath, если вы пишете

      а = Mod(s_inv * r, n)  
      с = а * б
      

      Вторая строка также станет модульным умножением. Чтобы сделать его нормальным, нам нужно написать

      а = Mod(s_inv * r, n)  
      с = а.подъем () * б
      
    • Правильный ответ не обязательно находится в первой строке. В зависимости от числа и алгоритма ответ может появиться во второй или предпоследней строке. Поэтому лучше всего проверять соответствующий столбец в каждой строке, чтобы увидеть, есть ли правильный ответ.

    • В результате повторного центрирования результат может быть не положительным. Иногда это может быть $n-d \pmod n$. Итак, для каждой строки нам нужно проверить оба Mod(ответ, п) и n- Mod(ответ,n)

      для строки в диапазоне (решетка.nrows()):
          # номер столбца зависит от того, как вы строите решетку, в обычном SVP с техникой встраивания kanaan соответствующий столбец является предпоследним
          решение = Мод (решетка [строка, -2], по модулю). Лифт () 
          если check_answer(решение):
              возврат решения
          если check_answer (по модулю - решение):
              возврат по модулю - решение
      

    Если все это обработано правильно, у вас должна быть успешная атака.

Рейтинг:0
флаг ng

О первом вопросительном предложении вопроса:

почему он должен быть отрицательным?

читать буквально и с "it" относительно количества $A_i$ и $B_i$.

Второй набор уравнений действительно является (или может быть изменен) $k_i+{A_i}\,d+B_i\equiv0\pmod n$ куда $A_i=-s_i^{-1}\,r_i\bmod n$ и $B_i=-s_i^{-1}\,H(m)\bmod n$. $\bмод п$ подразумеваются. Поэтому в этом $A_i$ и $B_i$ неотрицательны.

Это по определению $\bmod$ оператор:

  • $х\bмод п$ это $z$ в диапазоне $[0,n)$ с $ х \ эквив г \ pmod n $.
  • $x^{-1}\bmod n$ это $z$ в диапазоне $[0,n)$ с $x\,z\equiv1\pmod n$
  • $-x^{-1}\,y\bmod n$ это $z$ в диапазоне $[0,n)$ с $x\,z\equiv-y\pmod n$

Напомним, что $ х \ эквив г \ pmod n $ определяется как означающее, что $x-z$ является кратным $n$.


Мы можем переписать первое уравнение как $s_i^{-1}\,r_i+s_i^{-1}\,H(m)\equiv k_i\pmod n$. Концепция атаки на решетку должна оставаться в силе: если вектор решетки мал, алгоритм сокращения базиса должен генерировать ответ. Что я сделал не так?

Я смутно предполагаю, что проблема в том, что используемый код сокращения решетки требует ввода в матричной форме. Мы можем сопоставить это, переписав уравнение как $s_i^{-1}\,r_i+s_i^{-1}\,H(m)+k'_i\equiv 0\pmod n$ с $k'_i=n-k_i$. Но помните, что атака вращается вокруг возможности выбора с помощью атаки по времени $я$ такой, что $k_i$ маленький. Тот же метод отбора не даст малых $k'_i$; и я не уверен, что подходящий метод вообще возможен.

флаг in
jin
Спасибо за ваш ответ. Я думаю, может быть, я неправильно понял закон работы мода? Мы не можем преобразовать 1-й набор уравнений напрямую в 3-й набор уравнений, как обычное уравнение. Это ошибка, которую я сделал?
fgrieu avatar
флаг ng
@jin: когда вы спрашиваете "почему это должно быть отрицательным?" вы спрашиваете, почему $A_i$ и $B_i$ должны быть отрицательными, что и пытается решить мой ответ; или почему минус?
флаг in
jin
Думаю, я недостаточно ясно изложил этот вопрос. Я очень сожалею об этом. Мой фактический вопрос заключается в том, что первое уравнение также может быть преобразовано в третье уравнение, которое нам не нужно умножать на -1 при построении решетки. Я должен изменить свой вопрос

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

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