Скажем, сервер играет в блэкджек с клиентом, и карты перетасовываются и раздаются сервером. Сама тасовка может быть честной, а может и нет, но необходимо показать, что сданные карты не изменились в ходе игры, т. е. после начала раздачи карты в колоде тайно не имеют своего значения. порядок изменен сервером.
Я думал о следующем решении с использованием криптографии и хотел получить отзывы, будет ли оно приемлемо для производственной системы, а если нет, то почему бы и нет:
Шаг 1) Сервер тайно перетасовывает колоду карт в каком-то порядке, скажем следующее (мы опускаем масть для простоты): [3, 9, 2, ..., A]
Затем он создаст следующее сообщение M:
M = "Перетасовка карт: [3, 9, 2, ..., A]. Случайное число: A96A...QT3"
Случайное число — это случайное число, которое сервер генерирует внутри себя и хранит в секрете до завершения игры. Его длины будет достаточно, чтобы предотвратить взлом хэша клиентом методом грубой силы (скажем, его длина составляет 512 символов).
Теперь сервер будет хешировать M, используя sha-256 или какой-либо другой надежный алгоритм хеширования, например: hash(M)
Шаг 2) Перед началом игры сервер отправляет этот хеш (M) клиенту, который клиент сохраняет. Клиент не может узнать M из того, что я могу собрать.
Шаг 3) Игра начинается, карты раздаются в перетасованном порядке, игрок принимает решения, и игра, наконец, завершается.
Шаг 4) Теперь клиент хочет знать, что игра была честной, т.е. сервер не обманывал, меняя карты во время раздачи. Теперь сервер отправляет сообщение «M» клиенту в виде открытого текста, чтобы показать это.
Шаг 5) Клиент запускает hash(M) и видит, что он совпадает с его hash(M), полученным на шаге 1.
Является ли это честным способом доказать, что игра была честной, без возможности мошенничества со стороны клиента или сервера, исключая возможность того, что само перемешивание не было случайным? Если бы сервер менял исходные карты во время раздачи, то клиент увидел бы это на шаге 5 (либо порядок явно отличался бы от клиента, либо хэш сообщения, отправленного на шаге 4). будет отличаться от отправленного на шаге 2). Кроме того, за раздачу отправляется только один хэш, поэтому сервер не может генерировать большое количество хэшей и отправлять их по отдельности, а затем выбирать лучший в ходе раздачи.