Доказательства с нулевым разглашением (ZKP)
Как доказать, что вы знаете секрет, ни на йоту его не раскрыв.
Доказательство с нулевым разглашением (zero-knowledge proof, ZKP) — протокол, в котором доказывающий убеждает проверяющего в истинности утверждения, не передавая никакой информации сверх самого факта истинности.
Зачем это знать
Обычно, чтобы доказать «я знаю пароль», вы пароль показываете. Чтобы доказать «у меня на счёте больше 100 000», вы раскрываете баланс. ZKP переворачивает эту логику: можно убедить собеседника, что утверждение верно, и при этом не дать ему ничего, что он мог бы переиспользовать или подсмотреть. Для инженера по безопасности это инструмент минимизации данных — система перестаёт хранить и пересылать лишние секреты, а значит их попросту нечего украсть.
У честного ZKP три свойства. Полнота: если утверждение верно и обе стороны честны, проверяющий убедится. Корректность (soundness): если утверждение ложно, обманщик не сможет пройти проверку (кроме исчезающе малой вероятности). Нулевое разглашение: проверяющий не узнаёт ничего, кроме факта истинности — формально он мог бы сам «выдумать» такой же протокол-стенограмму без доступа к секрету.
Интуиция: пещера с дверью
Классическая аналогия — кольцевая пещера с волшебной дверью в дальнем конце, открыть которую можно только зная секретное слово. Пещера разветвляется на два прохода, A и B, которые соединяются дверью. Пегги (prover) утверждает, что знает слово. Виктор (verifier) ждёт у входа и не видит, в какой проход она ушла.
- Пегги заходит в случайный проход.
- Виктор подходит к развилке и громко называет проход, из которого она должна выйти — A или B (случайно).
- Если Пегги знает слово, она всегда выйдет из нужного: при необходимости она просто откроет дверь и перейдёт.
- Если слова не знает — угадает сторону лишь в половине случаев.
Один раунд обманщик проходит с вероятностью 50%. Но раунды независимы: после 20 повторений шанс везения — менее одной миллионной. Виктор убеждается, что слово известно, но само слово так и не услышал. Это интерактивное доказательство: нужен живой обмен «вызов–ответ» (challenge–response). Важна и деталь со случайностью вызова: если бы Виктор называл сторону предсказуемо, Пегги-обманщица заранее заходила бы в нужный проход и проходила проверку без всякого знания. Непредсказуемость вызова — это то, что не даёт смошенничать; та же идея ляжет в основу строгих определений корректности.
Как это работает под капотом
Реальные ZKP не про пещеры, а про математические утверждения вида «я знаю такое x, что f(x) = y», где обратить f трудно. Базовый кирпич — commitment (обязательство): доказывающий «запечатывает» значение так, что позже не сможет его подменить, но и проверяющий пока его не видит (подробно в уроке про схемы обязательств). Протокол строится как обмен: обязательство → случайный вызов от проверяющего → ответ, который сходится только при честном знании секрета.
Ключевой приём для практики — преобразование Фиата–Шамира: интерактивный протокол делают неинтерактивным, заменяя «случайный вызов проверяющего» на хеш от обязательства. Тогда доказательство — это один объект, который можно положить в блокчейн или отправить письмом, и любой проверит его сам, без диалога.
Интерактивно: Prover --commit--> Verifier
Prover <--challenge-- Verifier (случайный вызов)
Prover --response--> Verifier (проверка)
Неинтерактивно (Фиат–Шамир):
challenge = Hash(commit) (вместо живого вызова)
proof = (commit, response) (один объект, проверяет любой)zk-SNARK и zk-STARK простыми словами
Современные системы умеют доказывать истинность целой программы: «я выполнил вот эти вычисления и получил такой результат» — не показывая входные данные и не заставляя проверяющего повторять работу.
zk-SNARK (Succinct Non-interactive ARgument of Knowledge): доказательство крошечное (сотни байт) и проверяется за миллисекунды, даже если исходное вычисление огромно. Плата за это — обычно нужен trusted setup: разовая генерация общих параметров, в ходе которой образуются «секретные обрывки» (toxic waste); если их не уничтожить, обладатель сможет подделывать доказательства. Поэтому setup проводят церемониями с множеством независимых участников.
zk-STARK (Scalable Transparent ARgument of Knowledge): не требует trusted setup (transparent) и опирается только на стойкость хеш-функций, что делает его кандидатом на устойчивость к квантовым атакам. Минус — доказательства крупнее. Грубая памятка:
| Свойство | zk-SNARK | zk-STARK |
| Размер доказательства | очень маленький | больше |
| Trusted setup | обычно нужен | не нужен |
| Постквантовая стойкость | зависит от схемы | скорее да (на хешах) |
Где это применяется
- Приватность: вход в сервис по «доказательству, что мне есть 18», без даты рождения; подтверждение платёжеспособности без раскрытия суммы.
- Блокчейн и масштабирование: zk-rollup исполняет тысячи транзакций вне основной цепи и публикует одно короткое доказательство корректности — сеть проверяет его дёшево вместо повторения всех транзакций.
- Приватные платежи: подтвердить «транзакция валидна, баланс не ушёл в минус», не раскрывая отправителя, получателя и сумму.
На что обратить внимание (mindset защитника)
ZKP — мощный, но тонкий инструмент. Свежие, неотрецензированные конструкции и кустарные реализации опасны: ошибка в схеме ломает либо корректность (можно доказать ложь), либо нулевое разглашение (утечёт секрет). Практические правила: используйте проверенные библиотеки и параметры, не изобретайте криптографию сами, для SNARK предпочитайте схемы с публичной церемонией setup, и помните, что ZKP доказывает вычислительное утверждение — он не отвечает за то, верны ли исходные входные данные.
Итоги
- ZKP доказывает истинность утверждения, не раскрывая ничего сверх неё; свойства — полнота, корректность, нулевое разглашение.
- Интерактивные доказательства строятся на повторяемых раундах «вызов–ответ»; преобразование Фиата–Шамира делает их неинтерактивными через хеш.
- zk-SNARK — компактные и быстрые, но обычно требуют trusted setup; zk-STARK — прозрачные и постквантовые, но крупнее.
- Применения: приватная аутентификация, zk-rollup для масштабирования блокчейна, конфиденциальные платежи.