Эта статья входит в число добротных статей

Ментальный покер

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Ментальный покер — система криптографических задач, касающихся честных игр на расстоянии (через телефонную связь или Интернет)[1][2]. Термин происходит от названия карточной игры покер. С аналогичной проблемой связана задача подбрасывания монеты на расстоянии[3].

История[править | править код]

Поскольку с середины XX века многие сделки, денежные операции стали совершаться в удалённом режиме, появилась необходимость в создании криптографического протокола, способного решать такие задачи. Такой протокол должен был обеспечить не только удобство для пользователя, но и надёжность. Подобную задачу можно сформулировать в игровой форме, опуская некоторые технические детали — таким образом появился термин «ментальный покер»[1].

Впервые в покер без карт пытались сыграть Нильс Бор, его сын и друзья в 1933 году, но попытка оказалась безуспешной[4]. Позже проблемой занялся Роберт Флойд. Его исследования подтолкнули создателей протокола RSA-шифрования Ади Шамира, Рона Ривеста и Лена Адлемана к публикации научного доклада, в котором были предложены протоколы, позволяющие решить проблему ментального покера[5].

Формулировка задачи[править | править код]

Шамир, Ривест и Адлеман сформулировали задачу так: «Могут ли два нечестных друг к другу игрока сыграть в честный покер без использования карт, а, например, по телефону?»[6][7]

В покере это звучит так: «Как мы можем убедиться, что ни один игрок не подглядывает в карты других игроков, пока мы перетасовываем колоду?». В реальной карточной игре ответить на такой вопрос просто, так как игроки сидят напротив и наблюдают друг за другом (рассматриваем случай, когда исключена возможность обычного мошенничества). Однако если игроки сидят не рядом, а в отдельных комнатах, и могут передавать колоду друг другу целиком (например, с помощью почты), задача становится весьма трудной. Для электронных карточных игр, таких как онлайн-покерruen, где сам процесс игры скрыт от пользователя, решить проблему и вовсе невозможно, если используемый метод позволяет одному игроку обманывать другого.

Игра должна удовлетворять определенным требованиям[3]:

  1. Игрок не знает даже частичной информации о картах своего противника.
  2. Все возможные исходы равновероятны для обоих игроков.
  3. В конце игры игрок может удостовериться, что игра была честной и обмана не произошло.

Перетасовки карт, использующие коммутативное шифрование[править | править код]

Одним из возможных алгоритмов перетасовки карт является использование коммутативной схемы шифрования. Коммутативная схема означает, что если некоторые данные зашифровывают более чем один раз, порядок, в котором их расшифровывают, не имеет значения.

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

Функция шифрования, как и в RSA, должна быть односторонней — зная x, легко можно вычислить f(x), но в обратном направлении для вычисления необходимо знать «секрет». Криптостойкость протокола основана на сложности обращения таких функций. Однако это не исключает возможность частичного вычисления x из f(x)[8].

Алгоритм[править | править код]

Алгоритм перетасовки карт с использованием коммутативного шифрования выглядит следующим образом[3]:

  1. Алиса и Боб соглашаются использовать определенную «колоду» карт. На практике это означает, что они согласны использовать множество чисел или других данных таких, что каждый элемент множества представляет собой карту.
  2. Алиса шифрует каждую карту колоды, используя ключ А.
  3. Алиса тасует карты.
  4. Алиса передает зашифрованную и перемешанную колоду Бобу. Он не знает, где какие карты.
  5. Боб выбирает шифрование ключа B и использует его для шифрования каждой карты из уже зашифрованной и перетасованной колоды.
  6. Боб тасует колоду.
  7. Боб передает дважды зашифрованную и перетасованную колоду обратно Алисе.
  8. Алиса расшифровывает каждую карту, используя её ключ А. Но шифрование Боба все ещё остается, то есть она не знает, где какие карты.
  9. Алиса выбирает ключ шифрования каждой карты (А1, А2 и т. д.) и шифрует их по отдельности.
  10. Алиса передает колоду Бобу.
  11. Боб расшифровывает каждую карту, используя его ключ В. Индивидуальное шифрование Алисы все ещё остается, то есть он не знает, где какие карты.
  12. Боб выбирает ключ для шифрования каждой карты (B1, B2 и т. д.) и шифрует их по отдельности.
  13. Боб передает колоду обратно Алисе.
  14. Алиса показывает колоду всем игрокам (в данном случае игроки — Алиса и Боб).

Теперь колода перемешана.

Во время игры Алиса и Боб будут забирать карты из колоды, для которых известен порядок в перемешанной колоде. Когда кто-либо из игроков захочет увидеть свои карты, он будет запрашивать соответствующие ключи от другого игрока. Этот игрок (после проверки того, что игрок действительно имеет право смотреть на карты) передает индивидуальные ключи для этих карт другому игроку. Также необходимо проверить, что игрок не пытался запросить ключ к картам, которые ему не принадлежат.

Пример[править | править код]

Алиса и Боб раздают три карты . Далее используется алгоритм:

1) Они выбирают простое число , Алиса выбирает простое число , взаимно простое с , и вычисляет число по обобщенному алгоритму Евклида, то есть: , отсюда .

2) Аналогично Боб определяет свою пару чисел: и .

3) Далее Алиса выбирает три различных числа в промежутке , например , и ставит их в соответствие своим картам. Она передает их Бобу в открытом виде.

4) Затем Алиса вычисляет числа: , перемешивает их и посылает Бобу.

5) Пусть Боб выбирает любое число, например , пересылает Алисе, и это число — её карта (в данном случае ).

6) Теперь Боб вычисляет: .

7) Он посылает числа Алисе, она выбирает, например, и вычисляет .

8) Алиса отправляет число Бобу, он вычисляет , таким образом он получает свою карту , то есть карта . Карта остается в прикупе, при этом Алиса и Боб об этом не знают[1].

Недостатки[править | править код]

Данный алгоритм имеет недостатки. При шифровании данных некоторые свойства этих данных могут быть сохранены из открытого текста в шифротекст. Это может быть использовано для пометок определенных карт. Таким образом, стороны должны договориться об использовании колоды, где нет карт со свойствами, которые сохраняются во время шифрования.

Кроме того, используемая схема шифрования должна быть защищена от атак на основе открытого текста: Боб не может определить первоначальный ключ Алисы[9].

Инструментарий для ментальных карточных игр[править | править код]

Описание сложных протоколов для выполнения и проверки большого количества операций с картами и колодами карт приводится в статье Кристиана Шиндельхауэра. Данная работа связана с операциями «общего назначения» (перетасовка, вставка карты в колоду), которые создают протоколы, применимые к любой карточной игре[10].

Библиотека libtmcg (C++) обеспечивает реализацию инструментария. Шиндельхауэра. Она была использована для реализации немецкой карточной игры скат. В этой игре 3 игрока и колода из 32 карт, поэтому вычислений значительно меньше, чем в покере, в котором от пяти до восьми игроков и используется полная колода из 52 карт[11].

Протокол «покер без перетасовки»[править | править код]

На сегодняшний день алгоритм ментального покера, основанный на стандартном протоколе «Алиса-Боб», не может обеспечить высокую производительность в онлайн-играх. Требование, что каждый игрок шифрует каждую карту по отдельности, накладывает существенные ограничения. Статья Голле описывает протокол ментального покера, при котором достигается наибольшая эффективность за счет использования свойств игры в покер и ухода от модели «зашифровать-перемешать»[12]. Вместо перетасовки карт игроки генерируют (в зашифрованном виде) случайные числа, которые используются для выбора следующей карты. Каждую новую карту необходимо сравнить с остальными, которые уже были розданы, для обнаружения дубликатов[13]. Таким образом, этот метод наиболее эффективен в играх типа «покер», в которых количество карт, раздаваемых игрокам, очень мало по сравнению с размером всей колоды[12].

Алгоритм генерации карт требует организовать криптосистему с двумя ключевыми свойствами. Шифрование Е должно быть аддитивно гомоморфным, то есть таким что: E(c1)E(c2) = E(c1 + c2). Во-вторых, коллизии должны быть обнаружены без раскрытия открытого текста. Другими словами, задавая E(c1) и E(c2), мы может определить, выполняется ли равенство c1 и c2. Одним из примеров системы с такими свойствами является схема шифрования Эль-Гамаля[14].

Алгоритм работает следующим образом[12]:

  1. Игроки создают пустой список L, который фиксирует используемые карты.
  2. Чтобы взять карту, каждый игрок вычисляет случайное число ri в {0, …, 51}, вычисляет E(ri) и публикует схему обязательства E(ri).
  3. Затем игроки показывают их значение E(ri) и можно убедиться, что каждый игрок честен с остальными.
  4. Игроки вычисляют значение , которое образует новую зашифрованную карту E(r*) :
  5. Игроки проверяют, есть ли E(r*) в L. Если нет, E(r*) раздается соответствующим игроком и добавляется к L. Когда карты раскрыты, они могут быть совместно расшифрованы.

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

См. также[править | править код]

Примечания[править | править код]

Литература[править | править код]