Zero-knowledge: доказать, не раскрывая

Можно ли убедить кого-то, что ты знаешь пароль, ни разу его не назвав? Звучит как парадокс, но это реальная и очень полезная криптография — доказательства с нулевым разглашением.

Идея простыми словами

Zero-knowledge доказательство позволяет одной стороне (доказывающему) убедить другую (проверяющего) в том, что некое утверждение истинно, не раскрывая никакой дополнительной информации. Проверяющий узнаёт только одно: «да, это правда» — и больше ничего.

Аналогия с пещерой

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

  • Аня уходит вглубь по случайному коридору (левому или правому), Боря не видит, по какому.
  • Боря кричит, из какого коридора ему выйти.
  • Если Аня знает слово, она всегда выйдет из нужного (при необходимости открыв дверь).
  • Если не знает — угадает лишь в половине случаев.

Повторив это много раз, Боря убеждается: Аня почти наверняка знает слово. Но самого слова он так и не услышал.

Демо: вероятность обмана падает

import secrets

# Если Аня НЕ знает секрет, она угадывает коридор с вероятностью 1/2.
# Считаем шанс «проскочить» N раундов чистым везением.
for rounds in [1, 5, 10, 20]:
    cheat_chance = (1 / 2) ** rounds
    print(f"{rounds:>2} раундов: шанс обмануть = {cheat_chance:.6%}")

print()
# Честный участник, знающий секрет, проходит всегда:
knows_secret = True
success = all(knows_secret or secrets.choice([True, False]) for _ in range(20))
print("Знающий секрет прошёл все 20 раундов:", success)

После 20 раундов шанс обманщика — меньше одной миллионной. Проверяющий уверен, а секрет не раскрыт.

Три свойства настоящего ZK-доказательства

  • Полнота: если утверждение истинно, честный доказывающий убедит проверяющего.
  • Корректность: если утверждение ложно, обмануть почти невозможно.
  • Нулевое разглашение: проверяющий не узнаёт ничего, кроме факта истинности.

Где это применяют

Это не абстракция. Zero-knowledge уже работает на практике: приватные криптовалюты (например, Zcash) подтверждают транзакции, не раскрывая суммы и адреса; технология zk-rollup ускоряет блокчейны; системы аутентификации позволяют доказать «мне есть 18 лет», не показывая паспорт и дату рождения. Это один из самых перспективных приёмов современной криптографии — приватность без потери доверия.

Вывод:

Zero-knowledge доказательство убеждает проверяющего, что утверждение истинно, не раскрывая ничего лишнего — даже самого секрета. Многократные раунды делают обман почти невозможным. Применяется в приватных криптовалютах, zk-rollup и приватной аутентификации.
Проверьте себя
1. Что доказывает zero-knowledge доказательство?
AЧто доказывающий не знает секрета
BЧто утверждение истинно, не раскрывая проверяющему ничего сверх этого факта
CПолное содержание секрета
DТолько то, что у человека есть компьютер
2. Почему многократное повторение раундов в аналогии с пещерой убеждает проверяющего?
AПотому что секрет постепенно раскрывается
BПотому что вероятность угадать все раунды без знания секрета стремительно падает (1/2 в каждом раунде)
CПотому что доказывающий устаёт врать
DПотому что пещера меняет форму
Поддержать проект