Як правильно генерувати псевдовипадкові числа

Будь-яке, повторюся, абсолютно будь-який. псевдовипадкове число буде знаходитися в якійсь послідовності. причому сама послідовність буде будуватися з якоїсь формулою.

Я дуже глибоко сумніваюся що взагалі хто-небудь коли-небудь зможе отримати абсолютно випадкове число, тому що будь-яка випадковість це непізнана закономірність!

Окреме питання - на скільки взагалі очікувати появи чіслел у Вашій послідовності. Ось від цього потрібно вести всі пошуки.

Візьмемо, наприклад, функцію rand () з будь-якої мови програмування. Вона буде генерувати псевдовипадкове число грунтуючись на мітки часу в unixtime. На скільки вона передбачувана? Хм, думаю не менш ніж на 100%. Добре, виходить що знаючи приблизний час запуску функції rand (), скажімо, з точністю до 1 хвилини, ми можемо отримати точно таке ж псевдовипадкове число. Відмінно, тобто ось від цього потрібно і копати.

Давайте припустимо, що ми витягли список компаній з ЕГРЮЛ по Москві і взяли їх ОРГН. Далі, наша функція генерує unixtime і з нього ми віднімаємо цей самий ОГРН, причому останні дві ціфтри в unixtime і свідоцтво про Державну повинні збігатися (наприклад, умова вибору свідоцтва про Державну реєстрацію може бути будь-який). Чого ми досягли? Знаючи час роботи функції rand () ми не можемо згенерувати другий точно таке ж псевдовипадкове число. Ви мені можете зараз заперечити, що давайте візьмемо той же свідоцтва про Державну реєстрацію і повторимо процедуру. На цьому місці я хочу задати Вам питання: а від кого ми взагалі будуємо захист? Зловмисник є творцем системи і знає про неї 100%? Я думаю будь-який захист в цьому випадку просто безглузда.

Ви повинні внести в свою формулу генерації якесь несподіване поведінку, які буде відрізнятися від того, що є в стандартній реалізації. Буде це якийсь ОГРН, дні народження Ваших колег, ID користувачів в ВК і т.п. Зовнішньому атакуючому ця особливість не відома.

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

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

"Я дуже глибоко сумніваюся що взагалі хто-небудь коли-небудь зможе отримати абсолютно випадкове число, тому що будь-яка випадковість це непізнана закономірність!" - квантові процеси же? ЕМНІП, було щось на тему того, що будь-якої послідовності результати належати не можуть принципово.

Але так, потрібно залізо :-)

Для правильного питання треба знати половину відповіді

Практично всі генератори псевдовипадкових чисел генерують саме послідовності, де, знаючи початкове число (seed), можна повторити всю послідовність. Для генерації дійсно випадкових чисел використовують апаратні пристосування або накопичення ентропійних подій (затримки між натисканнями на клавіші, руху миші).
Код, який використовує Java, наведено в цій же статті, як і код, який відновлює seed за двома поспіль йде результатами nextInt.

Мда.
Чи то лижі не їдуть, чи то я.
читаємо:
Тому як правильно генерувати будь-яким алгоритмом псевдовипадкові числа.
Ну дивіться, мені потрібно генерувати випадкове число своїм алгоритмом. А по цій формулі у мене є якась послідовність, тому мені потрібно рішення без будь-яких послідовностей
Це два протилежних поняття.
Псевдовипадкові - підкоряються закону (формулою генерації).
Випадкові - відповідно, немає.
Тому, якщо потрібні, все-таки, випадкові і щоб ніхто не здогадався, тоді використовуємо динамічні параметри зовнішнього середовища (для конкретного випадку - параметри від ОС): температура з датчиків, обсяг вільного / зайнятого місця на диску, обсяг зайнятої / вільної пам'яті, кол-во і ідентифікатори процесів і т.д.

Критерій вибору параметра: швидко і непередбачувано змінюється значення в часі і не залежить від алгоритму в коді генератора, недоступне із зовні.

Хешіруем параметри з timestamp будь-яким алгоритмом і беремо каую-то частина з отриманого хешу.
ВАЖЛИВО! Параметри для хешування не повинні бути доступні публічно: ніяких зовнішніх запитів з ІПН, ОГРН і GISMETEO! )

Найпростіший варіант: Взяли картинку і зробили будь-які перетворення з нею, потім зберегли в потік даних, взяли будь біт або кілька. Картинку генеруємо на основі зовнішніх факторів і ніколи не поміщаємо в исходник алгоритму.

Схожі статті