В этой статье вы узнаете об одной из важнейших составляющих онлайн покера - генераторе случайных чисел (ГСЧ). "Честность" ГСЧ различных покер-румов регулярно подвергается сомнению и обязательно обсуждается на любом ресурсе посвященном покеру. Пользователи постоянно жалуются на "подкрученный" генератор, который позволяет комнате сдерживать более сильных игроков для того чтобы большинство представляющее категорию "более слабых игроков" осталось лояльным комнате. Давайте разберемся действительно ли все так плохо со случайностью на покерных сайтах.

Все вы в курсе что такое генератор случайных чисел и как он реализуется на компьютере, но для полноты статьи я опишу основные понятия. При желании можете пропустить следующий раздел.

Что такое ГСЧ?

Генератор случайных чисел (ГСЧ) должен генерировать абсолютно случайную последовательность чисел. Такую последовательность можно получить если использовать какие-то физические природные процессы, например: физический шум, космическое излучение, радиационный фон и т.д. В компьютерных системах различают программные и аппаратные ГСЧ. Первые фактически являются генератором псевдослучайных чисел (ГПСЧ) и представляют из себя алгоритм, генерирующий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению. Так как алгоритм предопределен, то и последовательность полученных чисел тоже предопределена. Получается если знать алгоритм ГПСЧ, то можно получить и «случайную» последовательность.

Аппаратный ГСЧ представляет из себя устройство, использующее какой-либо из внешних источников энтропии для получения последовательностей.

Сейчас ГСЧ обычно реализуется комбинированием ГПСЧ и внешнего источника энтропии. В компьютерах в качестве такого источника используют счетчик тактов процессора, шум звуковой карты или оригинальные способы, к примеру "ГСЧ из WiFi-шума".

ГСЧ в онлайн покере

Генерация случайных последовательностей карт вместе с их передачей от сервера клиенту - одна из основ безопасности покер-рума, поэтому  им уделяется большое внимание. Для такой важной системы недопустимо использовать генератор псевдослучайных чисел, потому что его можно будет взломать и получить последовательность  чисел, а потом и расшифровать карты игроков и неоткрытые карты стола.

Все покер-румы получают различные сертификаты, чтобы доказать состоятельность своих ГСЧ и софта. Cigital - одна из крупнейших компаний в этой области, занимается, в том числе, сертификацией покерного софта и ГСЧ. Сертификат этой компании есть у крупнейших покер-румов Full Tilt Poker и PokerStars. Основа тестирования любого ГСЧ - набор тестов NIST (National Institute of Standards and Technology), основанных на стандарте США FIPS 140-2 (Federal Information Processing Standard). Он включает различные тесты от теста на соотношение 0 и 1 в генерируемой последовательности, до теста на сжатие алгоритмом LZO (случайная последовательность не может быть существенна сжата, потому что не должна иметь много повторяющихся последовательностей).

Для генерации случайных последовательностей они используют систему из одного или нескольких источников энтропии и алгоритма ГПСЧ. Например, крупнейший покер-рум PokerStars использует данные от пользователей (передвижения мышью, время реакции на определенные действия и т.д.) как фактор случайности и аппаратный ГСЧ Quantis, сертифицированный швейцарским Федеральным бюро метрологии. Quantis использует физические процессы для генерации числовых последовательностей. Он улавливает фотоны и пропускает их через полупрозрачное зеркало. Два события: отражение и прохождение света принимаются за 0 и 1. Quantis выпускается с разными интерфейсами: USB, PCI, PCI-E с потоком случайных чисел в 4 Мбит/с. Также есть 16 Мбит/с модификация для PCI устройств. Цена такого девайса €890 - €1165 для 4 Мбит/с потока и €2000 для 16 Мбит/с. Также в PokerStars есть критерии определения достаточной степени случайности. Например, если данных от пользователей недостаточно, то раздача не начинается пока не будет обеспечена достаточная генерация случайных бит аппаратным ГСЧ. Само преобразование потока случайных бит в числа происходит так: если нужно число от 0 до 25, то выбирается 5 бит и преобразуется в число от 0 до 31; если число больше 25, то процесс повторяется. Для перетасовки колоды выбирается исходная колода и пустая, из первой выбирается случайная карта и переносится во вторую. Так, пока все карты не будут перенесены в изначально пустую колоду.

В целом, покер-румы используют два вида тасования колоды: одиночное и постоянное. В одиночном колода тасуется один раз перед раздачей, а в постоянном тасовка продолжается всю раздачу. Второй вариант вносит дополнительную защиту от взлома, потому что следующая карта стола неизвестна до последнего момента. Постоянная тасовка, например, используется во втором по величине покер-руме - FullTilt. Сам ГСЧ FullTilt'a построен по похожему с PokerStars принципу, используются 3 независимых генератора: аппаратный ГСЧ с физическим источником энтропии и два независимых ГПСЧ (ISAAC и OpenSSL). Вообще такой вариант комбинирования нескольких генераторов случайных чисел используется сейчас повсеместно, но на заре становления онлайн покера дела с ГСЧ обстояли гораздо хуже.

История с Planet Poker и ASF Software Inc.

Planet Poker - первый в мире покер-рум, который предложил своим пользователям игру на дeньги в интернете. Произошло это в январе 1998 года. Немного позже его безопасностью заинтересовались специалисты из "Reliable Software Tehnologies" (ныне "Cigital"). На сайте Planet Poker были открыты исходники их алгоритма ГСЧ (сам алгоритм принадлежал компании "ASF Sowtware Inc."). Этим они хотели показать свою честность и надежность, но исходники только помогли специалистам найти в нем бреши. Вот функция перетасовки карт из опубликованного алгоритма:

procedure TDeck.Shuffle;
var
ctr: Byte;
tmp: Byte;random_number: Byte;
begin
{ Fill the deck with unique cards }
for ctr := 1 to 52 do
Card[ctr] := ctr;

{ Generate a new seed based on the system clock }
randomize;

{ Randomly rearrange each card }
for ctr := 1 to 52 do begin
random_number := random(51)+1;
tmp := card[random_number];
card[random_number] := card[ctr];
card[ctr] := tmp;
end;

CurrentCard := 1;
JustShuffled := True;
end;

Вкратце, берется неотсортированная колода карт и карты от 1 до 52 меняются местами с любой случайной картой. Для генерации случайных чисел используются Pascal-функции random, randomize, которые используют системный таймер и алгоритм ГПСЧ для получения случайных чисел.

Первая ошибка алгоритма кроется в функции random(n) - она, в отличие от большинства Pascal-функций, возвращает значение от 0 до n-1. Т.е. "random(51)+1" дает нам число от 1 до 51 - классическая ошибка off-by-one. Получается текущая карта никогда не будет меняться местами с последней 52-й картой, что уже дает отклонение от случайности получаемой колоды.

Также специалисты "Reliable Software Tehnologies" выявили несостоятельность самого алгоритма, даже если исправить ошибку off-by-one. Для демонстрации этого они использовали описанный выше алгоритм:

for (i is 1 to n)
Swap i with random position between 1 and n

Для простоты расчетов использовалась колода из 3-х карт. В результате колоды 231, 213 и 132 встречались чаще чем 312, 321 и 123. Понятно, что для колоды из 52-х карт какие-то варианты перетасовки колоды должны были встречаться чаще чем другие.

Еще одним важным упущением было количество возможных колод в таком ГСЧ. При реальной перетасовке карт возможны 52!= 8,06*1067 вариантов колоды. Pascal-функции генерируют случайные числа на основе системных часов. Основа для расчета случайного числа - количество милисекунд с полуночи. В сутках всего 86 400 000 миллисекунд, таким образом мы имеем всего 86,4 млн возможных вариантов перетасовки колоды, что гораздо меньше реально возможной.

И это не все, найденные недостатки не дают особого преимущества для игроков, но следующая уязвимость позволяла полностью узнать последовательность карт в колоде. Все опять же из-за ГПСЧ, точнее его предсказуемости. Исследователи написали эксплоит, который в точности мог показывать все карты игроков и оставшиеся карты стола после выложенных на стол 3-х карт. Таким образом он основывался на 5-ти известных картах: 2-х игрока и 3-х на столе. Используя анaлoгичный Pascal алгоритм ГСЧ и подбирая разное количество миллисекунд с отклонением от текущего времени (время генерации карт должно было быть близко к локальному времени), эксплоит находил точное совпадение 5-ти известных карт и выдавал все остальные.

После этого эксплоит дополнительно синхронизировал локальное время с временем сервера, и следующие переборы занимали меньше одной секунды.

Для игроков эта история сложилась удачно - эксплоит был в хороших руках, и специалисты "Reliable Software Tehnologies" сразу сообщили о найденных уязвимостях в "ASF Sowtware Inc." (их услугами кроме "Planet Poker" также пользовались purepoker.com, deltacasino.com) и позже опубликовали свой отчет. Они оценили ущерб, если бы программа попала в плохие руки, в $100 000 в день. Planet poker и вообще онлайн покеру эта история нанесла серьезный ущерб, хотя и не помешала активно развиваться этой отрасли. А "Reliable Software Tehnologies" была переименована в "Cigital" и сейчас является очень авторитетной компанией по аудиту и сертификации программ.

Real Deal и технология Cut'N Shuffle

Отдельно стоит упомянуть покер-рум Real Deal с их инновационным подходом к раздаче карт. Игра на дeньги в нем началась 7 мая 2010 г. Для перетасовки используется реальная колода карт и специальная шафл-машина для их перемешивания.

Этот запатентованный аппарат называется Cut'N Shuffle. С его помощью получается настоящее перемешивание реальной колоды карт. К тому же раздающему игроку предлагается подрезать колоду (он может и отказаться), что вносит дополнительный элемент случайности. Видеозаписи каждой перетасовки колоды сохраняются на сервере и любой игрок может получить их при желании. Это довольно молодая технология, посмотрим насколько она будет успешной в будущем.

Заключение

В заключении хотелось бы порассуждать о возможных махинациях с ГСЧ. Прибыль покер-рума идет от рейка (часть банка которую забирает себе казино), так что для них не важно кто выигрывает, им важно только количество наигранного рейка. Отсюда втекает идея прибыльной махинации: раздавать чаще хорошие комбинации нескольким игрокам, чтобы они пытались сыграть на все дeньги. Вполне реализуемо, но все тайное когда-нибудь становится явным, а утечка такой информации вполне возможна. И вряд ли небольшая прибавка в прибыли стоит огромных потерь, если такой обман раскроют. Поэтому, если вы играете в покер и вам фатально не везет, не стоит обвинять во всем "подкрученный" ГСЧ, просто переждите полосу неудач и продолжайте играть.

На практике, чаще всего, игроки пытаются переложить свои ошибки на сильные плечи ГСЧ, обвиняя его во всех собственных неудачах. Всегда анализируйте собственные действия и ищите ошибки, перед тем как перекинуть вину на разработчиков софта.