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

20

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

URL87
источник
1
Этот пост может вам помочь.
Антон
6
Рискуя педантично, на самом деле невозможно с уверенностью сказать, что данный источник не является случайным, если все, что вы делаете, это проверяете его результаты. Вы можете бросить честную монету раз подряд и каждый раз получать головы, и ваш шанс получить хвосты на 10 100 + 1- м броске по-прежнему составляет 50%. Исследуя источник, мы обычно можем идентифицировать неслучайные вещи (например, генераторы псевдослучайных чисел ... мы могли бы предсказать последовательность из начального числа и алгоритма). Многие очевидные источники случайности могут просто не быть поняты достаточно, чтобы предсказать надежно. Это философски, хотя. 1010010100+1
Patrick87
@ Patrick87 Если с "уверенностью" вы имеете в виду математически, это правда. Однако существуют статистические тесты, которые могут дать вам произвольную значимость (при условии, что данные «хорошие»).
Рафаэль
@ Patrick87 Риск звучать обыденно ... вы говорите: "Вы можете подбросить честную монету раз подряд и каждый раз получать головы" ... нет, я не могу. Любая модель, которая позволяет мне видеть даже 10 3 головы подряд и все еще считает, что это честная монета, не очень хорошо отражает реальность. Это действительно философский, хотя. ;-)10100103
Дон Хэтч

Ответы:

15

Компьютеры действительно случайны:

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

Семена:

Без внешнего добавления все, что делает компьютер, является детерминированным. Это приводит к большой проблеме: если вы вызываете программу генерации случайных чисел, она будет давать вам один и тот же результат каждый раз, если вы дадите ей один и тот же ввод. Ясно, что нам нужна программа, которая выводит случайное число, чтобы изменять его поведение при каждом запуске (в противном случае мы будем получать одно и то же «случайное» число, что не особенно полезно). Одна идея состоит в том, чтобы дать программе некоторый ввод, который меняется при каждом запуске программы, так что будет выводиться другое число. Мы называем этот вход "семя". Генератор случайных чисел должен взять начальное число, выполнить некоторые операции и дать нам случайное число.

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

Достаточно случайных алгоритмов:

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

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

Теперь нам нужен некоторый алгоритм, который будет принимать начальное число, выполнять некоторые операции и производить случайное число. В самом простом случае алгоритм может просто выводить начальное число - он не дает нам одно и то же число каждый раз, а случайные начальные значения дают нам случайные выходные данные. Но ясно, что это не то, что мы хотим. С другой стороны, алгоритм может быть довольно сложным, как и многие фактические псевдослучайные генераторы. Как мы можем сказать, какие алгоритмы дают нам «случайные» числа из наших не обязательно случайных семян? Если мы не можем получить это точно, как мы можем сказать, какие из них лучше?

1N

Случайного достаточно, чтобы обмануть атакующего:

Теперь вы МОЖЕТЕ иметь в виду криптографически безопасные псевдослучайные генераторы. Я думаю, что лучший способ объяснить это в контексте вышеизложенного - здесь мы используем нашу случайность для криптографии, поэтому при разработке тестов мы действительно заботимся о том, чтобы кто-то не смог взломать наша безопасность, предсказывая, какое случайное число мы выбрали. Я не знаю, насколько вы знакомы с криптографией, но представьте, что мы делаем простую замену шифра - каждая буква заменяется другой буквой. Мы хотим выбирать эти замены случайным образом, чтобы злоумышленнику было сложно их угадать. Но если он сможет выяснить, как работает мой генератор случайных чисел, он сможет разгадать весь шифр! Следовательно, криптографические алгоритмы требуют генераторов случайных чисел, которые сложно угадать.

По этой причине CSPRG определяются с точки зрения того, насколько хорошо их решают другие алгоритмы (вот где мы наконец подошли к вашему вопросу). В частности, скажем, у меня есть CSPRG, который я назову R. R является CSPRG тогда и только тогда, когда НЕТ выполнимого алгоритма, который может угадать, какой бит будет выведен следующим. Это верно, даже если вы знаете все предыдущие биты, которые он выводит!

Итак, допустим, что первые пять бит, которые выводит мой CSPRG, составляют 10100. Вы не знаете, какой ввод я использовал для программы, но у вас есть доступ к коду, который я использовал для написания своего CSPRG. Тогда утверждается, что вы не можете написать программу, чтобы решить, будет ли следующий битовый вывод 101000 или 101001.

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

Samm
источник
7
Это хороший (но не полный) ответ в целом, но пара моментов неверна. «Истинная случайность невозможна для компьютеров, поскольку все, что они делают, является детерминированным». Это не всегда так, некоторые процессоры включают аппаратный ГСЧ. Компьютеры также могут реагировать на внешний вход, который может быть случайным. «… Для криптографии, поэтому нам все равно, насколько« случайными »они являются с точки зрения распределения»: на самом деле иногда в криптографии важно равномерное распределение, например, IV для CBC и параметр k в DSA.
Жиль "ТАК - перестань быть злым"
Он написал: «Без внешнего дополнения все, что делает компьютер, является детерминированным». Внешнее дополнение - это ссылка на такие устройства, как RNG, как вы упомянули. Без этих дополнений наши вычислительные возможности равны тем возможностям ТМ, для которых настоящая случайность невозможна.
Кент Мунт Касперсен
Если я правильно помню, я добавил это после комментария Жиля.
SamM
4

Недавно я нашел хороший пост о случайности в вычислениях в блоге MIT CSAIL Theory of Computation Group: можете ли вы сказать, является ли бит случайным?

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

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

Например, см. Недавнюю работу Умеша Вазирани, Томаса Видика, Сертифицируемая квантовая кость (или тестируемое экспоненциальное расширение случайности)

Аннотация: Мы представляем протокол, с помощью которого можно использовать пару квантово-механических устройств для генерации n битов истинной случайности из начального числа O (log n) однородных битов. Генерируемые биты являются, безусловно, случайными, основываясь только на простом статистическом тесте, который может выполнить пользователь, и на предположении, что устройства подчиняются принципу отсутствия сигнализации. Никаких других предположений не делается для внутренней работы устройств ....

Вор
источник
3

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

Тестовые наборы Diehard объединяют разные методы.

Рафаэль
источник
0

Это широкая / сложная тема в информатике, на которую другой ответ SamM обращается к некоторым. Ваш конкретный вопрос, по-видимому, заключается в том, если компьютеры имеют так называемые PRNG , то есть генераторы псевдослучайных чисел, как можно это обнаружить?

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

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

В некоторых случаях PRNG могут быть сломаны (опять же, в зависимости от их «безопасности»), выполняя для них большой набор статистических тестов на случайность. Например, это обоснование программы «Dieharder» (автор Браун). Существует также набор NIST .

Внутренняя трудность / твердость взлома PRNG еще не строго теоретически доказана, но в основном связана с так называемыми «люками» или «односторонними функциями», которые можно эффективно вычислить в одном направлении, но «трудно» инвертировать (обратить вспять) , В криптографии есть некоторые открытые проблемы, касающиеся жесткости случайности. Эти вопросы тесно связаны с разделением классов сложности, например, знаменитый вопрос P =? NP.

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

Как отмечает Жиль в комментарии, существуют аппаратные ГСЧ, построенные на основе физических электронных процессов, например связанных с квантовым шумом. они, если спроектированы правильно, не ломаются.

ВЗН
источник
«Нетривиальные PRNG построены так, что их алгоритмы не могут быть обнаружены (получены)» - я не думаю, что это правильно. На самом деле, ваше следующее предложение противоречит этому. Хотите отредактировать свой ответ, чтобы это исправить?
DW
это можно было бы конкретизировать, но не следовать, каковы ваши конкретные возражения? Дело в том, что алгоритм, который генерирует последовательность, не может быть определен только по последовательности данных, кроме как методом грубой силы, если алгоритм безопасен, и грубая сила вряд ли будет успешной в этом случае.
ВЗН
1
Мое особое возражение заключается в том, что предложение звучит неправильно для меня: похоже, вы говорите, что PRNG разработаны таким образом, чтобы кто-то, наблюдающий за их результатами, не мог понять, каким был алгоритм, но это не так, как все работает в реальной жизни. Большинство PRNG не созданы для того, чтобы помешать кому-либо изучить алгоритм; как правило, алгоритм является публичным. Возможно, вы имеете в виду, что PRNG созданы так, что их выходные данные нельзя отличить от истинно-случайных бит?
DW
1
«алгоритм, который генерирует последовательность, не может быть определен только из последовательности данных, кроме как методом грубой силы, если алгоритм безопасен» - это тоже не правильно. Алгоритм , как правило , общественность. Это только семя, которое не является публичным, и это только семя, которое, как предполагается, трудно извлечь из результатов.
DW
-1

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

Люди используют псевдослучайные генераторы, которые имеют начальное число, т. Е. Число, которое используется для вычисления всех чисел генератора псевдослучайных чисел (в некоторых более сложных случаях моделирования или других задачах может потребоваться больше начальных чисел). , если требуется более одного набора независимо случайных чисел). Семя обычно 0 или конкретное число, если вы хотите воспроизводимых результатов, или время, если вы и другие невоспроизводимые результаты.

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

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

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

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

оно имеет четыре значения:
- x_0 ≥ 0
- a ≥ 0
- c ≥ 0
- m> x_0, где:

x0 - начальное значение, a, c и m - константы, где: m> a, m> c, и это создает последовательность с формулой:

x_ {i + 1} = (a * x_i + c) MOD m

Значения для этих констант должны быть тщательно выбраны. Одна возможность:

x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^ 32, ссылки [1-2]

Существуют и другие алгоритмы, более сложные для генерации случайных чисел, которые позволяют избежать некоторых проблем предыдущих алгоритмов, в том числе: [3]

  • более короткие, чем ожидалось, периоды для некоторых начальных состояний (в этом контексте такие начальные состояния можно назвать «слабыми»);
  • отсутствие равномерности распределения для больших количеств генерируемых чисел;
  • соотношение последовательных значений;
  • плохое размерное распределение выходной последовательности;
  • расстояния между тем, где встречаются определенные значения, распределены не так, как в случайном распределении последовательностей.

В будущем классические компьютеры могут быть объединены в квантовые системы, которые могут предоставлять действительно случайные числа и доставлять их. [4]

ссылки:
[1] http://en.wikipedia.org/wiki/linear_congruential_generator
[2] Уильям Х. и др. (1992). «Численные рецепты в Фортране 77: искусство научных вычислений» (2-е изд.). ISBN 0-521-43064-X.
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /

sissi_luaty
источник
Это на самом деле не отвечает на вопрос. Вы объясняете, как генерировать случайные числа, а не определять, является ли данный ГСЧ случайным. Даже тогда ваши объяснения в некоторой степени отсутствуют, линейные сравнения вряд ли являются «одними из лучших». Аппаратные ГСЧ существуют сейчас, квантовые вычисления не нужны; есть хороший шанс, что у вас есть один на вашем компьютере, один на вашем телефоне и даже один на вашей кредитной карте.
Жиль "ТАК - перестань быть злым"