Покер по почте
Предположим, что Алиса и Боб – традиционные участники криптографической переписки – хотят сыграть в покер, точнее, в пятикарточный стад. Но Алиса живет в Австралии, в Алис-Спрингс, а Боб – в Англии, в Боббингтоне. Но возможно, они могли бы пересылать друг другу карты по почте? Главная проблема – как раздать карты, то есть дать каждому игроку «в руки» по пять карт. Как могут при этом оба игрока быть уверены, что каждому из них достались карты из одной колоды и что второй игрок их не знает?
Если Боб просто отправит Алисе в конверте пять карт, она не сможет быть уверена, что он их не видел; более того, когда Боб выкладывает карты, которые будто бы находятся у него на руках, она не может быть уверена, действительно ли у него только пять карт, или в его распоряжении находится вся остальная колода и он только делает вид, что использует только законные пять карт, сданные ему в начале игры.
Как ни удивительно, способ играть в такие карточные игры, как покер, по переписке, по телефону или через Интернет существует, причем без всякой опасности, что кто-то из игроков при этом обманывает. Алиса и Боб могут создать шифр, воспользовавшись теорией чисел, и прибегнуть к сложному обмену посланиями. Такой метод известен как «протокол с нулевым разглашением» – способ убедить собеседника в том, что ты обладаешь каким-то конкретным знанием, не раскрывая, в чем это знание состоит. Так, вы могли бы убедить онлайновую банковскую систему в том, что знаете секретный код, записанный на обороте кредитной карты, не передавая при этом никакой полезной информации о самом коде.
Гостиницы часто хранят ценности гостей в небольших сейфовых ячейках в холле. Для обеспечения безопасности каждая такая ячейка снабжается двумя ключами: один хранится у администратора, другой выдается постояльцу. Чтобы открыть сейф, необходимы оба ключа. Алиса и Боб могут воспользоваться аналогичной схемой:
1. Алиса раскладывает карты по одной в 52 ящичка и запирает их на кодовые замки, ключи к которым известны только ей. Затем она почтой пересылает все ящички Бобу.
2. Боб (который не может отпереть ящички и посмотреть, что за карты в них лежат) выбирает пять ящичков и высылает обратно Алисе. Она отпирает их и получает свои пять карт.
3. Боб выбирает другие пять ящичков и накладывает на каждый из них дополнительный замок. Он знает коды этих замков, Алисе же они неизвестны. Боб высылает эти ящички Алисе.
4. Алиса отпирает свои замки и возвращает ящички Бобу. Теперь он может отпереть их и получить свои пять карт.
После этих предварительных действий может начаться собственно игра. Чтобы раскрыть карты, их пересылают второму игроку. Чтобы доказать, что никто не мошенничал, можно вскрыть все оставшиеся ящички после окончания игры.
Алиса и Боб перевели свою методику игры на язык математики, выделив ее существенные черты. Они представили карточную колоду согласованным набором из 52 чисел. Кодовые замки Алисы обозначаются шифром A, известным только ей. Это функция, математическое правило, превращающее число карты c в другое число Ac. (Я беру на себя вольность не писать всякий раз A (c), чтобы не пришлось говорить о «композиции» функций.) Алисе известен также обратный шифр A–1, который переводит Ac обратно в c. То есть
A−1Ac = c.
Боб не знает ни A, ни A–1.
Аналогично замки Боба соответствуют шифрам B и B–1, известным только ему, таким, что B–1Bc = c.
С учетом этих предварительных замечаний метод соответствует следующей процедуре:
1. Алиса пересылает все 52 числа Ac1, …, Ac52 Бобу. Он понятия не имеет, каким картам эти числа соответствуют; по существу, Алиса перетасовала колоду.
2. Боб «сдает» пять карт Алисе и пять самому себе. Он высылает Алисе ее карты. Чтобы упростить запись, рассмотрим лишь одну из этих карт, обозначив ее Ac. Алиса может выяснить значение c, применив к полученному числу A–1, так что она знает, какие карты ей сданы.
3. Бобу необходимо выяснить, какие карты он выбрал для себя, но только Алиса знает, как извлечь истинные значения из зашифрованных. Но Боб не может послать свои карты Алисе, потому что тогда она будет знать, что у него в руке. Поэтому к каждой своей карте Ad он применяет свое шифровальное правило, чтобы получить BAd, и высылает результат такой обработки Алисе.
4. Алиса может вновь применить свое правило A–1, чтобы «снять замок», но на этот раз ее ждет засада: результат будет равен A–1BAd.
В обычной алгебре мы могли бы поменять A–1 и B местами, чтобы получить
BA–1Ad,
что равняется Bd.
После этого Алиса могла бы выслать результат обратно Бобу, а тот, в свою очередь, применил бы B–1, чтобы получить d.
Однако функции нельзя переставлять таким образом. К примеру, если Ac = c + 1 (и, соответственно, A–1c = c – 1) и Bc = c², то A–1Bc = Bc – 1 = c²– 1, тогда как
BA–1c = (A –1c)² = (c – 1)² = c²– 2c + 1,
то есть совсем не то же самое.
Чтобы обойти это препятствие, следует избегать подобных функций и выбирать такие методы шифрования, для которых A–1B = BA–1. В этом случае говорят, что для функций A и B действует коммутативный закон, поскольку все это несложно привести к эквивалентному условию AB = BA. Обратите внимание: в описанном нами физическом методе замки Алисы и Боба и правда позволяют перестановку. Их можно навешивать и снимать в любом порядке, результат будет тот же: ящичек с двумя замками.
Таким образом, Алиса и Боб могут играть в покер по переписке, если сумеют придумать два допускающих перестановку шифра A и B, таких, чтобы алгоритм расшифровки A –1 был известен только Алисе, а алгоритм B–1 – только Бобу.
Боб и Алиса выбирают большое простое число p, которое может быть опубликовано и известно всем. Они согласуют также 52 числа c1, …, c52 (mod p), которые будут представлять карты.
Алиса выбирает некоторое число a от 1 до p – 2 и определяет свою кодирующую функцию A как Ac = ca (mod p).
Пользуясь базовой теорией чисел, можно сказать, что обратная (декодирующая) функция имеет вид
A–1c = ca' (mod p)
для некоего числа a', которое она может вычислить. Алиса держит и a, и a' в секрете.
Аналогично Боб выбирает себе число b и определяет свою кодирующую функцию B как Bc = cb (mod p) и обратную к ней
B–1c = cb' (mod p)
для числа b', которое он может вычислить. Он держит b и b' в секрете.
Кодирующие функции A и B подчиняются коммуникативному закону, поскольку
ABc = A (cb) = (cb)a = cba = cab = (ca)b = B (ca) = BAc,
где все равенства выполняются (mod p). Поэтому Алиса и Боб могут использовать A и B описанным образом.