Подтвердить что ты не робот

Криптография для карточной игры P2P

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

Основная проблема, как я вижу, в том, что у каждого игрока есть несколько грудов карт (колода для колоды, текущая рука и отбрасывающая колода). Для любого игрока не должно быть возможности изменять состав этих свай, за исключением случаев, когда это разрешено правилами игры (т.е. Рисованием или отбрасыванием карт), а также не должны быть в состоянии знать, что находится в их или их oppponent сваях.

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

[Изменить] Хорошо, поэтому я думал об этом немного больше, и вот идея, которую я придумал. Если вы можете вытолкнуть все дыры, сообщите мне.

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

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

Я полагаю, что в этот момент колода была рандомизирована, и ни один игрок не может знать значения. Однако, когда карта нарисована, противник может показать свою соль, позволяя первому игроку определить, что такое первоначальное значение, и когда играется игра, игрок показывает свою соль, позволяя оппоненту проверить значение карты.

4b9b3361

Ответ 1

Ваша проблема в знаменитой проблеме психического покера в криптографии (это была одна из моих любимых частей криптокласса в колледже). Это возможно, и он был решен (частично, как и все крипто, Ron Rivest), если вы не возражаете против огромного хита производительности.

Подробнее читайте на странице wiki.

Ответ 2

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

Предположим, что у игрока A есть карты A1, A2, A3,... из набора, представленного числами 0, 1,... N-1. Эти карты также могут быть разделены на свай, но это не меняет следующее.

Вместо того, чтобы обрабатывать эти карты одним списком [A1, A2, A3, ...], вы можете вместо этого использовать два из них [A1_a, A2_a, A3_a, ...] и [A1_b, A2_b, A3_b, ...], где один с проигрывателем A, а другой - с игроком B. Они генерируются таким образом, что каждый из них является случайным (в диапазоне 0...N-1), но оба они коррелированы так, что A1_a + A1_b = A1, A2_a + A2_b = A2,... (все операции по модулю N).

  • Таким образом, ни один игрок не знает карты без доступа к дополнительной куче (т.е. он не может разумно изменить свои карты).
  • Всякий раз, когда вам нужно знать карту, оба игрока показывают свое соответствующее значение, и вы добавляете те по модулю N
  • вы можете легко реализовать такие вещи, как "нарисовать карту", ​​обе сваи должны обрабатываться одинаково.

Ответ 3

Традиционная схема Mental Poker является излишней. Ваша ситуация на самом деле намного проще, поскольку нет общей колоды. Вы можете сделать что-то вроде этого:

Игрок A берет свои карты и шифрует их ключом Ka. Он посылает их в B, который перетасовывает их, шифрует их ключом Kb. Каждый раз, когда А хочет играть на карточке, он спрашивает B для расшифровки (Kb) следующего. Дешифрует это, чтобы найти, какую карту он нарисовал. В конце A и B показывают Ka и Kb и сравнивают их с журналом игры, что должно предотвращать обман.

Обновлено: при отражении здесь более простое решение: как и выше, игрок A шифрует свои карты и отправляет их B. B перетасовывает их. Всякий раз, когда А хочет карту, он говорит Б, из какой колоды он рисует. B возвращает (зашифрованную) карту из соответствующей сваи.

Ответ 4

Возможно, игроки могли обменять хэши своих свай в начале игры.

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

Единственная проблема заключается в том, как изначально колоды перетасовываются. Вам нужно будет убедиться, что игрок не может просто начать свою колоду в любом порядке, который он выбирает.

Возможно, игроки генерируют свой первоначальный порядок колоды, получая случайность от какого-то определенного источника.. но так, что другой игрок не может понять, что заказы на палубе другого игрока до конца игры, но все еще можно проверить что игрок не возился со своими колодами. Не знаете, как это можно сделать.

Edit:

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

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

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

Я не уверен, как вы могли бы остановить другого игрока от возможности рассказать, какую карту они собирали для своего противника. Если семя использовалось для выбора карты из какого-то случайно упорядоченного списка карт, которые у оппонента имело хэш, чтобы проверить.. они могли проверить все возможные комбинации карт и выяснить, какой из них соответствует хешу, тем самым способный диктовать, какую карту они хотели, чтобы другой игрок рисовал, отправив им семя, которое могло бы выбрать эту карту.

Ответ 5

В то время как центральный сервер, вероятно, был бы самым простым способом, если вы хотите его избежать, вы можете использовать распределенную систему, в которой все, играющие в игру, являются хранилищем для колод других игроков (не для себя или для своего противника, но кто-нибудь еще). Я считаю, что Limewire и Bittorrent работают так, поэтому вы можете получить некоторые идеи, изучив эти источники.

Ответ 6

это адаптация подхода Acorns:

Настройка:

у каждого игрока есть своя колода (полностью упорядоченный набор карт)... эти колоды являются общедоступными и находятся в естественном порядке

каждому игроку нужна асимметричная (подпись) клавиатура, открытые ключи

теперь к проблеме случайности:

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

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

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

так как мы можем совершать этот случайный обмен номерами каждый раунд, случайные значения заранее не известны игроку → не заглядывают в порядок нашего стека

и поскольку теперь мы имеем сеянный RNG, мы можем получить случайные значения, полученные из этого "общего" случайного значения... таким образом, мы можем нарисовать "случайные" (полностью детерминированные, с повторяемыми проверяемыми результатами) карты из нашей колоды... колоду/кучу не нужно перетасовывать, так как мы можем получить случайные позиции из нашего RNG

так как мы все обменялись случайными значениями, сигнатурами, начальными колодами (в полном порядке) и всеми ходами, мы можем воспроизвести всю игру впоследствии и проверить неровности