Доказательство с нулевым разглашением: как это работает

Доказательство с нулевым разглашением (zero-knowledge proof, ZKP) - это криптографический протокол, в котором одна сторона (доказывающий) убеждает другую (проверяющего) в истинности утверждения, не раскрывая при этом никакой информации, кроме самого факта истинности. Идею в 1985 году предложили Голдвассер, Микали и Ракофф; за неё Голдвассер и Микали позже получили премию Тьюринга. На практике концепция лежит в основе анонимных платёжных систем, протоколов аутентификации и масштабирования блокчейнов. В этой статье разбираем формальное определение, три обязательных свойства, классический протокол и характерные ошибки, которые студенты допускают на коллоквиумах по криптографии.
Что такое доказательство с нулевым разглашением
Формально доказательство с нулевым разглашением строится вокруг языка - множества утверждений, которые «истинны». Доказывающий (Prover) знает секрет - свидетеля (witness) для утверждения . Проверяющий (Verifier) хочет удостовериться, что , но не должен узнать и вообще ничего, что нельзя было бы вычислить самостоятельно.
Классическая иллюстрация - «пещера Али-Бабы». Кольцевая пещера имеет два прохода (A и B), соединённых дверью, открываемой секретным словом. Доказывающий заходит в один из проходов, проверяющий кричит, из какого прохода тот должен выйти. Если доказывающий знает слово, он всегда выходит из нужного; если не знает - угадывает с вероятностью . Повторив раунд раз, мы загоняем вероятность обмана до , при этом проверяющий ни разу не услышал само секретное слово.
Чтобы перейти от метафоры к рабочему протоколу аутентификации, удобно собрать конкретный сценарий и посмотреть, как раскладываются роли и сообщения. Воспользуйтесь конструктором ниже.
Три свойства: полнота, корректность, нулевое разглашение
Протокол считается доказательством с нулевым разглашением, только если выполнены три свойства одновременно.
Полнота (completeness). Если утверждение истинно и обе стороны честны, проверяющий принимает доказательство с подавляющей вероятностью. Формально: для
Корректность (soundness). Если утверждение ложно (), то никакой, даже жульничающий, доказывающий не убедит честного проверяющего, кроме как с пренебрежимо малой вероятностью:
Нулевое разглашение (zero-knowledge). Существует эффективный симулятор , который без доступа к свидетелю порождает протокольную выписку (transcript), статистически неотличимую от настоящей. Если такая выписка генерируется без секрета, значит, проверяющий не узнаёт из неё ничего нового - он мог бы получить то же самое сам. Это и есть формальный смысл фразы «никакой информации не раскрывается».
Различают три силы свойства нулевого разглашения: совершенное (распределения совпадают точно), статистическое (статистическое расстояние пренебрежимо мало) и вычислительное (распределения неотличимы для любого полиномиального алгоритма). Большинство практичных схем - вычислительные, поскольку опираются на предположения о сложности, например на трудность дискретного логарифма.
Интерактивный протокол: commitment - challenge - response
Канонический интерактивный ZKP состоит из трёх сообщений и называется -протоколом:
- Commitment (): доказывающий посылает обязательство, фиксируя случайность, но не раскрывая секрет.
- Challenge (): проверяющий шлёт случайный вызов.
- Response (): доказывающий отвечает так, что ответ проходит проверку только при знании свидетеля.
Рассмотрим протокол Шнорра для доказательства знания дискретного логарифма. Пусть - генератор группы порядка , открытый ключ , секрет - показатель . Доказывающий:
- Выбирает случайное , отправляет .
- Получает вызов .
- Отправляет .
Проверяющий принимает, если . Подстановка показывает полноту: . Корректность доказывается через извлекатель (extractor): из двух принятых выписок с одним , но разными восстанавливается . Нулевое разглашение - симулятор выбирает и заранее и вычисляет , получая корректную выписку без знания .
Протокол Фиаге-Фиата-Шамира
Историчеcки первый практичный протокол идентификации, основанный на сложности извлечения квадратных корней по модулю составного числа. Пусть - модуль RSA, секрет , открытый параметр . Один раунд:
- Доказывающий выбирает случайное , шлёт .
- Проверяющий шлёт бит .
- Доказывающий отвечает .
- Проверка: .
При ответ ничего не раскрывает; при ответ маскирует секрет случайным . Каждый раунд снижает вероятность обмана вдвое, поэтому за раундов корректность достигает . Это типичная задача на семинаре: посчитать вероятность успешного обмана и число раундов для заданной стойкости.
Неинтерактивные доказательства и эвристика Фиата-Шамира
Интерактивность неудобна: нужно живое общение между сторонами. Эвристика Фиата-Шамира превращает -протокол в неинтерактивный, заменяя случайный вызов проверяющего на хеш от обязательства: (или для подписи). Поскольку хеш-функция моделируется как случайный оракул, доказывающий не может подобрать под удобный . Так из протокола Шнорра получается схема цифровой подписи Шнорра, а сама конструкция NIZK (non-interactive zero-knowledge) лежит в основе zk-SNARK и zk-STARK - компактных доказательств для блокчейнов.
Современные системы вроде zk-SNARK дают доказательства знания (proof of knowledge): проверяется не только истинность утверждения, но и то, что доказывающий действительно владеет свидетелем. Поскольку неинтерактивные схемы опираются на хеш-функции, полезно вспомнить механику полиномиального хеширования в алгоритме Рабина-Карпа, а число теоретико-числовых предположений рядом - в теореме Дирихле о простых числах.
Где применяется
Доказательства с нулевым разглашением вышли далеко за пределы теории. Анонимная криптовалюта Zcash использует zk-SNARK, чтобы подтверждать корректность транзакции, не раскрывая отправителя, получателя и сумму. Протоколы аутентификации позволяют доказать знание пароля, не передавая его. Системы голосования подтверждают, что бюллетень засчитан правильно, сохраняя тайну волеизъявления. Решения масштабирования (rollup) сжимают тысячи транзакций в одно короткое доказательство.
Частые ошибки
- Путают нулевое разглашение с шифрованием. ZKP не скрывает сообщение - он доказывает утверждение, не выдавая свидетеля. Это разные задачи.
- Забывают про симулятор. Свойство нулевого разглашения доказывается существованием симулятора, а не словами «секрет не передаётся». Без симулятора доказательство неполное.
- Считают один раунд достаточным. В протоколах с битовым вызовом один раунд даёт вероятность обмана . Нужное число раундов выводится из требуемой стойкости .
- Повторно используют случайность . В протоколе Шнорра два разных вызова при одном позволяют извлечь секрет - это уязвимость, а не свойство.
- Смешивают корректность и полноту. Полнота - про честные стороны и истинные утверждения; корректность - про защиту от жульничающего доказывающего на ложных утверждениях.
FAQ
Чем доказательство знания отличается от обычного ZKP? Обычное доказательство убеждает, что утверждение истинно. Доказательство знания дополнительно гарантирует через извлекатель, что доказывающий владеет конкретным свидетелем , а не просто знает о его существовании.
Почему нужен случайный оракул в эвристике Фиата-Шамира? Замена вызова на безопасна, только если доказывающий не способен предсказать или подстроить выход . Модель случайного оракула формализует это предположение и позволяет доказать стойкость подписи.
Что значит «вычислительное» нулевое разглашение? Это означает, что выписка симулятора неотличима от настоящей не абсолютно, а лишь для любого алгоритма с полиномиальным временем работы. Опирается на вычислительные предположения, например на трудность дискретного логарифма.
Коротко
Доказательство с нулевым разглашением - протокол, в котором доказывающий убеждает проверяющего в истинности утверждения, не раскрывая свидетеля. Оно обязано удовлетворять трём свойствам: полноте, корректности и нулевому разглашению (последнее доказывается существованием симулятора). Классические -протоколы Шнорра и Фиаге-Фиата-Шамира строятся по схеме commitment - challenge - response, а эвристика Фиата-Шамира делает их неинтерактивными, открывая путь к zk-SNARK и анонимным платёжным системам.
Читайте также

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

Цифровая подпись ECDSA: как устроена и как проверяется
Разбираем цифровую подпись ECDSA на эллиптических кривых: как из приватного ключа и хэша рождается пара (r, s), как идет проверка и почему важен nonce k.

Алгоритм Рабина-Карпа: поиск подстроки за O(n+m)
Разбираем алгоритм Рабина-Карпа: как полиномиальный хеш и скользящее окно ускоряют поиск подстроки до O(n+m) в среднем, почему бывают ложные совпадения и при чём тут плагиат.