Протокол Шнорра: схема доказательства знания и подпись

Протокол Шнорра - это интерактивная схема, в которой одна сторона (доказывающий) убеждает другую (проверяющего) в том, что знает секрет - дискретный логарифм публичного значения , - ни на бит не раскрывая сам секрет. Это канонический пример доказательства с нулевым разглашением и одновременно основа целого семейства цифровых подписей: убрав интерактивность приёмом Фиата - Шамира, из протокола получают компактную подпись Шнорра, которая лежит в основе EdDSA и обновления Bitcoin Taproot. В этой статье разберём тройку обязательство - вызов - ответ, уравнение проверки, три свойства протокола (полнота, корректность, нулевое разглашение) и переход к неинтерактивной подписи. Чтобы пройти раунд по шагам с конкретными числами, воспользуйтесь конструктором ниже.
Что доказывает протокол Шнорра
Зафиксируем циклическую группу порядка с генератором - обычно это подгруппа простого порядка в или группа точек эллиптической кривой. Доказывающий знает секретный ключ , а публичным является . Перейти от к легко, а восстановить по - это задача дискретного логарифма, для которой в правильно выбранной группе не известно эффективного алгоритма. Именно на этой односторонности держится вся конструкция.
Задача протокола - убедить проверяющего, что доказывающий действительно знает , не передавая ни , ни даже частичной информации о нём. Это сильнее, чем просто «знать пароль и показать его»: проверяющий после диалога не сможет ни сам выдать себя за доказывающего, ни убедить кого-то третьего. Похожая идея односторонней функции и пары ключей лежит и в основе цифровой подписи ECDSA, но там схема сразу неинтерактивна, тогда как Шнорр начинается с честного диалога из трёх сообщений.
Тройка обязательство - вызов - ответ
Один раунд протокола Шнорра - это три сообщения между доказывающим (П) и проверяющим (В). Их традиционно обозначают и называют обязательством, вызовом и ответом.
- Обязательство. Доказывающий выбирает случайный одноразовый секрет (его называют нонсом или маскирующим), вычисляет и отправляет проверяющему. Это «заявка», которую нельзя будет изменить задним числом.
- Вызов. Проверяющий выбирает случайный вызов из множества допустимых значений и отправляет его доказывающему.
- Ответ. Доказывающий вычисляет и отправляет . В этом ответе секрет присутствует, но он спрятан под слагаемым , которое проверяющий не знает.

Вся соль в том, что - свежий случайный для каждого раунда. Без него ответ был бы просто функцией от , и секрет можно было бы извлечь. С ним выглядит для проверяющего как равномерно случайное число.
Уравнение проверки
Получив тройку , проверяющий принимает решение по единственному равенству:
Если оно выполняется, проверка пройдена. Почему это работает, видно из прямой подстановки. У честного доказывающего , поэтому
Равенство - тождество, значит честный доказывающий всегда проходит проверку. Это свойство называют полнотой (completeness): кто знает , тот гарантированно убеждает проверяющего. Заметьте, что проверяющему для расчёта нужны только публичные , и пришедшие , , - секрет в проверку не входит.
Почему секрет не раскрывается
Главное обещание протокола - нулевое разглашение (zero-knowledge): из диалога проверяющий не узнаёт об ничего, чего не мог бы вычислить сам. Формально это доказывают через симулятор: можно сгенерировать тройку с тем же распределением, что у настоящего диалога, вообще не зная . Достаточно выбрать случайные и , а затем положить - такая тройка пройдёт проверку и неотличима от честной. Раз поддельный протокол с правильным распределением строится без секрета, значит настоящий протокол секрета и не выдаёт.

Здесь важно условие честного проверяющего: он выбирает независимо от . Если бы проверяющий мог подсмотреть и хитро подобрать , схема в базовом виде уже не была бы строго нулевого разглашения - для общего случая нужны дополнительные приёмы. В учебных задачах почти всегда подразумевают честно-проверяющую модель.
Корректность: почему нельзя обмануть
Симметричное свойство - корректность (soundness, особая корректность): жулик, не знающий , не сможет систематически проходить проверку. Доказывают это так. Предположим, доказывающий с одним и тем же обязательством сумел ответить на два разных вызова корректными ответами и . Тогда
Поделив одно на другое, получаем , откуда
То есть любой, кто отвечает на два вызова при одном , тем самым вычисляет секрет . Раз вычислить дискретный логарифм нельзя, нельзя и отвечать на два вызова, - значит, на случайный единственный вызов жулик угадывает ответ лишь с пренебрежимо малой вероятностью. Этот же приём «извлечения секрета из двух ответов» дословно повторяет логику атаки на повтор нонса в алгоритме обмена ключами Диффи - Хеллмана и в ECDSA.
От диалога к подписи: эвристика Фиата - Шамира
Интерактивность неудобна: подписать файл «один раз для всех» в диалоге нельзя. Приём Фиата - Шамира убирает проверяющего, заменяя его случайный вызов на хэш. Доказывающий сам вычисляет
где - подписываемое сообщение, а - криптографическая хэш-функция. Поскольку зависит от непредсказуемым образом, доказывающий не может заранее подогнать под удобный - хэш играет роль честного проверяющего. Подпись Шнорра - это пара или , а проверка остаётся той же: пересчитать и убедиться, что .
Именно так из учебного протокола вырастает практичная подпись: компактная, с простым и линейным уравнением, поддающаяся агрегации нескольких подписей в одну. Поэтому Шнорр выбрали для EdDSA (Ed25519) и для Bitcoin Taproot.
Частые ошибки
- Повтор нонса . Если переиспользовать одно для двух подписей, по двум ответам мгновенно вычисляется - ровно как в доказательстве корректности. Нонс обязан быть свежим и непредсказуемым для каждого раунда.
- Путать порядок группы и модуль . Степени и считают по модулю , а показатели - по модулю (порядка генератора). Смешение модулей - самая частая арифметическая ошибка в задачах.
- Считать, что что-то выдаёт об . Слагаемое маскирует секрет: при честном случайном ответ распределён равномерно и сам по себе об не говорит ничего.
- Забывать про честно-проверяющую модель. Нулевое разглашение базового протокола доказано для проверяющего, который выбирает независимо от ; это условие нужно явно оговаривать.
- Брать вызов из слишком маленького множества. Если вызовов всего несколько, жулик угадывает ответ с заметной вероятностью; стойкость требует большого пространства вызовов.
FAQ
Чем протокол Шнорра отличается от подписи Шнорра? Протокол - это интерактивный диалог из трёх сообщений (обязательство, вызов, ответ), доказывающий знание дискретного логарифма. Подпись Шнорра получается из него приёмом Фиата - Шамира: вызов заменяют на хэш , и диалог сворачивается в неинтерактивную пару чисел.
Почему протокол Шнорра считают доказательством с нулевым разглашением? Потому что существует симулятор, который строит тройку с тем же распределением, что и настоящий диалог, не зная секрета (выбирает и кладёт ). Раз правдоподобный протокол собирается без секрета, настоящий диалог секрета не выдаёт.
Где протокол Шнорра применяется на практике? Его неинтерактивная форма - подпись Шнорра - лежит в основе схемы EdDSA (Ed25519) и обновления Bitcoin Taproot, где ценят компактность подписи, простое линейное уравнение проверки и возможность агрегировать несколько подписей в одну.
Коротко
Протокол Шнорра доказывает знание дискретного логарифма публичного через диалог обязательство - вызов - ответ с проверкой . Он полон (честный всегда проходит), корректен (ответ на два вызова при одном обязательстве выдаёт секрет, значит обмануть нельзя) и нулевого разглашения (тройку подделывает симулятор без секрета). Заменив случайный вызов на хэш по Фиату - Шамиру, из протокола получают компактную подпись Шнорра - основу EdDSA и Bitcoin Taproot.
Читайте также

Схема Эль-Гамаля: шифрование на дискретном логарифме
Схема Эль-Гамаля простыми словами: как работает асимметричное шифрование на дискретном логарифме, генерация ключей, формулы шифрования и расшифровки, пример с числами и цифровая подпись.

Схема подписи Эль-Гамаля: формулы и проверка подписи
Схема подписи Эль-Гамаля простыми словами: генерация ключей, формулы подписи и проверки, роль секретного k, связь с задачей дискретного логарифма и отличие от RSA и DSA.

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