Алгоритмы карточных игр с применением криптографии без односторонних функций

Проект подготовили студенты группы 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

  1. Узел \(P_1\) начинает алгоритм с "лишнего" значения \(m = 0\) и отправляет его \(P_2\).
  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

  1. Описанный в пункте 2 алгоритм повторяет каждый узел до тех пор, пока у каждого участника не будет \(s\) значений (не считая \(0\)). Если у узла уже имеется \(s\) чисел, то он "пропускает ход", просто передавая полученное значение следующему узлу, пока остальные участники не доберут \(s\) чисел.

Обозначения

\(s\) - количество чисел, которые получит каждый игрок

13/37

  1. Когда один из игроков забирает себе последнее значение из \(s\) возможных, он передает его далее, как будто он не забирал его себе.
  2. Алгоритм прекращает свою работу, когда последнее значение из возможных \(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

Цель: перетасовать карты методом Кнута.

  1. \(P_i\) начинает выполнение протокола, сообщая об этом остальным
  2. Все игроки заводят счетчик \(q = 1\) и начинают проверять общий канал связи на наличие чисел
  3. \(P_i\) выполняет протокол \(N2.1\), получая позицию карты, которую все узлы меняют с картой на позиции \(q\), увеличивая \(q\) на 1.
  4. Шаг 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]\)

  1. \(P_{i-1}\) и \(P_{i+1}\) тайно и независимо генерируют значения \(n_{i-1}\) и \(n_{i+1}\) по модулю числа \(M\).
  2. \(P_{i-1}\) и \(P_{i+1}\) передают свои \(n_{i-1}\) и \(n_{i+1}\) узлу \(P_i\).
  3. \(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\) - количество карт в колоде

  1. \(P_{i-1}\) и \(P_{i+1}\) независимо генерируют значения \(n_{i-1}\) и \(n_{i+1}\) по модулю числа \(M\).
  2. \(P_{i-1}\) и \(P_{i+1}\) передают свои \(n_{i-1}\) и \(n_{i+1}\) всем узлам.
  3. \(P_i\) складывает полученные числа и сохраняет себе сумму \(n_i = (n_{i-1} + n_{i+1}) \mod M\).
  4. \(P_i\) передает число \(n_i\) всем узлам, которые выполняют проверку.

20/37

Протокол \(\mathsf{N3}\)

21/37

Цель: секретно взять \(k\) карт из колоды.

  1. Добрать \(k\) карт из множества \(K\),
    соответствующие свободным индексам
  2. Если индексы закончились, то
    • Собрать свободные индексы у всех игроков
    • Составить новое множество \(K\) из карт, находящихся на позициях полученных индексов
      • Если индексов достаточно мало, то смешать \(K\) с \(N\) \(^*\)
    • Выполнить протокол \(N0\) для \(s = M/n\)
  3. Добрать оставшиеся карты

Обозначения

\(K\) - множество карт добора
\(M\) - количество карт в колоде \(K\)

\(N\) - множество карт сброса

\(*\) - если правила игры позволяют.

22/37

Взрывные котята

23/37

Обозначения:

\(n\) - количество игроков \((2 \le n \le 5)\)

\(K\) - множество карт колоды (\(\tilde K = 56\))

\(N\) - множество карт сброса

Протокол

24/37

Обозначения:

\(n\) - количество игроков

\(K\) - множество карт добора

  1. Игрок-инициатор начинает игру, сообщая об этом остальным.
  2. Все игроки собирают новую колоду \(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

  1. Каждый игрок забирает одну зеленую карту без удаления ее из колоды (это выполнимо, так как в шаге 2 зеленых карт в колоде \(6 - n\)).
  2. Выполняется тасование (протокол \(N1\)).
  3. Игроки выбирают участника, который сделает первый ход, выбирая случайную карту с помощью протокола \(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

  1. Игрок \(P_i\) начинает игру, о чем сообщает остальным
  2. Выполняются протоколы \(N0\) (для \(s = \tilde K/n\)) и \(N1\), после чего игроки берут \(m\) карт
  3. Выбирается игрок \(P_i\), который делает первый ход и передает его следующему \(P_{i+1}\)

Обозначения

\(\tilde K\) - количество карт во множестве добора

\(n\) - число игроков

\(m\) - начальное число карт на руках у игрока

\(N0\) - протокол выдачи s чисел игрокам

\(N1\) - протокол тасования

30/37

  1. Игрок \(P_i\) проверяет возможность выполнения хода:
    • Если такая возможность есть, то он выкидывает карту, а ход передается следующему
    • Иначе выполняется протокол \(N3\) для \(k = 1\):
      • Если после взятия карты ход возможен, он ее выкидывает и передает ход следующему игроку
      • Иначе передает ход игроку \(P_{i+1}\)

Обозначения

\(L_i\) - множество карт, которые игрок взять не может

\(N3\) - протокол добора \(k\) карт

Примечание: каждая выброшенная карта игроком \(P_i\) заносится во множество \(L_i\).

31/37

32/37

Спасибо за внимание!

Честность

Возможные варианты лжи

  1. Игрок взял не свою карту
  2. Игрок выкинул не свою карту
  3. Игрок заявил, что выкинутая карта другого игрока принадлежит ему

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