Алгоритмы карточных игр с применением криптографии без односторонних функций
Проект подготовили студенты группы 0372
Жуков Владимир Андреевич
Пахаревская Элина Станиславовна
1/37
Научный руководитель
Дужин Василий Сергеевич
Данная работа выполнена с использованием материалов статьи "Secrecy without one-way functions" (D. Grigoriev, V. Shpilrain, 2013)
2/37
Роли членов команды
Пахаревская Элина:
- презентация
- алгоритмы
Жуков Владимир:
- презентация
- алгоритмы
3/37
Содержание
Цель...........................................................................................................................5
Что такое односторонние функции?..................................................................6
Вспомогательные протоколы..............................................................................9
Протокол N0.......................................................................................................10
Протокол N1.......................................................................................................15
Протокол N2.......................................................................................................17
Протокол N2.1....................................................................................................19
Протокол N3.......................................................................................................21
Взрывные котята...................................................................................................23
Уно!...........................................................................................................................28
Опциональный раздел.........................................................................................33
4/37
Рассмотреть практическое применение протоколов без односторонних функций в реализациях двух карточных игр разного уровня сложности интерпретации на язык криптографии с соблюдением честности игроков.
5/37
Цель
Что такое односторонние функции?
6/37
Односторонняя функция - это функция, которую довольно легко вычислить, но трудно* найти по значению функции соответствующее значение аргумента.
*Под «трудно найти» нужно понимать как: потребуется не один год расчетов с использованием ЭВМ.

7/37
Базовые протоколы:
1. N0 - распределение чисел
2. N1 - тасование колоды
3. N2, N2.1 - коллективная генерация числа
4. N3 - добор карт из колоды
Игры:
1. Взрывные котята
2. Уно
Во всех описанных протоколах подразумевается следующее:
- все узлы находятся в широковещательной сети, причем каждый включен в замкнутую цепь \(P_1 \rightarrow P_2 \rightarrow \dots \rightarrow P_n \rightarrow P_1\) защищенных каналов связи, что необходимо для предотвращения перехвата данных
- каждый узел в точности выполняют поставленные каждому из них в протоколе задачи
- случаи, когда игроки объединяются, не учитываются
8/37
Вспомогательные протоколы
9/37
Протокол \(\mathsf{N0}\)
10/37
Цель: распределить числа от \(1\) до \(s*n\) между \(n\) игроками так, чтобы у каждого было \(s\) чисел, причем никто другой не знал какие.
Обозначения
\(P_i\) - игрок с индексом \(i\)
\(m\) - текущее число
\(s\) - количество чисел, которые получит каждый игрок
\(q_i\) - счетчик получения числа \(m\)
\(N\) - натуральное число, выбираемое участниками перед выполнением алгоритма
\(c_i\) - максимальное значение \(q_i\) (\(1 \le c_i \le N, c_i \in Z\))
\(n\) - количество игроков
11/37
- Узел \(P_1\) начинает алгоритм с "лишнего" значения \(m = 0\) и отправляет его \(P_2\).
- \(P_2\) отправляет \(P_3\) одно из двух значений: \(m\) или \(m+1\) по следующей схеме:
- если узел \(P_i\) встречает число впервые, то он отправляет \(m\) узлу \(P_{i+1}\) и генерирует новое значение счетчика \(c_i\), запоминая факт получения \(m\) (\(q_i = 1\));
- если узел \(P_i\) встречает число меньшее или равное количество раз счетчику \(c_i\) (\(q_i \le c_i\)), то он передает \(m\) узлу \(P_{i+1}\);
- если узел \(P_i\) встречает число большее количество раз, чем значение счетчика \(c_i\) (\(q_i \gt c_i\)), то он забирает себе число \(m\) и передает \(m+1\) узлу \(P_{i+1}\).
Обозначения
\(P_i\) - игрок с индексом \(i\)
\(m\) - текущее число
\(q_i\) - счетчик получения числа \(m\)
\(c_i\) - максимальное значение \(q_i\) (\(1 \le c_i \le N, c_i \in Z\))
12/37
- Описанный в пункте 2 алгоритм повторяет каждый узел до тех пор, пока у каждого участника не будет \(s\) значений (не считая \(0\)). Если у узла уже имеется \(s\) чисел, то он "пропускает ход", просто передавая полученное значение следующему узлу, пока остальные участники не доберут \(s\) чисел.
Обозначения
\(s\) - количество чисел, которые получит каждый игрок
13/37
- Когда один из игроков забирает себе последнее значение из \(s\) возможных, он передает его далее, как будто он не забирал его себе.
- Алгоритм прекращает свою работу, когда последнее значение из возможных \(n*s\) проходит \(N+1\) циклов.
Обозначения
\(s\) - количество чисел, которые получит каждый игрок
\(n\) - количество игроков
\(c_i\) - максимальное число раз, когда игрок получает текущее число \(m\) (\(1 \le c_i \le N, c_i \in Z\))
14/37
Протокол \(\mathsf{N1}\)
15/37
Цель: перетасовать карты методом Кнута.
- \(P_i\) начинает выполнение протокола, сообщая об этом остальным
- Все игроки заводят счетчик \(q = 1\) и начинают проверять общий канал связи на наличие чисел
- \(P_i\) выполняет протокол \(N2.1\), получая позицию карты, которую все узлы меняют с картой на позиции \(q\), увеличивая \(q\) на 1.
- Шаг 3 выполняется игроком \(P_{i+1}\), пока \(q \neq M\).
Обозначения
\(M\) - количество карт
\(N2.1\) - протокол коллективной генерации случайного числа
16/37
Протокол \(\mathsf{N2}\)
17/37
Цель: секретно сгенерировать случайное число с помощью смежных узлов.
Обозначения
\(n\) - Количество узлов
\(n_i\) - случайно сгенерированное число узлом \(i\)
\(M\) - количество карт в колоде
\(P_i\) - узел под номером \(i\), \(i \in [1, n]\)
- \(P_{i-1}\) и \(P_{i+1}\) тайно и независимо генерируют значения \(n_{i-1}\) и \(n_{i+1}\) по модулю числа \(M\).
- \(P_{i-1}\) и \(P_{i+1}\) передают свои \(n_{i-1}\) и \(n_{i+1}\) узлу \(P_i\).
- \(P_i\) складывает полученные числа и сохраняет себе сумму \(n_i = (n_{i-1} + n_{i+1}) \mod M\).
18/37
Протокол \(\mathsf{N2.1}\)
19/37
Цель: cгенерировать случайное число с помощью смежных узлов так, чтобы узел не мог сделать это нечестным образом (например, заменить его на свое).
Обозначения
\(n_i\) - случайно сгенерированное число узла \(i\)
\(n\) - количество узлов
\(M\) - количество карт в колоде
- \(P_{i-1}\) и \(P_{i+1}\) независимо генерируют значения \(n_{i-1}\) и \(n_{i+1}\) по модулю числа \(M\).
- \(P_{i-1}\) и \(P_{i+1}\) передают свои \(n_{i-1}\) и \(n_{i+1}\) всем узлам.
- \(P_i\) складывает полученные числа и сохраняет себе сумму \(n_i = (n_{i-1} + n_{i+1}) \mod M\).
- \(P_i\) передает число \(n_i\) всем узлам, которые выполняют проверку.
20/37
Протокол \(\mathsf{N3}\)
21/37
Цель: секретно взять \(k\) карт из колоды.
- Добрать \(k\) карт из множества \(K\),
соответствующие свободным индексам - Если индексы закончились, то
- Собрать свободные индексы у всех игроков
- Составить новое множество \(K\) из карт, находящихся на позициях полученных индексов
- Если индексов достаточно мало, то смешать \(K\) с \(N\) \(^*\)
- Выполнить протокол \(N0\) для \(s = M/n\)
- Добрать оставшиеся карты
Обозначения
\(K\) - множество карт добора
\(M\) - количество карт в колоде \(K\)
\(N\) - множество карт сброса
\(*\) - если правила игры позволяют.
22/37
Взрывные котята
23/37
Обозначения:
\(n\) - количество игроков \((2 \le n \le 5)\)
\(K\) - множество карт колоды (\(\tilde K = 56\))
\(N\) - множество карт сброса
Протокол
24/37
Обозначения:
\(n\) - количество игроков
\(K\) - множество карт добора
- Игрок-инициатор начинает игру, сообщая об этом остальным.
- Все игроки собирают новую колоду \(K\) в зависимости от значения \(n\):
- Если \(n \ge 4\): \(\tilde K = 46 + (6 - n) + (n - 1) = 51\)
- Если \(n \le 3\): \(\tilde K = 46 + 2 + (n - 1) = 47 + n\ (\tilde K \in [49, 50])\)
Примечание: карты в колоде \(K\) располагаются в порядке: нейтральные, черные, зеленые.
25/37
- Каждый игрок забирает одну зеленую карту без удаления ее из колоды (это выполнимо, так как в шаге 2 зеленых карт в колоде \(6 - n\)).
- Выполняется тасование (протокол \(N1\)).
- Игроки выбирают участника, который сделает первый ход, выбирая случайную карту с помощью протокола \(N2.1\) (карта же удаляется из \(K\)).
Обозначения
\(n\) - количество игроков
\(K\) - множество карт добора
\(N1\) - протокол тасования
\(N2.1\) - протокол генерации случайного числа с помощью смежных узлов
26/37
После чего участник делает проверку:
- Если карта нейтральная, он помещает ее во множество \(N\)
- Если карта зеленая, он забирает ее
- Если карта черная, он проверяет наличие у себя зеленой карты:
- Если она есть, то она помещается в \(N\), а черная возвращается на исходное место (для больше случайности можно выполнить протокол N1, но это не обязательно)
- Если ее нет, то игрок выбывает
Обозначения
\(N\) - множество карт колоды сброса
\(N1\) - протокол тасования
27/37
"Уно!"
28/37
Протокол
Обозначения
\(n\) - количество игроков
\(m\) - начальное число карт на руках у игрока (\(m = 7\))
\(K\) - множество карт "прикуп" (\(\tilde K = 108\))
\(N\) - множество карт "сброс"
\(Q_i\) - множество карт, имеющиеся на руках игроков
\(L_i\) - множество карт, которые игрок взять не может
29/37
- Игрок \(P_i\) начинает игру, о чем сообщает остальным
- Выполняются протоколы \(N0\) (для \(s = \tilde K/n\)) и \(N1\), после чего игроки берут \(m\) карт
- Выбирается игрок \(P_i\), который делает первый ход и передает его следующему \(P_{i+1}\)
Обозначения
\(\tilde K\) - количество карт во множестве добора
\(n\) - число игроков
\(m\) - начальное число карт на руках у игрока
\(N0\) - протокол выдачи s чисел игрокам
\(N1\) - протокол тасования
30/37
- Игрок \(P_i\) проверяет возможность выполнения хода:
- Если такая возможность есть, то он выкидывает карту, а ход передается следующему
- Иначе выполняется протокол \(N3\) для \(k = 1\):
- Если после взятия карты ход возможен, он ее выкидывает и передает ход следующему игроку
- Иначе передает ход игроку \(P_{i+1}\)
Обозначения
\(L_i\) - множество карт, которые игрок взять не может
\(N3\) - протокол добора \(k\) карт
Примечание: каждая выброшенная карта игроком \(P_i\) заносится во множество \(L_i\).
31/37
32/37
Спасибо за внимание!
Честность
Возможные варианты лжи
- Игрок взял не свою карту
- Игрок выкинул не свою карту
- Игрок заявил, что выкинутая карта другого игрока принадлежит ему
33/37
Игрок взял не свою карту
Решение
Ложь выявится в процессе игры: когда он выкинет эту карту, другой игрок заметит, что индекс этой карты принадлежит ему, о чем сообщит остальным.
34/37
Игрок выкинул не свою карту
Решение
Как только игрок выкинет не свою карту, другой игрок это заметит и сообщит остальным.
35/37
Игрок заявил, что выкинутая карта другого игрока принадлежит ему
Решение
Оба игрока сообщают свои счетчики \(q_i\) и \(q_j\), соответствующие карте и сгенерированные в процессе выполнения протоколов \(N0\) или \(N3\). У кого его не будет или он окажется больше, тот и лжет.
Если же так получилось, что эти числа равны, то игру начинают заново, потому что определение лжеца не представляется возможным.
36/37
Вариант реализации честной игры
Все действия, совершаемые игроками, на любом этапе игры и выполнении любого протокола, записываются в логи. Они позволяют согласовать состояние всей системы и обнаружить игроков, играющих нечестно.
37/37
Copy of No one-way functions card games algorithms
By Vladimir Z
Copy of No one-way functions card games algorithms
- 185