Как выиграть в генераторе случайных чисел

Каким образом можно угадать любое случайное число, которое было сгенериновано сайтом?

Раньше в качестве «генераторов случайных чисел» часто использовали компьютерные алгоритмы. Это не совсем корректно, потому что результаты, хоть и с большим трудом и с помощью вычислительных машин, было возможно предсказать. Так, например, один умник из США смог обмануть систему и просчитать алгоритм какой-то игры на деньги.

В настоящее время среди генераторов случайных чисел можно выделить два типа: генераторы псевдослучайных чисел, и генераторов настоящих случайных чисел (названия импровизированные).

Псевдослучайные числа, как видно из названия, не совсем случайны: для их генерации не используются физические источники. Их генерируют с помощью сугубо математического алгоритма. Например, берётся некоторое число (допустим то, которое выпало на кубике), затем перемножается с ещё одним числом (выпавшем при очередном подбрасывании кубика), затем возводится в куб, из результата вычитается ещё одно число, выпавшее на кубике, из получившегося числа извлекается корень третьей степени и из результата берется одиннадцатая цифра после запятой. На первый взгляд кажется, что такое число невозможно предсказать, но на самом деле, если идеально рассчитать траекторию кубика, то можно предсказать и результат. Именно такой алгоритм и описывает работу генераторов псевдослучайных чисел, только вместо кубика используется, например, количество пользователей сайта в данный момент времени.

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

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

Источник

Жизнь по генератору случайных чисел: стратегия успеха

Признаюсь, меня редко «цепляют» игрушки. Ни настольные, ни компьютерные, давно уже не вызывают того памятного по детству энтузиазма, который заставлял когда-то проводить дни напролёт за «Монополией» или в Lode Runner. Поэтому когда я уцепился за крошечную фигурку, извлечённую женой из «Киндер-сюрприза», супруга, кажется, была поражена не меньше моего. А я вертел и не мог насмотреться вот на эту (см. ниже) модель какого-то, полагаю, супергероя комиксов. Если нажать ему на ноги, спрятанное внутри колёсико-маховик прокрутится и покажет на лбу одну из нанесённых на колесе цифр. Фокус в том, что движется оно ещё некоторое время после того, как вы перестаёте прикладывать усилие, так что угадать цифру невозможно. Да, такой вот оригинальный генератор случайных чисел.

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

Как выиграть в генераторе случайных чисел. Смотреть фото Как выиграть в генераторе случайных чисел. Смотреть картинку Как выиграть в генераторе случайных чисел. Картинка про Как выиграть в генераторе случайных чисел. Фото Как выиграть в генераторе случайных чиселТа самая фигурка.

Для ребёнка и подростка случайные числа — способ добавить непредсказуемости в ограниченный взрослыми мирок. Игрушка, о которой шла речь выше, конечно, не самый лёгкий способ случайность получить. Монетка, игральный кубик, сумма выброшенных на пальцах чисел, позже — тасованная колода, рулетка: всё это проще и понятней. Ребёнок не ищет в случайностях глубокого смысла, он понимает и применяет их непосредственно, как указание на количество полей в настольной игре, выигравшую или снятую с поля ставку. Но именно здесь формируется наше взрослое к ним отношение. Мы привыкаем к мысли, что случайность способна заменить нас при принятии решений. И в то же время привыкаем исполнять указания кубика без попыток на него повлиять: если уж случай указал направление, следуй беспрекословно!

Поцеловать Лену или Алёну (а может быть обеих?!), есть тушёную капусту или не есть, пойти на урок или прогулять? В какой институт поступить, какие цифры вычеркнуть в лотерейном билете, какую вакансию предпочесть, вложиться ли в бумагу X, заводить ли детей сейчас? И так далее, и так далее: трудные решения преследуют нас всю жизнь, меняется только тяжесть последствий. Генератор случайных чисел поэтому — особенно для нерешительных — святой грааль, позволяющий сбросить с плеч груз ответственности: даже если выбранный вариант окажется неудачным, вы в этом не виноваты, вы только следовали указанию «судьбы», численно выраженному генератором.

Как выиграть в генераторе случайных чисел. Смотреть фото Как выиграть в генераторе случайных чисел. Смотреть картинку Как выиграть в генераторе случайных чисел. Картинка про Как выиграть в генераторе случайных чисел. Фото Как выиграть в генераторе случайных чисел

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

Чего такой человек не знает, так этого того, что чтобы идти по жизни успешно, знать не нужно почти ничего — и «знаний» монетки или компьютерного ГПСЧ для этого вполне достаточно. Не верите? И не надо. Давайте поставим численный эксперимент, чтобы вы смогли убедиться лично.

Нам понадобится какая-нибудь простейшая среда программирования. Постоянные читатели знают мою любовь к бейсику — и, полагаю, простят мне, что и сегодня я выберу его. Но на этот раз я пущусь во все тяжкие и воспользуюсь своим абсолютно самым любимым диалектом, с которого, как мне кажется, были списаны многие бейсики восьмибитной эпохи. А именно GW-BASIC образца почти тридцатилетней давности, разработки Microsoft. И не какой-нибудь эмулятор, а самый настоящий оригинальный продукт. Качайте его из архива (например, через Wayback Machine), далее, если вы в Linux, ставьте DOSbox (sudo aptitude install dosbox) и запускайте (dosbox GWBASIC.EXE), если вы в MS Windows, полагаю, можно воспользоваться командной строкой. Выход из интерпретатора — ветхозаветной командой «system».

Как выиграть в генераторе случайных чисел. Смотреть фото Как выиграть в генераторе случайных чисел. Смотреть картинку Как выиграть в генераторе случайных чисел. Картинка про Как выиграть в генераторе случайных чисел. Фото Как выиграть в генераторе случайных чисел

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)
45 TOTAL=TOTAL+N
50 NEXT I
55 MEDIAN=MEDIAN+TOTAL
60 PRINT Q,»MEDIAN=»MEDIAN/Q
65 NEXT Q

Результат, впрочем, оказывается не тем и не другим: чем больше виртуальных жизней прожито, тем ближе медиана к нулю. Иначе говоря, слепо доверившись монетке, мы с равной вероятностью окончим отдельную жизнь глубоко в долгах или купаясь в роскоши, среднестатистический же результат будет нулевым. Такая стратегия покажется ещё менее привлекательной, если приблизить нашу модель к реальности, введя в неё ограниченный бюджет: в настоящей жизни мы ведь не можем сидеть в бесконечно больших долгах! Что вроде бы и требовалось доказать.

Однако на этом эксперимент не закончен. Я предлагаю внести в программу ещё одно изменение: ограничим возможный проигрыш в каждом отдельном случае фиксированной суммой — желательно, небольшой, желательно, привязанной к бюджету (как это любят делать биржевики). Сделать это просто: например, в строке 40 заменим число 10 на 1. Смысл: теперь даже при самом неблагоприятном исходе мы не сможем потерять за раз больше десяти процентов того, что надеемся заработать.

Прогон этой модели даст принципиально иной результат: мы окажемся в стабильном «плюсе»! Но не спешите обзывать автора «капитаном очевидность». На самом деле то, что мы реализовали эту стратегию в виде программы, поможет нам заметить несколько важных обстоятельств и сделать очень важный вывод.

Как выиграть в генераторе случайных чисел. Смотреть фото Как выиграть в генераторе случайных чисел. Смотреть картинку Как выиграть в генераторе случайных чисел. Картинка про Как выиграть в генераторе случайных чисел. Фото Как выиграть в генераторе случайных чисел

Так вот, обстоятельство первое: наш генератор случайных чисел по-прежнему ничего не знает о том предприятии, в котором мы собираемся участвовать. Обстоятельство второе: ГСЧ точно так же ничего не знает о том, сколько мы надеемся заработать. Обстоятельство третье: единственное, что известно заранее, это максимальный размер убытка, после которого мы выходим из предприятия. И отсюда — вывод: даже не зная практически ничего о будущем И принимая решения с помощью монетки, реально добиться успеха.

Волшебное это свойство по-учёному называется опциональностью, что уводит нас к ценным бумагам. Сильно упрощая и применительно к нашему случаю, опцион — это такой контракт, торгуемый на биржах, который стоит недорого, имеет «срок годности», зато может сильно изменяться в цене, намного сильнее чем акции, на которые он выпущен. А стратегия, которую мы смоделировали выше, сводится к покупке опциона и продаже его, если он вздорожает за время жизни, либо выбрасыванию его в урну, если срок годности истёк, а цена так и не изменилась.

Главная прелесть опциона и, соответственно, опциональности в том, что они способны заменять знание. Вы только что убедились в этом сами. Желающих изучить вопрос глубже, я отсылаю к «Антихрупкости» Нассима Талеба, а также к биографии математика Эдварда Торпа и роли в ней критерия Келли. Тот же Талеб сформулировал и второе замечательное свойство опциональности: не нужно и не требуется рассматривать её исключительно в денежном контексте. Смотрите шире! Лучшая стратегия в жизни — стратегия с положительным матожиданием выигрыша, как сказали бы теоретики — сводится, во-первых, к отказу от мысли, что мы можем всё предсказать и контролировать, и во-вторых, к планомерной «покупке» дешёвых «опционов», регулярно подносимых судьбой.

И, поскольку мы не знаем о будущем ничего, выбор вполне можно предоставить генератору случайных чисел.

Источник

Как перехитрить Фортуну в лице генератора случайных чисел, или Лотерейные аферы в цифровую эпоху

Как выиграть в генераторе случайных чисел. Смотреть фото Как выиграть в генераторе случайных чисел. Смотреть картинку Как выиграть в генераторе случайных чисел. Картинка про Как выиграть в генераторе случайных чисел. Фото Как выиграть в генераторе случайных чисел

Как выиграть в генераторе случайных чисел. Смотреть фото Как выиграть в генераторе случайных чисел. Смотреть картинку Как выиграть в генераторе случайных чисел. Картинка про Как выиграть в генераторе случайных чисел. Фото Как выиграть в генераторе случайных чисел

Старая шутка гласит: «Лотерея — налог для людей, плохо разбирающихся в математике». Для тех же, кто в науках силен, она, наоборот, может стать источником заработка, пусть и весьма сомнительного, и мы не имеем в виду организаторов лотерей!

История первая: «Злоупотребление случаем»

В США близка к развязке интригующая детективная история, которая тянется уже целое десятилетие. В 2006 году американские правоохранительные органы заинтересовались, откуда у техасского мирового судьи Томми Типтона (Tommy Tipton) взялись полмиллиона долларов в банкнотах с последовательными номерами (отслеживание номеров купюр — один из способов борьбы с оборотом криминальных денег).

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

Один нюанс, правда, от следствия ускользнул: брат везунчика, Эдди Типтон (Eddie Tipton), в то время работал в организации, участвующей в проведении лотерей во многих штатах (Multi-State Lottery Association). Там он отвечал за информационную безопасность и являлся одним из разработчиков компьютерной системы, которая — внимание! — генерировала выигрышные номера.

Выяснилось это, однако, гораздо позже, когда организаторы лотерей в разных штатах зафиксировали «эпидемию скромности» среди победителей. Так, в 2011 году выигравший джекпот счастливчик признался, что заявленный им победный билет на самом деле принадлежит его родственнику, которому, в свою очередь, передал билет уже упоминавшийся Томми Типтон. За долю от приза Типтон просил утаить выигрыш от своей супруги, с которой он все никак не мог развестись. Розыгрыш этого приза проводился с помощью системы, созданной и поддерживаемой его братом.

Эти улики и стали основой выдвинутых против Эдди Типтона обвинений в мошенничестве. В 2015 году он был признан виновным и приговорен к десятилетнему тюремному сроку, но был отпущен под залог на время рассмотрения апелляции.

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

Самое интересное — это, конечно, техническая сторона аферы. Итак, по версии следствия, Эдди Типтон модифицировал свою же программу, генерирующую выигрышные номера, чтобы при определенных условиях она выдавала не случайные, а предсказуемые последовательности. Важная деталь схемы: злоумышленники использовали билеты, в которых участник розыгрыша должен сам указать заветные номера.

Для срабатывания закладки требовалось одновременное выполнение трех условий: один из трех заранее выбранных дней в году, один из двух дней недели и определенное время суток.

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

В ходе крайне необычного следственного эксперимента с модифицированной программой криминалисты воспроизвели условия прошедшего розыгрыша (очевидно, установив соответствующее системное время) и получили ровно ту же выигрышную комбинацию.

Кроме хитроумной манипуляции с генератором случайных чисел Эдди Типтон обошел систему видеонаблюдения в помещении с компьютером. А вот дальше хакерские навыки его подвели — обхитрить систему целиком он не смог. Привлечение в аферу родственника, общение по мобильному телефону с посредниками, через которых планировалось получить выигрыш, собственноручное приобретение билета — все эти просчеты смазали картину грандиозной аферы.

Крутая история о том, как сделать один абсолютно анонимный и конфиденциальный звонок: http://t.co/KUS8aYsCiD pic.twitter.com/Jk7breQNzp

Впрочем, не наследить в современном мире крайне сложно. В пользу обвинения, например, сыграли данные о местоположении телефона Эдди Типтона в момент покупки билета. Еще одна улика в духе времени — запись в LinkedIn, оставленная одним из участников махинаций с билетами, которого Типтон на допросах никак не мог припомнить: «Всегда готов снова поработать с Эдди!»

Как же защититься от посягательств того, кто сам призван обеспечивать безопасность? Организаторы лотереи в штате Айова после разоблачения аферы заменили оборудование и программное обеспечение, проверили новый софт на наличие закладок, усилили видеонаблюдение и сильнее раздробили полномочия между сотрудниками, чтобы усложнить организацию подобной аферы.

История вторая: «Предвидение успеха»

Герои второй истории, случившейся в штате Коннектикут в 2015 году, тоже использовали свое служебное положение для взлома лотереи. В отличие от Типтона, они были не так близки к компрометируемой системе — работали в торговых точках, в которых установлены лотерейные машины.

Злоумышленникам удалось заставить машины печатать больше выигрышных билетов мгновенной лотереи под названием «5 Card Cash», чем рассчитывали ее организаторы. К примеру, один из «обманутых» автоматов выдал 67% выигрышных билетов, в то время как нормальный показатель составляет 24%.

В результате проведение «5 Card Cash» было остановлено во всем штате в ноябре 2015 года и до сих пор не возобновлено. Организаторы анонсировали обновление программного обеспечения машин, препятствующее манипуляциям.

Как сообщило издание Hartford Courant, технически взлом выглядел следующим образом. Злоумышленники намеренно замедляли работу машины (как возможный вариант — множеством запросов на вывод служебных отчетов). Затем оператор вызывал печать билета, но из-за особенности работы программы в таком нагруженном состоянии оператор мог успеть увидеть на экране сообщение системы, будет ли следующий выданный билет выигрышным. Если нет — продажа отменялась и вся операция повторялась вновь.

Хитрые приемы нечестной игры, конечно, применялись и раньше. Например, в Пенсильвании в 1980 году ведущий розыгрыша одной из телелотерей вместе с подельником заменил шары в лототроне на самодельные копии. Их масса была подобрана так, чтобы выпасть могли лишь два шара из десяти возможных — «4» и «6». В результате в розыгрыше произошло чертовски редкое совпадение — выпало число «666». Организаторы заметили и другую странность: кто-то массово скупал билеты с комбинациями четверок и шестерок, что и послужило поводом для начала расследования.

Может показаться, что в цифровой век выйти сухим из воды стало значительно проще. Однако, как показывают приведенные выше истории, преступников все равно ловят примерно на том же, на чем и в былые «аналоговые» времена.

В общем, попытки «сломать» систему неизбывны, равно как и наша рекомендация никогда не совершать противоправные действия, каким бы железобетонным ни казался план.

Источник

Подробно о генераторах случайных и псевдослучайных чисел

Введение

Как отличить случайную последовательность чисел от неслучайной?

Чуть более сложный пример или число Пи

Как выиграть в генераторе случайных чисел. Смотреть фото Как выиграть в генераторе случайных чисел. Смотреть картинку Как выиграть в генераторе случайных чисел. Картинка про Как выиграть в генераторе случайных чисел. Фото Как выиграть в генераторе случайных чисел
Последовательность цифры в числе Пи считается случайной. Пусть генератор основывается на выводе бит представления числа Пи, начиная с какой-то неизвестной точки. Такой генератор, возможно и пройдет «тест на следующий бит», так как ПИ, видимо, является случайной последовательностью. Однако этот подход не является критографически надежным — если криптоаналитик определит, какой бит числа Пи используется в данный момент, он сможет вычислить и все предшествующие и последующие биты.
Данный пример накладывает ещё одно ограничение на генераторы случайных чисел. Криптоаналитик не должен иметь возможности предсказать работу генератора случайных чисел.

Отличие генератора псевдослучайных чисел (ГПСЧ) от генератора случайных чисел (ГСЧ)

Источники энтропии используются для накопления энтропии с последующим получением из неё начального значения (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)

Результатом является nextseed сдвинутый вправо на 48-32=16 бит. Данный метод называется truncated-bits, особенно неприятен при black-box, приходится добавлять ещё один цикл в brute-force. Взлом будет происходить методом грубой силы(brute-force).

Пусть мы знаем два подряд сгенерированных числа 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.

Как выиграть в генераторе случайных чисел. Смотреть фото Как выиграть в генераторе случайных чисел. Смотреть картинку Как выиграть в генераторе случайных чисел. Картинка про Как выиграть в генераторе случайных чисел. Фото Как выиграть в генераторе случайных чисел

Экспоненциальное распределение

Тесты ГПСЧ

Некоторые разработчики считают, что если они скроют используемый ими метод генерации или придумают свой, то этого достаточно для защиты. Это очень распространённое заблуждение. Следует помнить, что есть специальные методы и приемы для поиска зависимостей в последовательности чисел.

Одним из известных тестов является тест на следующий бит — тест, служащий для проверки генераторов псевдослучайных чисел на криптостойкость. Тест гласит, что не должно существовать полиномиального алгоритма, который, зная первые k битов случайной последовательности, сможет предсказать k+1 бит с вероятностью большей ½.

В теории криптографии отдельной проблемой является определение того, насколько последовательность чисел или бит, сгенерированных генератором, является случайной. Как правило, для этой цели используются различные статистические тесты, такие как DIEHARD или NIST. Эндрю Яо в 1982 году доказал, что генератор, прошедший «тест на следующий бит», пройдет и любые другие статистические тесты на случайность, выполнимые за полиномиальное время.
В интернете [10] можно пройти тесты DIEHARD и множество других, чтобы определить критостойкость алгоритма.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *