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 и приватной аутентификации.