Как правилно да генерираме псевдослучайни числа
Добър ден.
Една формула може да бъде извлечена от статията на Хабре:
Но когато използвам тази формула, не получавам точно това, от което се нуждая.
Следователно, как правилно да генерираме псевдо-случайни числа чрез всеки алгоритъм? (Като например в Python с random.randint(arg1, arg2) или като в Java с new Random().nextInt(100)
P.S: Етикетите казватPythonиJava, но всъщност всеки език, за предпочитане C-подобен, ще свърши работа
Всяко, повтарям,абсолютно всяко, псевдослучайно число ще бъде в някаквапоследователност, а самата последователност ще бъде изградена според някаква формула.
Дълбоко се съмнявам, че някой някога ще успее да получи напълно произволно число, защото. всяка авария е непозната закономерност!
Отделен въпрос е колко общопредвидиме появата на числата във вашата последователност. Това е мястото, където трябва да са всички ваши търсения.
Вземете например функцията rand() от всеки език за програмиране. Той ще генерира псевдо-случайно число въз основа на времеви клейма в unixtime. Колко предсказуема е тя? Хм, мисля, че поне 100%. Е, оказва се, че знаейки приблизителното време на изпълнение на функцията rand (), да речем, с точност до 1 минута, можем да получим точно същото псевдослучайно число. Отлично, т.е. Това е мястото, където трябва да копаете.
Да предположим, че сме извадили списък с компании от Единния държавен регистър на юридическите лица в Москва и сме взели техния ORGN. Освен това нашата функция генерира unixtime и ние изваждаме същия този OGRN от него, като последните две цифри в unixtime и OGRN трябва да съвпадат (например условието за избор на OGRN може да бъде всяко). Какво постигнахме?Знаейки времето на изпълнение на функцията rand(), не можем да генерираме второ точно същото псевдослучайно число. Сега можете да ми възразите, че нека вземем същия OGRN и повторете процедурата. В този момент искам да ви задам един въпрос: срещу кого изграждаме защита? Нападателят е създателят на системата и знае 100% за нея? Мисля, че всяка защита в този случай е просто безсмислена.
Трябва да въведете някакво неочаквано поведение във вашата формула за генериране, което ще бъде различно от това, което е в стандартната реализация. Това ще бъде някакъв вид OGRN, рождени дни на вашите колеги, потребителски идентификатори във VK и т.н. Тази функция не е известна на външен атакуващ.
Вашата поредица от псевдослучайни числа ще бъде повече или по-малко случайна? хм Голям въпрос. Тук отново си припомняме какво е злополука. Това ще подобри ли сигурността на системата? Мисля, че отчасти може, защото атакуващият не знае алгоритъма за генериране, въпреки че това е лошо до известна степен.
Обобщавайки всичко по-горе - за да направите вашата поредица от псевдо-случайни числа по-случайна, трябва да добавите число от друга поредица от нещо псевдо-случайно към формулата за генерирането му. Също така силно препоръчвам да проверите полученото псевдослучайно число за простота, ако ще го използвате като стойност при генериране на таен ключ за GOST или RSA