Як можна виявити, що генератор чисел насправді не випадковий?


20

Я чув, що генерація випадкових чисел у комп’ютерах насправді не випадкова, але не існує ефективного алгоритму, щоб його виявити. Як його взагалі можна виявити?


1
Ця публікація може вам допомогти.
Антон

6
Загрожуючи звучати педантично, не можна з впевненістю сказати, що дане джерело не є випадковим, якщо все, що ви робите, - це вивчити його результати. Ви можете перевернути справедливу монету разів поспіль і отримувати голову кожного разу, і ваш шанс отримати хвости на 10 100 + 1- й кидок все ще становить 50%. Досліджуючи джерело, ми зазвичай можемо ідентифікувати невипадкові речі (наприклад, генератори псевдовипадкових чисел ... ми могли б передбачити послідовність із насіння та алгоритму). Багато очевидних джерел випадковості можуть бути недостатньо зрозумілими для надійного прогнозування. Це, однак, філософське. 1010010100+1
Patrick87

@ Patrick87 Якщо з "визначеністю" ви маєте на увазі математично, це правда. Однак є статистичні тести, які можуть надати вам довільну значимість (за умови, що дані "хороші").
Рафаель

@ Patrick87 Загрожуючи озвучувати мирські ви ... ви говорите "Ви можете гортати справедливу монету разів поспіль і отримувати голову кожного разу" ... ні, я не можу. Будь-яка модель, яка дозволяє мені бачити навіть 10 3 голови підряд і все ще вважаю, що це справедлива монета, не дуже добре сприймає реальність. Це справді філософське. ;-)10100103
Дон Хетч

Відповіді:


15

Комп'ютери, які справді випадкові:

Справжня випадковість неможлива для машин Тьюрінга в теоретичному сенсі, і більшість комп'ютерів не можуть генерувати справді випадковий вихід. Тому деякі сучасні комп’ютери включають апаратне забезпечення, яке дозволяє комп'ютеру отримати доступ до зовнішнього джерела, яке, сподіваємось, включає деяку випадковість. Одним із прикладів, як це можна досягти, є відстеження невеликих коливань температури всередині комп'ютера. Випадковість може бути отримана і з зовнішнього джерела. Але з тональності вашого допису я не думаю, що зовнішні джерела випадковості - це те, що вас цікавить.

Насіння:

Без зовнішнього доповнення все, що робить комп'ютер, є детермінованим. Це призводить до великої проблеми: якщо ви викликаєте програму генерації випадкових чисел, вона буде давати вам однаковий результат кожного разу, якщо ви дасте їй один і той же вхід. Зрозуміло, що нам потрібна програма, яка виводить випадкове число, щоб змінювати свою поведінку кожного разу, коли вона буде запущена (інакше ми продовжуватимемо отримувати те саме "випадкове" число, що не особливо корисно). Одна ідея полягає в тому, щоб дати програмі деякий вклад, який змінюється щоразу, коли програма запускається, щоб виводилося інше число. Ми називаємо цей вхід "насінням". Генератору випадкових чисел потрібно взяти насіння, виконати деякі операції та дати нам випадкове число.

Поточний системний час є класичним прикладом насіння. Це дає довгу струну з високою ентропією, і якщо час відстежується досить детально (тобто, якщо ваш системний годинник використовує години, то "час" є досить бідним насінням), ви навряд чи зможете подати псевдослучайне число генератор однакове число двічі.

Алгоритми, які є випадковими:

Тепер у нас є алгоритм, який, принаймні, має бути способом бути різним щоразу, коли він запускається. Ми даємо йому насіння, і хоча алгоритм дає те саме число, коли запит із тим самим насінням, ми хочемо, щоб числа, які він створює, були випадковими інакше. Це діє так, як зазначено вище - ви берете деякий вклад, і він дає деякий (сподіваємось, досить різний від входу, щоб бути "випадковим").

Тепер скажімо, що ви створили свій власний алгоритм для цього, і ви стверджуєте, що цифри, які ви придумали, досить близькі до випадкових, коли ви дали йому купу різних насінин. Як би ми перевірили, наскільки це добре?

Тепер ми хочемо якийсь алгоритм, який візьме насіння, зробить деякі операції та створить випадкове число. Найпростіше, алгоритм може просто вивести насіння - він не дає нам однакової кількості кожного разу, а випадкові насіння дають нам випадкові результати. Але явно це не те, що ми хочемо. З іншого боку, алгоритм може бути досить складним, як і багато фактичних генераторів псевдовипадкових випадків. Як ми можемо сказати, які алгоритми дають нам "випадкові" числа з наших не обов'язково випадкових насінин? Якщо ми не можемо його зрозуміти точно, як ми можемо сказати, які найкращі?

1н

Випадково вистачить, щоб обдурити нападника:

Тепер те, про що ви МОЖЕ мати на увазі, це криптографічно захищені псевдовипадкові генератори. Я думаю, що найкращий спосіб пояснити це в контексті вищесказаного - тут ми використовуємо нашу випадковість для криптографії, тому, коли ми розробляємо тести, те, що нас дійсно хвилює, - це те, що хтось не зможе зламати наша безпека, передбачивши, яке випадкове число ми вибрали. Я не знаю вашого рівня знайомості з криптографією, але уявіть, що ми робимо просту заміну циферблату --- кожна літера замінюється якоюсь іншою літерою. Ми хочемо вибрати ці заміни випадковим чином, тому зловмиснику важко здогадатися. Але якщо він зможе зрозуміти, як працює мій генератор випадкових чисел, він зможе вирішити весь шифр! Тому для криптографічних алгоритмів потрібні генератори випадкових чисел, які особливо важко здогадатися.

З цієї причини CSPRG визначаються з точки зору того, наскільки добре їх вирішують інші алгоритми (саме там ми нарешті прийдемо до вашого питання). Зокрема, скажімо, у мене є CSPRG, який я називатиму R. R - це CSPRG, якщо і тільки якщо немає НЕ можливого алгоритму, який може здогадатися, який біт він виведе далі. Це вірно, навіть якщо ви знаєте всі попередні біти, які виводиться!

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

Тому з міркувань криптографії іноді, наскільки добре працює генератор псевдовипадкових чисел, визначається з точки зору того, наскільки це передбачувано для інших програм. Зауважте, що це все ще дає велику частину інтуїції "випадковості", як (скажімо), якщо ви знаєте, що всі випадкові виходи будуть непарними, це не є криптографічно безпечним і не проходить тест на випадковість здорового глузду.


7
Це гарна (але неповна) відповідь загалом, але пара пунктів помилкова. «Справжня випадковість для комп’ютерів неможлива, оскільки все, що вони роблять, є детермінованим». Це не завжди так, деякі процесори включають апаратний RNG. Комп'ютери також можуть реагувати на зовнішній вхід, який може бути випадковим. "… Для криптографії, тому нас не цікавить, наскільки вони" випадкові "з точки зору розподілу": насправді іноді рівномірний розподіл важливий у криптовалюті, наприклад, IV для CBC та k-параметр у DSA.
Жил "ТАК - перестань бути злим"

Він написав: "Без зовнішнього доповнення все, що робить комп'ютер, є детермінованим". Зовнішня добавка - це посилання на такі пристрої, як RNG, як ви згадуєте. Без цих доповнень наші обчислювальні можливості дорівнюють можливостям ТМ, для яких справжня випадковість неможлива.
Кент Мунт Касперсен

Якщо я пам'ятаю правильно, я додав це після коментаря Жиля.
СамМ

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

це може бути чіткіше розроблено, але не слід, яке ваше заперечення? справа в тому, що алгоритм, що генерує послідовність, не може бути визначений лише з послідовності даних тільки, за винятком грубої сили, якщо алгоритм захищений, а груба сила навряд чи вдасться досягти в цьому випадку.
vzn

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_congrustven_generator
[2] William H., та ін. (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-process-generate-truly-random-numbers /


Це насправді не відповідає на питання. Ви пояснюєте, як генерувати випадкові числа, а не визначати, чи є дана RNG випадковою. Навіть тоді ваших пояснень дещо не вистачає, лінійні збіги навряд чи є "найкращими". Зараз існують апаратні RNG, немає необхідності в квантових обчисленнях; є хороший шанс, що у вас є один у вашому ПК, один у вашому телефоні та навіть один у вашій кредитній картці.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.