http://akhtyrka.livejournal.com/ (
akhtyrka.livejournal.com) wrote in
useless_faq2014-11-03 08:37 pm
Онлайн покер
Играл в покер. Техасский холдем.
Сначала игроки получают по 2 карты
потом открывается 3 на столе (флоп)
потом еще одна (терн)
и потом последняя (ривер).
Стало интересно, в какой момент компьютер/сервер знает какие выпадут карты?
Непосредственно перед открытием очередной порции карт на столе?
Или в самом начале раздачи сервер исход партии уже предопределен, если, конечно, никто не скажет "пас".
Сначала игроки получают по 2 карты
потом открывается 3 на столе (флоп)
потом еще одна (терн)
и потом последняя (ривер).
Стало интересно, в какой момент компьютер/сервер знает какие выпадут карты?
Непосредственно перед открытием очередной порции карт на столе?
Или в самом начале раздачи сервер исход партии уже предопределен, если, конечно, никто не скажет "пас".
no subject
Но она тоже не гарантирует отсутствие подтасовок при генерировании колоды. И не гарантирует отсутствия "подглядывания", а это в покере мухлёж как бы не более серьёзный, чем просто подтасовка.
И опять же: "если (!) сервер предоставляет подпись колоды" - предоставляют не все.
В общем, зависит от реализации, и для мухлежа простор всегда остаётся.
no subject
не, ну само собой, что должны использоваться некие стандартные способы.
> Но она тоже не гарантирует отсутствие подтасовок при генерировании колоды.
Можно подумать насчёт совместной генерации колоды карт, когда никто из участников в отдельности не знает расклад.
Что-то вроде:
0. На старте колода карт в любом порядке.
1. каждый участник генерирует 52 случайных числа
2. когда нужно открыть карту каждый участник отсылает очередное число на сервер (подпись не помешает)
3. Сервер рассылает набор чисел каждому участнику
4. Каждый участник XOR-ит все числа и выбирает карту из колоды
№ карты = (p1 xor p2 xor p3 ... xor pn) % (оставшееся число карт)
no subject
Но в плане реализации всё равно многое будет зависеть от реализаторов. В частности не так просто придумать способ не дать реализаторам возможности подсматривать карты соперников.
no subject
вот у меня на компе крутиться клиент, он сгенерировал 52 числа.
как теперь кто-то с другого компа может их подсмотреть?
при это я предполагаю, что код клиента не содержит всяких backdoor-ов, так как проверяется всякими сертифицирующими конторами.
no subject
Значит тут два варианта:
1) либо все игроки о старта отправили по паре чисел, из которых сервер может вычислить какие у них карты -- и тогда сервер может рассказать об этих картах своим людям.
2) либо игроки сами сгенерировали свои карты и как-то зашифровали их так, что сервер их не знает. Тогда есть два момента:
2а) вероятно каждый игрок сможет подделывать свои карты вплоть до раскрытия;
2б) вероятно каждый игрок сможет влиять на последующий расклад колоды (скрывая свои карты) - ведь в колоде не может выпасть карта, которая у него на руках. Тут либо кому-то доверять карты на руках, либо способ должен быть ОЧЕНЬ хитрым - я не вижу как. :)
no subject
так я ж описал способ.
фишка в том, что:
1. все участники случайным образом влияют на выбор очередной карты (xor чисел со всех клиентов)
2. сервер собирает очередные числа со всех участников и только потом рассылает их
т.е. клиент конечно может менять своё число как ему вздумается, но не зная чисел других игроков он не может предугадать что это даст.
когда участник узнаёт числа других игроков - он уже не может изменить своё - его он уже отправил на сервер.
Я тут ещё подумал... Сервер может отправить "особому клиенту" список чисел до публикации их всем остальным дав клиенту шанс выбрать любую карту. это можно решить изменением в моём алгоритме:
Шаг 2а:
клиенты обмениваются хэшами зашифрованных очередных чисел.
После того как у каждого клиента будет N хешей от всех остальных участников:
* участник не может поменять выбор числа
* участник не может вычислить число других участников.
Шаг 2б:
клиенты обмениваются числами и ключами которыми шифровали свои числа.
каждый участник может проверить что остальные не мухлевали.
no subject
Есть две конфликтующие задачи:
1) сервер не должен знать карты игроков (иначе он сможет выдать их соперникам)
2) сервер должен выбирать карту из колоды так, чтобы она не совпадала с картами на руках.
Ну и естественно сервер не должен допускать вычисление карт у соперников на руках. Нельзя доверить раздачу карт ни одному из игроков.
no subject
надо ещё подумать.
no subject
1. Сервер берёт колоду, тасует.
Каждую карту шифрует отдельным одноразовым ключом. К зашифрованной карте добавляет идентификатор участника, индекс ключа для расшифровки, хэш ключа для расшифровки.
Зашифрованные карты передаются первому участнику.
Каждый игрок по очереди производит аналогичные действия:
тасует уже зашифрованные карты, шифрует каждую карту одноразовым ключом, добавляет идентификатор участника, индекс ключа, хэш.
После полного круга никто не может сказать где какая карта находится. Что бы раскрыть карту нужны ключи всех игроков.
2. Первый игрок берёт 6 зашифрованных карт и запрашивает у остальных ключи для расшифровки.
Теперь этот (и только этот) игрок может расшифровать карты в своих руках.
Все остальные игроки производят аналогичные действия.
3. Выкладывание общих карт.
Выбираем 3 следующие карты, все публикуют ключи расшифровки карт всем.
В итоге все видят 3 карты "на столе".
4. "Вскрытие" карт происходит путём публикации своих ключей расшифровки для соответствующей карты.
no subject
1) сервер тасует колоду и шифрует каждую карту своим серверным ключом.
2) каждый игрок по очереди шифрует каждую карту своими ключами
3) чтобы расшифровать что-либо игроки должны расшифровать кодированные карты и отдать серверу для окончательной расшифровки. Сервер дорасшифровывает карты и "видит" их. Может выдать кому угодно.
И как мы раздадим игрокам начальный карты в руки так, чтобы игроки свои карты видели, а сервер не мог их выдать соперникам?
no subject
нет. карту в руке расшифровывает только сам клиент. для этого ему нужны ключи всех участников + свой ключ.
сервер и все клиенты должны опубликовать ключи от карт розданных другим игрокам.
Как только клиент опубликует свой ключ - он "вскрывается" и все могут увидеть карту.
no subject
Игрок А смотрит на неё и видит, что она зашифрована всеми игроками и сервером. Чтобы узнать что за карту он получил, он ОБЯЗАН спросить у сервера ключи и номер ключа этой карты. Ключ и номер ключа у этой карты уникальны, и сервер знает у какой карты какой ключ. По номеру ключа сервер сразу узнает какая карта у игрока. Точка.
Публиковать/раздавать ВСЕ ключи сервер не может, потому что с тем же успехом он мог и не шифровать ничего.
no subject
Э.. минуточку. Алгортим видимо неверно понят.
> Допустим сервер выдал карту игроку А.
да.
> Чтобы узнать что за карту он получил, он ОБЯЗАН спросить у сервера ключи и номер ключа этой карты
он спрашивает ключ у каждого игрока. сервер не хранит все ключи - только свой.
получив все ключи, он добавляет свой и расшифровывает карту.
> Ключ и номер ключа у этой карты уникальны
у карты N ключей - по числу участников. каждый частник знает только свой ключ
> Публиковать/раздавать ВСЕ ключи сервер не может
потому что у него их нет
no subject
Есть карты. К1, К2, ...К52. Тасуем.
Сервер их шифрует, каждую другим ключом, получает (ключ1, Шифр.карта1), (ключ2,Ш2), ...
Потом отдаёт эти (1), (2), .... игрокам, они шифруют это своими ключами.
Потом игрок А говорит серверу: "Я хочу расшифровать карту №27, дай свой ключ!" и всё, сервер может помнить, какая карта была на 27 месте.
Конец игры.
no subject
Сервер исключаем для простоты - все игроки равноправны.
1. Первый игрок (сдающий) берёт колоду, шифрует ключом K1 все карты, тасует, передаёт следующему.
Аналогично по кругу.
2. Сдающий видит шифрованные карты и не может определить где какая.
3. Прогоняем вышеописанный алгоритм начиная со сдающего (ключ для каждой карты для каждого игрока)
4. Последний круг - все по очереди расшифровывают колоду ключом K1 ... KN
=>
итого никто не шифровал открытую колоду/
Теперь если игрок A просит у "сдающего" ключ №27 сдающий по нему может только вспомнить карту зашифрованную ключами K1 - KN. Что ему вроде бы ничего не даёт.
no subject
no subject
Этот ключ используется только на этапе тасовки карт и потом просто выкидывается.
А дальше используется мой предыдущий алгоритм.
no subject
В любом случае есть человек зашифровавший карты и всегд есть другой человек, которому нужна помощь первого для расшифровки. После чего либо первый знает карты второго, либо второй, зная ключ первого ко всем картам знает карты всех игроков, как-то так.
Но сначала хотелось бы понять алгоритм. Скажем на примере двух игроков и колоды из четырёх карт, из которых по одной надо раздать на руки игрокам.
no subject
Ок.
Игроки PlayerA, PlayerB. Карты C1, C2, C3, C4. Сервер участвует только как место для обмена информации и в общем случае не нужен.
1.
PlayerA: создаёт ключи KA, KA1, KA2, KA3, KA4
PlayerB: создаёт ключи KB, KB1, KB2, KB3, KB4
2. PlayerA - раздающий.
PlayerA тасует карты и шифрует каждую ключом KA
[ KA(C4) ]
[ KA(C2) ]
[ KA(C3) ]
[ KA(C1) ]
передаёт их дальше
PlayerB тасует шифрованные карты и шифрует каждую ключом KB
[ KB(KA(C4)) ]
[ KB(KA(C3)) ]
[ KB(KA(C2)) ]
[ KB(KA(C1)) ]
публикует карты (выкладывает на сервер/рассылает всем участникам)
3.
PlayerA тасует шифрованные карты, шифрует каждую отдельным ключом, добавляет информацию о ключе в карту
[ KA1(KB(KA(C3))), AKI=1, AKH1=H(AK1) ]
[ KA2(KB(KA(C2))), AKI=2, AKH2=H(AK2) ]
[ KA3(KB(KA(C1))), AKI=3, AKH3=H(AK3) ]
[ KA4(KB(KA(C4))), AKI=4, AKH4=H(AK4) ]
передаёт их дальше
PlayerB тасует шифрованные карты, шифрует каждую отдельным ключом, добавляет информацию о ключе в карту
[ KB1(KA3(KB(KA(C1)))), AKI=3, AKH3=H(AK3), BKI=1, BKH1=H(BK1) ]
[ KB2(KA1(KB(KA(C3)))), AKI=1, AKH1=H(AK1), BKI=2, BKH2=H(BK2) ]
[ KB3(KA2(KB(KA(C2)))), AKI=2, AKH2=H(AK2), BKI=3, BKH3=H(BK3) ]
[ KB4(KA4(KB(KA(C4)))), AKI=4, AKH4=H(AK4), BKI=4, BKH4=H(BK4) ]
публикует карты
4.
PlayerA дешифрует каждую карту ключом KA
[ KB1(KA3(KB(C1))), AKI=3, AKH3=H(AK3), BKI=1, BKH1=H(BK1) ]
[ KB2(KA1(KB(C3))), AKI=1, AKH1=H(AK1), BKI=2, BKH2=H(BK2) ]
[ KB3(KA2(KB(C2))), AKI=2, AKH2=H(AK2), BKI=3, BKH3=H(BK3) ]
[ KB4(KA4(KB(C4))), AKI=4, AKH4=H(AK4), BKI=4, BKH4=H(BK4) ]
забывает ключ KA, передаёт карты дальше
PlayerB дешифрует каждую карту ключом KB
[ KB1(KA3(C1)), AKI=3, AKH3=H(AK3), BKI=1, BKH1=H(BK1) ]
[ KB2(KA1(C3)), AKI=1, AKH1=H(AK1), BKI=2, BKH2=H(BK2) ]
[ KB3(KA2(C2)), AKI=2, AKH2=H(AK2), BKI=3, BKH3=H(BK3) ]
[ KB4(KA4(C4)), AKI=4, AKH4=H(AK4), BKI=4, BKH4=H(BK4) ]
забывает ключ KB, публикует карты
== > создание колоды завершено. каждый участник видит шифрованную колоду.
5. Сдача карт.
PlayerA берёт из колоды карту [ KB1(KA3(C1)), AKI=3, AKH3=H(AK3), BKI=1, BKH1=H(BK1) ]
PlayerB берёт из колоды карту [ KB2(KA1(C3)), AKI=1, AKH1=H(AK1), BKI=2, BKH2=H(BK2) ]
6.
PlayerA запрашивает у PlayerB ключ с индексом 1 (BKI=1) - KB1
PlayerB запрашивает у PlayerA ключ с индексом 1 (AKI=1) - KA1
Игроки проверяют переданные ключи путём их хеширования и сравненя с хешами в картах
Игроки расшифровывают свои карты, так как имеют все нужные ключи
PlayerA - [ C1, ... ]
PlayerB - [ C3, ... ]
== > в колоде осталось 2 карты. каждый игрок видит только свою карту.
no subject
Как из
[ KB1(KA3(KB(KA(C1)))), AKI=3, AKH3=H(AK3), BKI=1, BKH1=H(BK1) ]
получить (при наличии КА но отсутствии КВ1, КА3 и КВ1 )
[ KB1(KA3(KB(C1))), AKI=3, AKH3=H(AK3), BKI=1, BKH1=H(BK1) ] ?
Разве что "шифрование" через "xor", но боюсь, что "xor" не очень хорошая идея. А в других случаях шифры подобного не позволяют.
Почему "xor" не очень хорошая идея? Потому что имея (x xor k) и (x) можно узнать (k)
И ещё, если В не шифрует АКИ, то А сразу видит какие у В карты.
Дальше не смотрел.
no subject
Именно через него. Все шифры должны быть потоковыми что бы была возможность применять шифры в любом порядке.
> имея (x xor k) и (x) можно узнать (k)
не понял сути атаки? кто и что узнает PlayerA или PlayerB?
PlayerB видит (x xor k) но не знает (x), так как PlayerA перетасовал карты.
PlayerA аналогично.
> И ещё, если В не шифрует АКИ, то А сразу видит какие у В карты.
Почему видит? Единственное что A может узнать по индексу шрифта это KB(KA(C3))
KA известно
KB - нет.
(no subject)
(no subject)
(no subject)
(no subject)
no subject
1) я тут подумал - сервер тут вообще говоря не обязателен. любой игрок по очереди может играть роль начального тасующего.
2) и тасует шифрованные карты. иначе сервер (или очередной раздающий) будет знать порядок карт.
no subject
игрок Б хочет узнать свои карты - он ДОЛЖЕН спросить у А пару ключей, которые уникальны для каждой карты. Всё. Игрок А знает карты игрока Б просто потому, что знает какие ключи у него спрашивали.
И неважно кто тут в роли сервера.
no subject
Да, надо ещё подумать.
no subject