EssayAI
Блог
Блог
Математика и алгоритмы

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

17 апреля 2026Время чтения: 7 минут
#криптография#zero-knowledge#протоколы#доказуемая стойкость#теория сложности
Доказательство с нулевым разглашением: как это работает

Доказательство с нулевым разглашением (zero-knowledge proof, ZKP) - это криптографический протокол, в котором одна сторона (доказывающий) убеждает другую (проверяющего) в истинности утверждения, не раскрывая при этом никакой информации, кроме самого факта истинности. Идею в 1985 году предложили Голдвассер, Микали и Ракофф; за неё Голдвассер и Микали позже получили премию Тьюринга. На практике концепция лежит в основе анонимных платёжных систем, протоколов аутентификации и масштабирования блокчейнов. В этой статье разбираем формальное определение, три обязательных свойства, классический протокол и характерные ошибки, которые студенты допускают на коллоквиумах по криптографии.

Что такое доказательство с нулевым разглашением

Формально доказательство с нулевым разглашением строится вокруг языка LL - множества утверждений, которые «истинны». Доказывающий PP (Prover) знает секрет - свидетеля (witness) ww для утверждения xLx \in L. Проверяющий VV (Verifier) хочет удостовериться, что xLx \in L, но не должен узнать ww и вообще ничего, что нельзя было бы вычислить самостоятельно.

Классическая иллюстрация - «пещера Али-Бабы». Кольцевая пещера имеет два прохода (A и B), соединённых дверью, открываемой секретным словом. Доказывающий заходит в один из проходов, проверяющий кричит, из какого прохода тот должен выйти. Если доказывающий знает слово, он всегда выходит из нужного; если не знает - угадывает с вероятностью 1/21/2. Повторив раунд kk раз, мы загоняем вероятность обмана до 2k2^{-k}, при этом проверяющий ни разу не услышал само секретное слово.

Чтобы перейти от метафоры к рабочему протоколу аутентификации, удобно собрать конкретный сценарий и посмотреть, как раскладываются роли и сообщения. Воспользуйтесь конструктором ниже.

Три свойства: полнота, корректность, нулевое разглашение

Протокол считается доказательством с нулевым разглашением, только если выполнены три свойства одновременно.

Полнота (completeness). Если утверждение истинно и обе стороны честны, проверяющий принимает доказательство с подавляющей вероятностью. Формально: для xLx \in L Pr[P,V(x)=accept]1negl(n).\Pr[\langle P, V\rangle(x) = \text{accept}] \ge 1 - \text{negl}(n).

Корректность (soundness). Если утверждение ложно (xLx \notin L), то никакой, даже жульничающий, доказывающий PP^* не убедит честного проверяющего, кроме как с пренебрежимо малой вероятностью: Pr[P,V(x)=accept]negl(n).\Pr[\langle P^*, V\rangle(x) = \text{accept}] \le \text{negl}(n).

Нулевое разглашение (zero-knowledge). Существует эффективный симулятор SS, который без доступа к свидетелю ww порождает протокольную выписку (transcript), статистически неотличимую от настоящей. Если такая выписка генерируется без секрета, значит, проверяющий не узнаёт из неё ничего нового - он мог бы получить то же самое сам. Это и есть формальный смысл фразы «никакой информации не раскрывается».

Различают три силы свойства нулевого разглашения: совершенное (распределения совпадают точно), статистическое (статистическое расстояние пренебрежимо мало) и вычислительное (распределения неотличимы для любого полиномиального алгоритма). Большинство практичных схем - вычислительные, поскольку опираются на предположения о сложности, например на трудность дискретного логарифма.

Интерактивный протокол: commitment - challenge - response

Канонический интерактивный ZKP состоит из трёх сообщений и называется Σ\Sigma-протоколом:

  1. Commitment (tt): доказывающий посылает обязательство, фиксируя случайность, но не раскрывая секрет.
  2. Challenge (cc): проверяющий шлёт случайный вызов.
  3. Response (ss): доказывающий отвечает так, что ответ проходит проверку только при знании свидетеля.

Рассмотрим протокол Шнорра для доказательства знания дискретного логарифма. Пусть gg - генератор группы порядка qq, открытый ключ y=gxy = g^x, секрет - показатель xx. Доказывающий:

  1. Выбирает случайное rr, отправляет t=grt = g^r.
  2. Получает вызов cc.
  3. Отправляет s=r+cxmodqs = r + c x \bmod q.

Проверяющий принимает, если gs=tycg^s = t \cdot y^c. Подстановка показывает полноту: gr+cx=gr(gx)c=tycg^{r + cx} = g^r \cdot (g^x)^c = t \cdot y^c. Корректность доказывается через извлекатель (extractor): из двух принятых выписок с одним tt, но разными c1c2c_1 \ne c_2 восстанавливается x=(s1s2)(c1c2)1modqx = (s_1 - s_2)(c_1 - c_2)^{-1} \bmod q. Нулевое разглашение - симулятор выбирает ss и cc заранее и вычисляет t=gsyct = g^s y^{-c}, получая корректную выписку без знания xx.

Протокол Фиаге-Фиата-Шамира

Историчеcки первый практичный протокол идентификации, основанный на сложности извлечения квадратных корней по модулю составного числа. Пусть n=pqn = pq - модуль RSA, секрет ss, открытый параметр v=s2modnv = s^2 \bmod n. Один раунд:

  1. Доказывающий выбирает случайное rr, шлёт x=r2modnx = r^2 \bmod n.
  2. Проверяющий шлёт бит c{0,1}c \in \{0, 1\}.
  3. Доказывающий отвечает y=rscmodny = r \cdot s^c \bmod n.
  4. Проверка: y2xvc(modn)y^2 \equiv x \cdot v^c \pmod n.

При c=0c = 0 ответ y=ry = r ничего не раскрывает; при c=1c = 1 ответ y=rsy = r s маскирует секрет случайным rr. Каждый раунд снижает вероятность обмана вдвое, поэтому за kk раундов корректность достигает 2k2^{-k}. Это типичная задача на семинаре: посчитать вероятность успешного обмана и число раундов для заданной стойкости.

Неинтерактивные доказательства и эвристика Фиата-Шамира

Интерактивность неудобна: нужно живое общение между сторонами. Эвристика Фиата-Шамира превращает Σ\Sigma-протокол в неинтерактивный, заменяя случайный вызов проверяющего на хеш от обязательства: c=H(t)c = H(t) (или c=H(tm)c = H(t \,\|\, m) для подписи). Поскольку хеш-функция HH моделируется как случайный оракул, доказывающий не может подобрать tt под удобный cc. Так из протокола Шнорра получается схема цифровой подписи Шнорра, а сама конструкция NIZK (non-interactive zero-knowledge) лежит в основе zk-SNARK и zk-STARK - компактных доказательств для блокчейнов.

Современные системы вроде zk-SNARK дают доказательства знания (proof of knowledge): проверяется не только истинность утверждения, но и то, что доказывающий действительно владеет свидетелем. Поскольку неинтерактивные схемы опираются на хеш-функции, полезно вспомнить механику полиномиального хеширования в алгоритме Рабина-Карпа, а число теоретико-числовых предположений рядом - в теореме Дирихле о простых числах.

Где применяется

Доказательства с нулевым разглашением вышли далеко за пределы теории. Анонимная криптовалюта Zcash использует zk-SNARK, чтобы подтверждать корректность транзакции, не раскрывая отправителя, получателя и сумму. Протоколы аутентификации позволяют доказать знание пароля, не передавая его. Системы голосования подтверждают, что бюллетень засчитан правильно, сохраняя тайну волеизъявления. Решения масштабирования (rollup) сжимают тысячи транзакций в одно короткое доказательство.

Частые ошибки

  • Путают нулевое разглашение с шифрованием. ZKP не скрывает сообщение - он доказывает утверждение, не выдавая свидетеля. Это разные задачи.
  • Забывают про симулятор. Свойство нулевого разглашения доказывается существованием симулятора, а не словами «секрет не передаётся». Без симулятора доказательство неполное.
  • Считают один раунд достаточным. В протоколах с битовым вызовом один раунд даёт вероятность обмана 1/21/2. Нужное число раундов выводится из требуемой стойкости 2k2^{-k}.
  • Повторно используют случайность rr. В протоколе Шнорра два разных вызова при одном rr позволяют извлечь секрет xx - это уязвимость, а не свойство.
  • Смешивают корректность и полноту. Полнота - про честные стороны и истинные утверждения; корректность - про защиту от жульничающего доказывающего на ложных утверждениях.

FAQ

Чем доказательство знания отличается от обычного ZKP? Обычное доказательство убеждает, что утверждение xLx \in L истинно. Доказательство знания дополнительно гарантирует через извлекатель, что доказывающий владеет конкретным свидетелем ww, а не просто знает о его существовании.

Почему нужен случайный оракул в эвристике Фиата-Шамира? Замена вызова на c=H(t)c = H(t) безопасна, только если доказывающий не способен предсказать или подстроить выход HH. Модель случайного оракула формализует это предположение и позволяет доказать стойкость подписи.

Что значит «вычислительное» нулевое разглашение? Это означает, что выписка симулятора неотличима от настоящей не абсолютно, а лишь для любого алгоритма с полиномиальным временем работы. Опирается на вычислительные предположения, например на трудность дискретного логарифма.

Коротко

Доказательство с нулевым разглашением - протокол, в котором доказывающий убеждает проверяющего в истинности утверждения, не раскрывая свидетеля. Оно обязано удовлетворять трём свойствам: полноте, корректности и нулевому разглашению (последнее доказывается существованием симулятора). Классические Σ\Sigma-протоколы Шнорра и Фиаге-Фиата-Шамира строятся по схеме commitment - challenge - response, а эвристика Фиата-Шамира делает их неинтерактивными, открывая путь к zk-SNARK и анонимным платёжным системам.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также