#java
#java
Вопрос:
Я работаю над игрой spades, которая соединяет игроков через Интернет, но я не знаю, как я должен раздавать карты игрокам:
-
Если я отправлю начальные значения для объекта SecureRandom, используемого для перетасовки, каждому игроку, они теоретически смогут отслеживать значения в своем собственном трафике и просматривать исходный код, чтобы создать свою собственную программу, которая аналогичным образом раздает карты;
-
Но если я использую машину дилера-игрока для раздачи карт и отправки их другим игрокам, дилер теоретически может жульничать.
Отправка начальных значений уменьшила бы объем данных, отправляемых через Интернет, но отправка фактических карт, по-видимому, затруднила бы мошенничество. Я думал о создании собственного надежного стороннего сервера, на который игрок-дилер отправлял бы свои начальные значения и отправлял карты другим игрокам, но для этого потребовалась бы настройка экземпляра EC2, и я понятия не имею, как даже начать это делать.
Или я немного переоцениваю это?
Ответ №1:
Вы можете вести децентрализованную карточную игру без обмана.
Однако вам следует учитывать, что мошенничество может не быть проблемой, пока игроки не соревнуются за попадание в таблицу лидеров или что-то еще.
Кроме того, если дилер отправляет только начальные значения, он все равно может жульничать.
Комментарии:
1. Я полагал, что дилер все еще может жульничать, если он отправит начальное значение, но каждый также может жульничать, если он это сделает, чтобы сбалансировать баланс.
2. Подождите, как это уравновешивается? Что, если некоторые пользователи недостаточно технически подкованы, чтобы использовать wireshark?
3. В целях моей проблемы я действовал исходя из предположения, что каждый игрок был как злонамеренным, так и способным; вы правы, что в реальном мире это будет не так.
4. Вам не нужно предполагать, что ВСЕ являются злонамеренными и способными. Только то, что есть несколько таких людей.
Ответ №2:
Я бы подумал, что единственный способ предотвратить мошенничество — это заставить центральный, доверенный сервер раздавать карты и уведомлять каждого пользователя, какие карты он получил. Или проблема в том, что у вас нет центрального надежного сервера, а вы предоставляете приложение, которое другие пользователи могут запускать как «дилера»?
Если это так, я бы подумал, что проблема неразрешима даже теоретически. Если кто-то другой запускает сервер, который раздает карты, независимо от того, как вы им управляете, он всегда может подделать начальное значение, чтобы раздать всем карты, которые он хочет, или изучить начальное значение, чтобы он мог предсказать все карты, которые выпадут. Или, если уж на то пошло, он мог бы перехватить выходной поток со своего сервера и заменить его любыми картами, которые он захочет.
Я кратко подумал, что вы могли бы отправлять некоторое хэш-значение вместе с каждой раздачей, связанной с генератором случайных чисел, чтобы программа на принимающей стороне могла проверить, соответствует ли хэш отправленной карте. Предполагая, что хэш генерируется каким-либо безопасным алгоритмом шифрования, дилеру может быть сложно заменить карту и сгенерировать поддельный хэш-код, который соответствовал отправленной им карте. Но это было бы легко обойти: дилер мог бы просто запустить программу раздачи несколько сотен раз, получить список действительных сделок и хэш-кодов, а затем выбрать одну из них для отправки.
Возможно, вы могли бы попросить игроков отправить токен, который учитывается в генераторе случайных чисел. Но я не могу придумать реальный алгоритм для включения такого токена, который не может быть побежден системой дилера, просто повторяющей любые вычисления, выполняемые с токеном.
Ответ №3:
Если вы отправите начальное значение, то любой игрок сможет узнать, какие карты на руках у любого другого игрока. Кроме того, дилер может выбрать семена, которые он рассылает, в свою пользу.
Если вы отправляете карты от дилера, то дилер знает, что у каждого на руках. Либо используйте центральный сервер, либо используйте какой-нибудь криптограф, как предлагает ответ Ника