Доверие, которое можно проверить

Каждый бросок ваших онлайн-партий можно пересчитать самостоятельно

Если приложение не показывает, как получены кости, проверить их нельзя. В Boardgammon можно: в онлайн-партии сервер перед каждым броском публикует криптографическое обязательство, а пересчитать бросок по его записи сможете и вы, и любой желающий.

1. Обязательство перед каждым броском

Для каждого броска сервер создаёт новый секретный сид — случайное число, которое используется только в этом броске. Прежде чем показать кости, сервер публикует лишь SHA-256-хеш сида — это и есть обязательство. Хеш не раскрывает сид, но фиксирует его: подменить сид задним числом сервер уже не может, иначе опубликованный хеш перестал бы совпадать.

2. Второе число

Когда вы бросаете кости в партии, которая идёт в реальном времени, приложение на вашем устройстве создаёт своё случайное число и отправляет его серверу. Кости вычисляются по алгоритму HMAC-SHA256 (это хеш-функция с ключом): ключом служит секретный сид сервера, а на вход подаются ID партии, ID броска, счётчик и второе число. Когда бросок делает сам сервер, как в партии по переписке, второе число тоже создаёт он.

3. Генерация без перекоса

Криптографический вывод превращается в числа от 1 до 6 методом отбрасывания (rejection sampling): значения, способные исказить распределение, отвергаются, и все грани равновероятны.

4. Страница аудита

Секретный сид сервер раскрывает вместе с костями, бросок за броском. Приложение Boardgammon в фоне проверяет каждый ваш бросок: хеш раскрытого сида должен совпасть с обязательством, полученным до броска, а пересчёт — дать те же кости. Проверить бросок можно и без приложения: у каждой вашей онлайн-партии есть публичная страница аудита, где для каждого броска указаны обязательство, раскрытый сид, второе число, счётчик и сами кости. Страница пересчитывает броски заново и приводит короткую программу, которую можно запустить самостоятельно.

Честная игра под контролем сервера

Устройство игрока никогда не генерирует кости, а каждый ход сервер сверяет с правилами. Поэтому изменённое приложение не сможет ни выдумать бросок, ни сделать ход не по правилам. А по опубликованной записи можно проверить, что кости каждого броска вычислены именно из её чисел.

Что показывает запись, а чего показать не может

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

Из блога

Все статьи