http://akhtyrka.livejournal.com/ ([identity profile] akhtyrka.livejournal.com) wrote in [community profile] useless_faq2014-11-03 08:37 pm

Онлайн покер

Играл в покер. Техасский холдем.
Сначала игроки получают по 2 карты
потом открывается 3 на столе (флоп)
потом еще одна (терн)
и потом последняя (ривер).
Стало интересно, в какой момент компьютер/сервер знает какие выпадут карты?
Непосредственно перед открытием очередной порции карт на столе?
Или в самом начале раздачи сервер исход партии уже предопределен, если, конечно, никто не скажет "пас".

[identity profile] azarkevich.livejournal.com 2014-11-20 03:02 pm (UTC)(link)
Новый алгоритм.

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

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

После полного круга никто не может сказать где какая карта находится. Что бы раскрыть карту нужны ключи всех игроков.

2. Первый игрок берёт 6 зашифрованных карт и запрашивает у остальных ключи для расшифровки.
Теперь этот (и только этот) игрок может расшифровать карты в своих руках.

Все остальные игроки производят аналогичные действия.

3. Выкладывание общих карт.

Выбираем 3 следующие карты, все публикуют ключи расшифровки карт всем.
В итоге все видят 3 карты "на столе".

4. "Вскрытие" карт происходит путём публикации своих ключей расшифровки для соответствующей карты.

[identity profile] lazylonelion.livejournal.com 2014-11-20 03:11 pm (UTC)(link)
переформулирую проще:
1) сервер тасует колоду и шифрует каждую карту своим серверным ключом.
2) каждый игрок по очереди шифрует каждую карту своими ключами
3) чтобы расшифровать что-либо игроки должны расшифровать кодированные карты и отдать серверу для окончательной расшифровки. Сервер дорасшифровывает карты и "видит" их. Может выдать кому угодно.

И как мы раздадим игрокам начальный карты в руки так, чтобы игроки свои карты видели, а сервер не мог их выдать соперникам?

[identity profile] azarkevich.livejournal.com 2014-11-20 03:17 pm (UTC)(link)
> отдать серверу для окончательной расшифровки.

нет. карту в руке расшифровывает только сам клиент. для этого ему нужны ключи всех участников + свой ключ.

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

Как только клиент опубликует свой ключ - он "вскрывается" и все могут увидеть карту.
Edited 2014-11-20 15:18 (UTC)

[identity profile] lazylonelion.livejournal.com 2014-11-20 03:22 pm (UTC)(link)
Допустим сервер выдал карту игроку А.
Игрок А смотрит на неё и видит, что она зашифрована всеми игроками и сервером. Чтобы узнать что за карту он получил, он ОБЯЗАН спросить у сервера ключи и номер ключа этой карты. Ключ и номер ключа у этой карты уникальны, и сервер знает у какой карты какой ключ. По номеру ключа сервер сразу узнает какая карта у игрока. Точка.

Публиковать/раздавать ВСЕ ключи сервер не может, потому что с тем же успехом он мог и не шифровать ничего.

[identity profile] azarkevich.livejournal.com 2014-11-20 03:26 pm (UTC)(link)
> Точка.
Э.. минуточку. Алгортим видимо неверно понят.

> Допустим сервер выдал карту игроку А.
да.

> Чтобы узнать что за карту он получил, он ОБЯЗАН спросить у сервера ключи и номер ключа этой карты
он спрашивает ключ у каждого игрока. сервер не хранит все ключи - только свой.
получив все ключи, он добавляет свой и расшифровывает карту.

> Ключ и номер ключа у этой карты уникальны
у карты N ключей - по числу участников. каждый частник знает только свой ключ

> Публиковать/раздавать ВСЕ ключи сервер не может
потому что у него их нет
Edited 2014-11-20 15:27 (UTC)

[identity profile] lazylonelion.livejournal.com 2014-11-20 03:31 pm (UTC)(link)
ты всё ещё не понял своей проблемы.

Есть карты. К1, К2, ...К52. Тасуем.
Сервер их шифрует, каждую другим ключом, получает (ключ1, Шифр.карта1), (ключ2,Ш2), ...

Потом отдаёт эти (1), (2), .... игрокам, они шифруют это своими ключами.

Потом игрок А говорит серверу: "Я хочу расшифровать карту №27, дай свой ключ!" и всё, сервер может помнить, какая карта была на 27 месте.

Конец игры.

[identity profile] azarkevich.livejournal.com 2014-11-20 03:55 pm (UTC)(link)
Ладно. Следующая попытка.

Сервер исключаем для простоты - все игроки равноправны.

1. Первый игрок (сдающий) берёт колоду, шифрует ключом K1 все карты, тасует, передаёт следующему.
Аналогично по кругу.

2. Сдающий видит шифрованные карты и не может определить где какая.

3. Прогоняем вышеописанный алгоритм начиная со сдающего (ключ для каждой карты для каждого игрока)

4. Последний круг - все по очереди расшифровывают колоду ключом K1 ... KN

=>

итого никто не шифровал открытую колоду/

Теперь если игрок A просит у "сдающего" ключ №27 сдающий по нему может только вспомнить карту зашифрованную ключами K1 - KN. Что ему вроде бы ничего не даёт.
Edited 2014-11-20 15:56 (UTC)

[identity profile] lazylonelion.livejournal.com 2014-11-20 03:59 pm (UTC)(link)
я не понял, ключ один для всех карт но разный у каждого игрока?

[identity profile] azarkevich.livejournal.com 2014-11-20 04:02 pm (UTC)(link)
Да.
Этот ключ используется только на этапе тасовки карт и потом просто выкидывается.
А дальше используется мой предыдущий алгоритм.

[identity profile] lazylonelion.livejournal.com 2014-11-20 07:03 pm (UTC)(link)
я даже не понял алгоритм.
В любом случае есть человек зашифровавший карты и всегд есть другой человек, которому нужна помощь первого для расшифровки. После чего либо первый знает карты второго, либо второй, зная ключ первого ко всем картам знает карты всех игроков, как-то так.
Но сначала хотелось бы понять алгоритм. Скажем на примере двух игроков и колоды из четырёх карт, из которых по одной надо раздать на руки игрокам.

[identity profile] azarkevich.livejournal.com 2014-11-21 07:47 am (UTC)(link)
тут тоже самое, только смотреть удобнее - http://shrib.com/yFQ7dBhJ

Ок.
Игроки 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 карты. каждый игрок видит только свою карту.
Edited 2014-11-21 08:01 (UTC)

[identity profile] lazylonelion.livejournal.com 2014-11-21 08:35 am (UTC)(link)
шаг 4:
Как из
[ 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)

И ещё, если В не шифрует АКИ, то А сразу видит какие у В карты.

Дальше не смотрел.

[identity profile] azarkevich.livejournal.com 2014-11-21 09:00 am (UTC)(link)
> Разве что "шифрование" через "xor", но боюсь, что "xor" не очень хорошая идея.
Именно через него. Все шифры должны быть потоковыми что бы была возможность применять шифры в любом порядке.

> имея (x xor k) и (x) можно узнать (k)

не понял сути атаки? кто и что узнает PlayerA или PlayerB?
PlayerB видит (x xor k) но не знает (x), так как PlayerA перетасовал карты.
PlayerA аналогично.

> И ещё, если В не шифрует АКИ, то А сразу видит какие у В карты.
Почему видит? Единственное что A может узнать по индексу шрифта это KB(KA(C3))
KA известно
KB - нет.

[identity profile] lazylonelion.livejournal.com 2014-11-21 09:06 am (UTC)(link)
у В есть X=[KB1(...(KA(C))...)] (то есть (KB1 xor ... xor KA xor C)) и есть Y=[KB1(...(C)...)] (то есть (KB1 xor ... xor C)).

X = Y xor KA

Игроку В было известно X, но не было известно КА. После того как игрок А отдаст ему Y, игрок В сможет узнать КА и расшифровать все карты. Спрашивается - какой был смысл игроку А придумывать шифр КА?

[identity profile] azarkevich.livejournal.com 2014-11-21 09:12 am (UTC)(link)
> у В есть X=[KB1(...(KA(C))...)] и есть Y=[KB1(...(C)...)]

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

[identity profile] lazylonelion.livejournal.com 2014-11-21 09:45 am (UTC)(link)
перетасовка - это вообще большой обман. Если у карт остаются уникальные АКИ, ВКИ в открытом виде...

смотрите, пусть у нас 4 карты, идентифицируем их числом: 1, 2, 3, 4. Пусть КА=5 (0b101 в бинарной системе)

2а) Перетасованные (4,3,2,1) и "зашифрованные" они будут:
4 xor 5 = 1
3 xor 5 = 6
2 xor 5 = 7
1 xor 5 = 4

2б)Игрок Б тасует их (4,7,1,6) и шифрует ключом 2:
4 xor 2 = 6
7 xor 2 = 5
1 xor 2 = 3
6 xor 2 = 4

3а) Игрок А тасует их (5436) и шифрует ключами 1234, добавляет индекс ключа (на хеш пока забьём)
5*1=4 (АК1) (знак умножения вместо xor пишу)
4*2=6 (АК2)
3*3=0 (АК3)
6*4=2 (АК4)

3б) Игрок Б делает то же самое (6042*3456)
6*3=5 (АК2,ВК1)
0*4=4 (АК3,ВК2)
4*5=1 (АК1,ВК3)
2*6=4 (АК4,ВК4)

Присылает игроку А и мы видим жопу.
Игрок А, сволочь, берёт первую "фразу" 5(АК2,ВК1), находит у себя фразу с АК2, и пишет на нычку:
6(АК2) * ВК1 = 5 (АК2,ВК1)
следовательно ВК1=3, и остальные ключи В аналогично.

*** Игрок А знает все индивидуальные ключи игрока Б! ***

Дальше жопа усугубляется.
4а) Игрок А тасует "колоду" (4541, он ЗАЧЕМ, если номера типа ВК3 открытые?) и расшифровывает её ключом КА (5):
4 (АК3,ВК2) * 5 = 1 (АК3,ВК2)
5 (АК2,ВК1) * 5 = 0 (АК2,ВК1)
4 (АК4,ВК4) * 5 = 1 (АК4,ВК4)
1 (АК1,ВК3) * 5 = 4 (АК1,ВК3)

4б) Игрок Б берёт, сволочь, первую карту из колоды, видит там "ВК2", понимает, что там была карта "4", имеет уравнение:
4 * КА = 1, следовательно КА=5, следовательно игрок В уже знает начальную колоду

Аналогично на следующем шаге игрок А узнает КВ

*** теперь игрок А знает ВООБЩЕ ВСЕ КЛЮЧИ ! ***

5а) PlayerB берёт из колоды карту [ KB2(KA1(C3)), AKI=1, AKH1=H(AK1), BKI=2, BKH2=H(BK2) ], иргок А отлично знает ВСЕ ключи, следовательно видит карту.

[identity profile] azarkevich.livejournal.com 2014-11-21 10:18 am (UTC)(link)
Да, пичалька. Видимо не придётся мне в безопасный покер сыграть. :(
Может ещё подумаю на досуге, но пока что сдаюсь.

[identity profile] azarkevich.livejournal.com 2014-11-20 03:22 pm (UTC)(link)
Ещё пару моментов.

1) я тут подумал - сервер тут вообще говоря не обязателен. любой игрок по очереди может играть роль начального тасующего.
2) и тасует шифрованные карты. иначе сервер (или очередной раздающий) будет знать порядок карт.

[identity profile] lazylonelion.livejournal.com 2014-11-20 03:26 pm (UTC)(link)
допустим два игрока зашифровали всё. Сначала игрок А, а потом игрок Б. Кто-то перетасовал и выдал каждому пару карт на руки.

игрок Б хочет узнать свои карты - он ДОЛЖЕН спросить у А пару ключей, которые уникальны для каждой карты. Всё. Игрок А знает карты игрока Б просто потому, что знает какие ключи у него спрашивали.

И неважно кто тут в роли сервера.

[identity profile] azarkevich.livejournal.com 2014-11-20 03:30 pm (UTC)(link)
А, понял. Первый тасующий видел реальные карты и потом по запросам второго игрока может понять.
Да, надо ещё подумать.
Edited 2014-11-20 15:31 (UTC)

[identity profile] lazylonelion.livejournal.com 2014-11-20 03:31 pm (UTC)(link)
именно