Як правильно генерувати псевдовипадкові числа
Доброго вам дня.
Зі статті на Хабрі можна отримати одну формулу:
Але при використанні цієї формули у мене виходить не зовсім те, що потрібно.
Тому як правильно генерувати будь-яким алгоритмом псевдовипадкові числа? (Як, наприклад, у Пітоні при random.randint(arg1, arg2) або як у Java при використанні new Random().nextInt(100)
P.S: У мітках вказаноPythonіJava, але насправді підійде будь-яка, бажано сі-подібна, мова
Будь-яке, повторюся, абсолютно будь-яке, псевдовипадкове число перебуватиме в якійсь послідовності, причому сама послідовність буде будуватися за якоюсь формулою.
Я дуже глибоко сумніваюся що взагалі будь-хто коли-небудь зможе отримати абсолютно випадкове число, т.к. будь-яка випадковість – це непізнана закономірність!
Окреме питання - на скільки взагалі передбачувано поява вважав у Вашій послідовності. Ось від цього потрібно вести усі пошуки.
Візьмемо, наприклад, функцію rand() з будь-якої мови програмування. Вона буде генерувати псевдовипадкове число ґрунтуючись на мітки часу в unixtime. Наскільки вона передбачувана? Хм, думаю не менш як на 100%. Добре, виходить що знаючи приблизний час запуску функції rand(), скажімо, з точністю до 1 хвилини, ми можемо отримати таке саме псевдовипадкове число. Добре, тобто. ось від цього треба копати.
Припустимо, що ми витягли список компаній з ЄДРЮЛ по Москві і взяли їх ОРГН. Далі наша функція генерує unixtime і з нього ми віднімаємо цей самий ОГРН, причому останні дві цифтри в unixtime і ОГРН повинні збігатися (наприклад, умова вибору ОГРН може бути будь-яка). Чого ми досягли?Знаючи час роботи функції rand() ми не можемо згенерувати друге таке саме псевдовипадкове число. Ви мені можете зараз заперечити, що давайте візьмемо той самий ОГРН і повторимо процедуру. На цьому місці я хочу запитати Вас: а від кого ми взагалі будуємо захист? Зловмисник є творцем системи та знає про неї 100%? Я думаю будь-який захист у цьому випадку просто безглуздий.
Ви повинні внести у свою формулу генерації якусь несподівану поведінку, яка відрізнятиметься від того, що є в стандартній реалізації. Буде це якийсь ОГРН, дні народження Ваших колег, ID користувачів у ВК тощо. Зовнішньому атакуючому ця особливість не відома.
Чи буде при цьому Ваш ряд псевдовипадкових чисел більш менш випадковим? Хм. Велике питання. На цьому місці знову згадуємо, що таке випадковість. Чи дозволить це підвищити захищеність системи? Думаю від частини може, тому що зловмиснику невідомий алгоритм генерації, хоча це до певної міри і погано.
Резюмуючи все вище сказане – щоб зробити Ваш ряд псевдовипадкових чисел більш випадковим, потрібно до формули його генерації додати число з іншого ряду чогось псевдовипадкового. Також сильно рекомендую псевдовипадкове число перевіряти на простоту, якщо Ви його збираєтеся використовувати як значення в генерації секретного ключа для ГОСТ або RSA