Как выиграть в генераторе случайных чисел в вайбере
Красивая цифра для привлечения внимания: $16,5 миллионов составил джекпот по билету, который герой нашей истории получил, заранее зная выигрышную комбинацию.
Красивая цифра для привлечения внимания: $16,5 миллиона составил джекпот по билету, который герой нашей истории получил, заранее зная выигрышную комбинацию.
В США близка к развязке интригующая детективная история, которая тянется уже целое десятилетие. В 2006 году американские правоохранительные органы заинтересовались, откуда у техасского мирового судьи Томми Типтона (Tommy Tipton) взялись полмиллиона долларов в банкнотах с последовательными номерами (отслеживание номеров купюр — один из способов борьбы с оборотом криминальных денег).
Согласно материалам суда, Типтон объяснил, что выиграл эти деньги в лотерею, но получил их не лично, а через своего друга, которому за эту своеобразную услугу отдал 10% от суммы. Трюк этот, со слов Типтона, понадобился, чтобы о выигрыше не узнала его жена, с которой судья якобы был на грани развода. Правоохранители этим ответом удовлетворились, и расследование было прекращено.
Один нюанс, правда, от следствия ускользнул: брат везунчика, Эдди Типтон (Eddie Tipton), в то время работал в организации, участвующей в проведении лотерей во многих штатах (Multi-State Lottery Association). Там он отвечал за информационную безопасность и являлся одним из разработчиков компьютерной системы, которая — внимание! — генерировала выигрышные номера.
Еще в одном случае в том же 2011 году за выигрышем в $16,5 миллиона обратился гражданин Канады, который хотел получить его как представитель владельца билета, пожелавшего остаться неизвестным. В ходе расследования организаторы лотереи обратились к общественности с просьбой опознать на видеозаписи камеры наблюдения человека, купившего выигрышный билет. Сразу несколько человек по голосу узнали в покупателе Эдди Типтона. Впоследствии по данным о совершенных звонках правоохранители установили связь между ним и посредниками в получении выигрыша.
Эти улики и стали основой выдвинутых против Эдди Типтона обвинений в мошенничестве. В 2015 году он был признан виновным и приговорен к десятилетнему тюремному сроку, но был отпущен под залог на время рассмотрения апелляции.
Всего было выявлено шесть эпизодов жульничества в разных штатах, а несколько выигрышей размером в сотни тысяч долларов участники схемы успели получить.
Самое интересное — это, конечно, техническая сторона аферы. Итак, по версии следствия, Эдди Типтон модифицировал свою же программу, генерирующую выигрышные номера, чтобы при определенных условиях она выдавала не случайные, а предсказуемые последовательности. Важная деталь схемы: злоумышленники использовали билеты, в которых участник розыгрыша должен сам указать заветные номера.
Для срабатывания закладки требовалось одновременное выполнение трех условий: один из трех заранее выбранных дней в году, один из двух дней недели и определенное время суток.
В ходе крайне необычного следственного эксперимента с модифицированной программой криминалисты воспроизвели условия прошедшего розыгрыша (очевидно, установив соответствующее системное время) и получили ровно ту же выигрышную комбинацию.
Кроме хитроумной манипуляции с генератором случайных чисел Эдди Типтон обошел систему видеонаблюдения в помещении с компьютером. А вот дальше хакерские навыки его подвели — обхитрить систему целиком он не смог. Привлечение в аферу родственника, общение по мобильному телефону с посредниками, через которых планировалось получить выигрыш, собственноручное приобретение билета — все эти просчеты смазали картину грандиозной аферы.
Как же защититься от посягательств того, кто сам призван обеспечивать безопасность? Организаторы лотереи в штате Айова после разоблачения аферы заменили оборудование и программное обеспечение, проверили новый софт на наличие закладок, усилили видеонаблюдение и сильнее раздробили полномочия между сотрудниками, чтобы усложнить организацию подобной аферы.
Герои второй истории, случившейся в штате Коннектикут в 2015 году, тоже использовали свое служебное положение для взлома лотереи. В отличие от Типтона, они были не так близки к компрометируемой системе — работали в торговых точках, в которых установлены лотерейные машины.
Введение
- Генераторы сессий (PHPSESSID)
- Генерация текста для капчи
- Шифрование
- Генерация соли для хранения паролей в необратимом виде
- Генератор паролей
- Порядок раздачи карт в интернет казино
Как отличить случайную последовательность чисел от неслучайной?
Пусть есть последовательность чисел: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 . Является ли она случайной? Есть строгое определение для случайной величины. Случайная величина — это величина, которая принимает в результате опыта одно из множества значений, причём появление того или иного значения этой величины до её измерения нельзя точно предсказать. Но оно не помогает ответить на наш вопрос, так как нам не хватает информации для ответа. Теперь скажем, что данные числа получились набором одной из верхних строк клавиатуры. «Конечно не случайная» — воскликните Вы и тут же назовете следующие число и будете абсолютно правы. Последовательность будет случайной только если между символами, нету зависимости. Например, если бы данные символы появились в результате вытягивания бочонков в лото, то последовательность была бы случайной.
Чуть более сложный пример или число Пи
Последовательность цифры в числе Пи считается случайной. Пусть генератор основывается на выводе бит представления числа Пи, начиная с какой-то неизвестной точки. Такой генератор, возможно и пройдет «тест на следующий бит», так как ПИ, видимо, является случайной последовательностью. Однако этот подход не является критографически надежным — если криптоаналитик определит, какой бит числа Пи используется в данный момент, он сможет вычислить и все предшествующие и последующие биты.
Данный пример накладывает ещё одно ограничение на генераторы случайных чисел. Криптоаналитик не должен иметь возможности предсказать работу генератора случайных чисел.
Отличие генератора псевдослучайных чисел (ГПСЧ) от генератора случайных чисел (ГСЧ)
Источники энтропии используются для накопления энтропии с последующим получением из неё начального значения (initial value, seed), необходимого генераторам случайных чисел (ГСЧ) для формирования случайных чисел. ГПСЧ использует единственное начальное значение, откуда и следует его псевдослучайность, а ГСЧ всегда формирует случайное число, имея в начале высококачественную случайную величину, предоставленную различными источниками энтропии.
Энтропия – это мера беспорядка. Информационная энтропия — мера неопределённости или непредсказуемости информации.
Можно сказать, что ГСЧ = ГПСЧ + источник энтропии.
Уязвимости ГПСЧ
- Предсказуемая зависимость между числами.
- Предсказуемое начальное значение генератора.
- Малая длина периода генерируемой последовательности случайных чисел, после которой генератор зацикливается.
Линейный конгруэнтный ГПСЧ (LCPRNG)
Распространённый метод для генерации псевдослучайных чисел, не обладающий криптографической стойкостью. Линейный конгруэнтный метод заключается в вычислении членов линейной рекуррентной последовательности по модулю некоторого натурального числа m, задаваемой следующей формулой:
где a (multiplier), c (addend), m (mask) — некоторые целочисленные коэффициенты. Получаемая последовательность зависит от выбора стартового числа (seed) X0 и при разных его значениях получаются различные последовательности случайных чисел.
Для выбора коэффициентов имеются свойства позволяющие максимизировать длину периода(максимальная длина равна m), то есть момент, с которого генератор зациклится [1].
Пусть генератор выдал несколько случайных чисел X0, X1, X2, X3. Получается система уравнений
Решив эту систему, можно определить коэффициенты a, c, m. Как утверждает википедия [8], эта система имеет решение, но решить самостоятельно или найти решение не получилось. Буду очень признателен за любую помощь в этом направлении.
Предсказание результатов линейно-конгруэнтного метода
Основным алгоритмом предсказания чисел для линейно-конгруэнтного метода является Plumstead’s — алгоритм, реализацию, которого можно найти здесь [4](есть онлайн запуск) и здесь [5]. Описание алгоритма можно найти в [9].
Простая реализация конгруэнтного метода на Java.
Отправив 20 чисел на сайт [4], можно с большой вероятностью получить следующие. Чем больше чисел, тем больше вероятность.
Взлом встроенного генератора случайных чисел в Java
Многие языки программирования, например C(rand), C++(rand) и Java используют LСPRNG. Рассмотрим, как можно провести взлом на примере java.utils.Random. Зайдя в исходный код (jdk1.7) данного класса можно увидеть используемые константы
Метод java.utils.Randon.nextInt() выглядит следующим образом (здесь bits == 32)
Пусть мы знаем два подряд сгенерированных числа x1 и x2. Тогда необходимо перебрать 2^16 = 65536 вариантов oldseed и применять к x1 формулу:
до тех пор, пока она не станет равной x2. Код для brute-force может выглядеть так
Несложно понять, что мы нашли не самый первый seed, а seed, используемый при генерации второго числа. Для нахождения первоначального seed необходимо провести несколько операций, которые Java использовала для преобразования seed, в обратном порядке.
И теперь в исходном коде заменим
crackingSeed.set(seed);
на
crackingSeed.set(getPreviousSeed(seed));
И всё, мы успешно взломали ГПСЧ в Java.
Взлом ГПСЧ Mersenne twister в PHP
Рассмотрим ещё один не криптостойкий алгоритм генерации псевдослучайных чисел Mersenne Twister. Основные преимущества алгоритма — это скорость генерации и огромный период 2^19937 − 1, На этот раз будем анализировать реализацию алгоритма mt_srand() и mt_rand() в исходном коде php версии 5.4.6.
Можно заметить, что php_mt_reload вызывается при инициализации и после вызова php_mt_rand 624 раза. Начнем взлом с конца, обратим трансформации в конце функции php_mt_rand(). Рассмотрим (s1 ^ (s1 >> 18)). В бинарном представление операция выглядит так:
10110111010111100111111001110010 s1
00000000000000000010110111010111100111111001110010 s1 >> 18
10110111010111100101001110100101 s1 ^ (s1 >> 18)
Видно, что первые 18 бит (выделены жирным) остались без изменений.
Напишем две функции для инвертирования битового сдвига и xor
Тогда код для инвертирования последних строк функции php_mt_rand() будет выглядеть так
Если у нас есть 624 последовательных числа сгенерированных Mersenne Twister, то применив этот алгоритм для этих последовательных чисел, мы получим полное состояние Mersenne Twister, и сможем легко определить каждое последующее значение, запустив php_mt_reload для известного набора значений.
Область для взлома
Если вы думаете, что уже нечего ломать, то Вы глубоко заблуждаетесь. Одним из интересных направлений является генератор случайных чисел Adobe Flash(Action Script 3.0). Его особенностью является закрытость исходного кода и отсутствие задания seed'а. Основной интерес к нему, это использование во многих онлайн-казино и онлайн-покере.
Есть много последовательностей чисел, начиная от курса доллара и заканчивая количеством времени проведенным в пробке каждый день. И найти закономерность в таких данных очень не простая задача.
Задание распределения для генератора псевдослучайных чисел
Для любой случайной величины можно задать распределение. Перенося на пример с картами, можно сделать так, чтобы тузы выпадали чаще, чем девятки. Далее представлены несколько примеров для треугольного распределения и экспоненциального распределения.
Треугольное распределение
Приведем пример генерации случайной величины с треугольным распределением [7] на языке C99.
В данном случае мы берем случайную величину rand() и задаем ей распределение, исходя из функции треугольного распределения. Для параметров a = -40, b = 100, c = 50 график 10000000 измерений будет выглядеть так
Экспоненциальное распределение
Пусть требуется получить датчик экспоненциально распределенных случайных величин. В этом случае F(x) = 1 – exp(-lambda * x). Тогда из решения уравнения y = 1 – exp(-lambda * x) получаем x = -log(1-y)/lambda.
Можно заметить, что выражение под знаком логарифма в последней формуле имеет равномерное распределение на отрезке [0,1), что позволяет получать другую, но так же распределённую последовательность по формуле: x = -log(y)/lambda, где y есть случайная величина(rand()).
Тесты ГПСЧ
Некоторые разработчики считают, что если они скроют используемый ими метод генерации или придумают свой, то этого достаточно для защиты. Это очень распространённое заблуждение. Следует помнить, что есть специальные методы и приемы для поиска зависимостей в последовательности чисел.
Одним из известных тестов является тест на следующий бит — тест, служащий для проверки генераторов псевдослучайных чисел на криптостойкость. Тест гласит, что не должно существовать полиномиального алгоритма, который, зная первые k битов случайной последовательности, сможет предсказать k+1 бит с вероятностью большей ½.
В теории криптографии отдельной проблемой является определение того, насколько последовательность чисел или бит, сгенерированных генератором, является случайной. Как правило, для этой цели используются различные статистические тесты, такие как DIEHARD или NIST. Эндрю Яо в 1982 году доказал, что генератор, прошедший «тест на следующий бит», пройдет и любые другие статистические тесты на случайность, выполнимые за полиномиальное время.
В интернете [10] можно пройти тесты DIEHARD и множество других, чтобы определить критостойкость алгоритма.
Признаюсь, меня редко «цепляют» игрушки. Ни настольные, ни компьютерные, давно уже не вызывают того памятного по детству энтузиазма, который заставлял когда-то проводить дни напролёт за «Монополией» или в Lode Runner. Поэтому когда я уцепился за крошечную фигурку, извлечённую женой из «Киндер-сюрприза», супруга, кажется, была поражена не меньше моего. А я вертел и не мог насмотреться вот на эту (см. ниже) модель какого-то, полагаю, супергероя комиксов. Если нажать ему на ноги, спрятанное внутри колёсико-маховик прокрутится и покажет на лбу одну из нанесённых на колесе цифр. Фокус в том, что движется оно ещё некоторое время после того, как вы перестаёте прикладывать усилие, так что угадать цифру невозможно. Да, такой вот оригинальный генератор случайных чисел.
А случайные числа — штука удивительная, парадоксальная. Мы знакомимся с ними рано, чуть ли не в детсадовском возрасте, и пользуемся всю жизнь — но и сейчас ещё найдётся такое их свойство, которое вас удивит, и именно о нём сегодняшний рассказ. А корни его тоже следует искать в детстве — где нас обучают одной стороне случайностей, но не учат другой.
Та самая фигурка.
Для ребёнка и подростка случайные числа — способ добавить непредсказуемости в ограниченный взрослыми мирок. Игрушка, о которой шла речь выше, конечно, не самый лёгкий способ случайность получить. Монетка, игральный кубик, сумма выброшенных на пальцах чисел, позже — тасованная колода, рулетка: всё это проще и понятней. Ребёнок не ищет в случайностях глубокого смысла, он понимает и применяет их непосредственно, как указание на количество полей в настольной игре, выигравшую или снятую с поля ставку. Но именно здесь формируется наше взрослое к ним отношение. Мы привыкаем к мысли, что случайность способна заменить нас при принятии решений. И в то же время привыкаем исполнять указания кубика без попыток на него повлиять: если уж случай указал направление, следуй беспрекословно!
Поцеловать Лену или Алёну (а может быть обеих?!), есть тушёную капусту или не есть, пойти на урок или прогулять? В какой институт поступить, какие цифры вычеркнуть в лотерейном билете, какую вакансию предпочесть, вложиться ли в бумагу X, заводить ли детей сейчас? И так далее, и так далее: трудные решения преследуют нас всю жизнь, меняется только тяжесть последствий. Генератор случайных чисел поэтому — особенно для нерешительных — святой грааль, позволяющий сбросить с плеч груз ответственности: даже если выбранный вариант окажется неудачным, вы в этом не виноваты, вы только следовали указанию «судьбы», численно выраженному генератором.
Да, человек рациональный посмотрит на «жизнь по ГСЧ» презрительно: довериться тупой, слепой железке?! Такой человек как правило знает о случайностях чуть больше «начального жизненного курса». Он знает, что выдать по-настоящему случайное число для цифровой системы катастрофически трудно (почему алгоритмические генераторы и называют псевдослучайными), знает, что в качественном потоке случайных чисел каждое следующее не зависит от предыдущих (а потому нет смыслы пытаться обыграть лотерею или биржу, изучая прошлые ряды цифр), наконец, если он рационален, то и не суеверен, а потому не доверит решение важных вопросов монетке, которая по определению ничего не может знать о проблемах, стоящих перед игроком, и которая к тому же с равной вероятностью даст решку или орла, то есть в пределе обеспечит одинаковое количество выигрышных и проигрышных комбинаций.
Чего такой человек не знает, так этого того, что чтобы идти по жизни успешно, знать не нужно почти ничего — и «знаний» монетки или компьютерного ГПСЧ для этого вполне достаточно. Не верите? И не надо. Давайте поставим численный эксперимент, чтобы вы смогли убедиться лично.
GW-BASIC хорош тем, что прощает вольности форматирования, а кроме того, когда в век терабайтов и гигагерц лицезреешь на экране строчку «60300 bytes free», как-то сразу настраиваешься на серьёзный лад. Но, собственно, вот и программа. Всё элементарно. «Бросаем монетку», то есть генерируем случайное число от 0 до 0.999, и на основании этого будто бы принимаем участие в каком-то предприятии, которое либо приносит нам случайную прибыль, либо лишает нас опять же случайной суммы.
Да, параллель с реальностью весьма условная, но для имитации «жизни по генератору случайных чисел» она сгодится. Смысл в том, чтобы прогнать эксперимент достаточно большое число раз и оценить среднестатистический выигрыш: иначе говоря, если бы мы могли прожить тысячу жизней, в каждой из которых случайно приняли бы сотню важных решений, остались бы мы в среднем в выигрыше или в проигрыше?
10 MEDIAN=0
15 FOR Q=1 TO 10000 REM Lifes
20 TOTAL=0 REM Money
25 FOR I=1 TO 100
30 M=RND
35 IF M<0.5 THEN N=INT(10*RND) 40 IF M>=0.5 THEN N=-INT(10*RND)
45 TOTAL=TOTAL+N
50 NEXT I
55 MEDIAN=MEDIAN+TOTAL
60 PRINT Q,"MEDIAN lazy" src="https://www.computerra.ru/wp-content/uploads/2015/05/290515-4.jpg" alt="290515-4" width="1076" height="458" />
Так вот, обстоятельство первое: наш генератор случайных чисел по-прежнему ничего не знает о том предприятии, в котором мы собираемся участвовать. Обстоятельство второе: ГСЧ точно так же ничего не знает о том, сколько мы надеемся заработать. Обстоятельство третье: единственное, что известно заранее, это максимальный размер убытка, после которого мы выходим из предприятия. И отсюда — вывод: даже не зная практически ничего о будущем И принимая решения с помощью монетки, реально добиться успеха.
Волшебное это свойство по-учёному называется опциональностью, что уводит нас к ценным бумагам. Сильно упрощая и применительно к нашему случаю, опцион — это такой контракт, торгуемый на биржах, который стоит недорого, имеет «срок годности», зато может сильно изменяться в цене, намного сильнее чем акции, на которые он выпущен. А стратегия, которую мы смоделировали выше, сводится к покупке опциона и продаже его, если он вздорожает за время жизни, либо выбрасыванию его в урну, если срок годности истёк, а цена так и не изменилась.
Главная прелесть опциона и, соответственно, опциональности в том, что они способны заменять знание. Вы только что убедились в этом сами. Желающих изучить вопрос глубже, я отсылаю к «Антихрупкости» Нассима Талеба, а также к биографии математика Эдварда Торпа и роли в ней критерия Келли. Тот же Талеб сформулировал и второе замечательное свойство опциональности: не нужно и не требуется рассматривать её исключительно в денежном контексте. Смотрите шире! Лучшая стратегия в жизни — стратегия с положительным матожиданием выигрыша, как сказали бы теоретики — сводится, во-первых, к отказу от мысли, что мы можем всё предсказать и контролировать, и во-вторых, к планомерной «покупке» дешёвых «опционов», регулярно подносимых судьбой.
И, поскольку мы не знаем о будущем ничего, выбор вполне можно предоставить генератору случайных чисел.
Чтобы понять, как действует генератор случайных чисел, нужно разобраться в его устройстве и в том, на чем он основывается. Генератор чисел создает определенный порядок абсолютно независящих друг от друга чисел, основываясь на определенных параметрах рассматриваемого элемента, процесса, действия и так далее. В связи с тем, что речь идет о случайных числах, то и параметры изменяются хаотично.
Существует много распространенных и достаточно примитивных примеров, на которых можно рассмотреть его устройство: подкидывание любой монеты, бросок игрального кубика и так далее.
Принцип устройства
В работе генератора случайных чисел активно задействован ряд теорий (в частности, теория хаоса). С этим и связана абсолютная непредсказуемость выпадения того или иного шарика в лототроне, определенной грани игральной кости, загаданной до броска стороны монетки. Однако стоит отметить, что и в науке такой аппарат играет важную роль: в первую очередь для статистических исследований.
Что такое случайность и как её создать?
Основным условием, крайне важным для соблюдения правильных и честных принципов работы системы ГСЧ, является абсолютно равная вероятность на выпадение любого из возможных чисел, которые только могут выпасть в созданной системе. При этом соблюдается полная независимость от того фактора, какие еще числа выпали до или после этого.
Это можно объяснить более простым языком: в генераторе истинно случайных чисел просто нельзя выстроить порядок и зависимость выпадающих цифр. Допустим, если вы бросаете первый раз шестигранную игральную кость, то у вас может выпасть абсолютно любое число от 1 до 6 с одинаковой вероятностью 16,(6)%. И независимо от того, какая цифра выпала, она с аналогичной вероятностью может повторно выпасть при втором, сотом, тысячном бросках.
Псевдослучайность
Также существует генератор псевдослучайных последовательностей. Несмотря на то, что на первый взгляд в нем тоже очевидно отсутствие закономерностей, подобный генератор с конечным числом внутренних состояний повторится, хотя это может произойти после очень длительной цепочки чисел.
Читайте также: