В данной статье речь пойдёт о протоколах выработки ЭЦП на базе схемы Шнорра и их безопасности. Так что если какие-то из этих слов звучат для вас скорее как ругательства, то лучше предварительно ознакомиться с данными понятиями. Также следует морально подготовиться к обилию математических выкладок. Если же вы готовы, приятного чтения.
Долгое время, схемы выработки ЭЦП, для которых была доказана безопасность в схеме ROM, считались надёжными, однако всё изменилось после публикации атаки на основе решения задачи ROS. В основе этой атаки лежит принцип параллельного выполнения, при котором противник может получить преимущество в подделке подписи, открывая множество сеансов параллельно.
Но сперва про задачу ROS.
Постановка задачи ROS
По заданным простому числу и параметру стойкости
требуется найти
такие, что:
, где
– некоторая хэш-функция,
– скалярное произведение векторов. Также задачу можно переформулировать в матричном виде
Редукция ROS к обобщённой атаке дней рождений
Для начала заметим, что для любого выполняется:
После такой подстановки вся сложность решения задачи ROS будет заключаться в поиске нетривиальной линейной комбинации, лежащей в прообразе функции хэширования . Нетрудно заметить, что эта задача напоминает известную атаку дней рождений Вагнера.
Обобщённая атака дней рождений работает следующим образом. Пусть имеется списков
, заполненных случайными значениями нормализованной функции хэширования
. Тогда алгоритм Вагнера позволяет за субэкспоненциальное время найти такие
, что
Применительно к нашей задаче, будем заполнять значениями
, где
(на месте с номером
стоит
). Тогда решением задачи будет
Решение за полиномиальное время
Теорема 1. Если размер задачи log
, то существует полиномиальный алгоритм решения задачи ROS.
Доказательство. Введём следующее обозначение: для многочлена обозначим
вектор, содержащий на
-ой позиции коэффициент при
, то есть
Заметим, что свободный член не включен.
Наша цель найти и
) такие, что
, а
- некоторая функция хеширования.
Определим
Тогда положим , для
и
. Если существует
такое, что
, то мы нашли решение ROS
и
. И правда
Теперь предположим, что
, тогда можем построить следующий многочлен
Этот многочлен неспроста напоминает интерполяционный, можно заметить, что , а
.
Построим ещё один многочлен
Любой элемент поля
можно представить в бинарном виде:
, используя введённые ранее обозначения продолжим равенство
В качестве можно взять любой элемент поля
, а значит и
, тогда
Таким образом решением задачи ROS будут векторы и
.
Замечание. Стоит заметить, что данное доказательство является конструктивным, т.е. является описанием алгоритма построения задачи ROS.
Пример
Пусть ,
= sha256. Найденное решение
Если у кого-то есть желание поэкспериментировать, то вот мой код. В целом, он просто повторяет описанный в теореме алгоритм.
import hashlib p = 251 l = 8 def hash_vector(vec): s = ','.join(str(x) for x in vec) h = hashlib.sha256(s.encode()).digest() val = int.from_bytes(h, 'big') % p return val rho0 = [] rho1 = [] for i in range(l): vec0 = [0]*l vec0[i] = 1 rho0.append(vec0) vec1 = [0]*l vec1[i] = 2 rho1.append(vec1) h0 = [hash_vector(v) for v in rho0] h1 = [hash_vector(v) for v in rho1] inv2 = pow(2, -1, p) c0 = h0[:] c1 = [(h1[i] * inv2) % p for i in range(l)] solution_found = False for i in range(l): if c0[i] == c1[i]: for j in range(l): print(rho0[j]) print(rho1[i]) print("c =", c0) solution_found = True break if not solution_found: diff = [(c1[i] - c0[i]) % p for i in range(l)] alpha = [0]*l alpha0 = 0 pow2 = 1 for i in range(l): factor = (pow2 * pow(diff[i], -1, p)) % p alpha[i] = factor alpha0 = (alpha0 - pow2 * c0[i] * pow(diff[i], -1, p)) % p pow2 = (pow2 * 2) % p h_alpha = hash_vector(alpha) n = (h_alpha + alpha0) % p bits = [] temp = n for _ in range(l): bits.append(temp & 1) temp >>= 1 rho_solution = [] c_solution = [] for i in range(l): if bits[i] == 0: rho_solution.append(rho0[i]) c_solution.append(c0[i]) else: rho_solution.append(rho1[i]) c_solution.append(c1[i]) rho_solution.append(alpha) for idx, vec in enumerate(rho_solution[:-1]): print(vec) print(alpha) print("c =", c_solution)
Последние модификации
Чем меньше знаков в двоичном представлении , тем быстрее будет решаться задача ROS, но противник не может повлиять на выбор
, так что в статье 2025 года было предложено для уменьшения числа знаков в ходе атаки рассмотреть вместо бинарного представления числа тернарное, более того, оказывается, эту идею можно адаптировать для системы с произвольным основанием. Но метод решения уже становиться итерационным и вероятностным, а мы переносимся из конечных полей на решётки. Выкладки становятся ещё более пугающими, чем раньше, так что останавливаться на них не будем кого заинтересовало, читайте Baccarini A. Revisiting the ROS Problem: Improved Attacks and New Trade-offs / A. Baccarini, G. Malavolta, R. Parisella // Cryptology ePrint Archive, Report 2025/306. — 2025.
Атака на слепую подпись Шнорра

Сценарий атаки
Противник открывает
log
параллельных сессий.
Сервер возвращает
точек
.
Для
, противник случайным образом выбирает
, и определяет
(для
). Пусть
для
и
.
Предположим, что
, иначе решение найдено, см. доказательство теоремы 1. Определим многочлен
:
Напомним, что из теоремы 1 следует, что вышеуказанный многочлен таков, что для любого
,
(5).
Пусть
(постоянный член
не включен).
Определим
и рассмотрим бинарное разложение
:
Пусть
. Завершим открытые сессии
с помощью
: ответим на
-ю открытую сессию с помощью
, для
.
Противник получает ответы
и определяет
Противник приступает к раскрытию подлинных подписей
путем вычисления:
.
Противник выдает
подделок
, определяемых как:
На самом деле атака применима не только к протоколам слепой подписи. Такие же рассуждения можно проделывать и для пороговых подписей, например, первые версии протокола FROST были также ей подвержены.
Надеюсь вышеизложенный материал был кому-то полезен, а вот и список литературы.
Литература
Wagner D. A Generalized Birthday Problem / D. Wagner // Advances in Cryptology – CRYPTO 2002 (LNCS 2442). — 2002. — P. 288–304.
Benhamouda F. The ROS Problem Revisited: Improved Attacks and Consequences / F. Benhamouda, T. Lepoint, J. Loss, M. Orr`u, M. Raykova // Cryptology ePrint Archive, Report 2020/945. — 2020.
Baccarini A. Revisiting the ROS Problem: Improved Attacks and New Trade-offs / A. Baccarini, G. Malavolta, R. Parisella // Cryptology ePrint Archive, Report 2025/306. — 2025.
Schnorr C.-P. Security of Blind Discrete Log Signatures Against Interactive Attacks / C.-P. Schnorr // Information and Communications Security (ICICS 2001) (LNCS 2229). — 2001. — P. 1–12.
Komlo C. FROST: Flexible Round-Optimized Schnorr Threshold Signatures / C. Komlo, I. Goldberg // Cryptology ePrint Archive, Report 2020/852. — 2020.
