Генератори псевдовипадкових чисел
Першою широко використовуваною технологією створення випадкового числа був алгоритм, запропонований Лехмером, що відомий як метод лінійного конгруента. Цей алгоритм параметризується чотирма числами в такий спосіб:
m |
Модуль (підстава системи) |
m > 0 |
a |
Множник |
0
|
c |
Збільшення |
0 с < m |
Х0 |
Початкове значення або зерно (seed) |
0 Х0 < m |
|
|
|
Послідовність випадкових чисел {Xn} виходить за допомогою наступної ітераційної рівності:
Xn+1 = (a Xn + c) mod m
Якщо m, а й с є цілими, то створюється послідовність цілих чисел у діапазоні 0 Xn < m.
Вибір значень для а, с и m є критичним для розробки гарного генератора випадкових чисел.
Очевидно, що m повинне бути дуже більшим, щоб була можливість створити багато випадкових чисел. Вважається, що m повинне бути приблизно дорівнючим максимальному позитивному цілому числу для даного комп'ютера. Таким чином, звичайно m близько або дорівнює 231.
Існує три критерії, використовувані при виборі генератора випадкових чисел:
Функція повинна створювати повний період, тобто повинні існувати всі числа між 0 і m до того, як створювані числа почнуть повторюватися.
Створювана послідовність повинна з'являтися випадково. Послідовність не є випадкової, тому що вона створюється детерміновано, але різні статистичні тести, які можуть застосовуватися, повинні показувати, що послідовність випадкова.
Функція повинна ефективно реалізовуватися на 32-бітних процесорах, а вперспективі на 64-бітних.
Значення а, с и m повинні бути обрані таким чином, щоб ці три критерії виконувалися. Відповідно до першого критерію можна показати, що якщо m є простим і с = 0, то при певному значенні а період, створюваний функцією, буде дорівнює m-1. Для 32-бітної арифметики відповідне просте значення m = 231 - 1. Таким чином, функція створення псевдовипадкових чисел має вигляд:
Xn+1 = (a Xn) mod (231 - 1)
Тільки невелике число значень а задовольняє всім трьом критеріям. Одне з таких значень є а = 75 = 16807, що використовувалося в сімействі комп'ютерів IBM 360. Цей генератор широко застосовується й пройшов більше тисячі тестів, більше, ніж всі інші генератори псевдовипадкових чисел.
Сила алгоритму лінійного конгруента в тім, що якщо співмножник і модуль (підстава) відповідним чином підібрані, то результуюча послідовність чисел буде статистично невідзначна від послідовності, що є випадкової з набору 1, 2, ..., m-1. Але не може бути випадковості в послідовності, отриманої з використанням алгоритму, незалежно від вибору початкового значення Х0. Якщо значення обране, то числа, що залишилися, у послідовності будуть визначені. Це завжди враховується при криптоаналізі.
Якщо супротивник знає, що використовується алгоритм лінійного конгруента, і якщо відомі його параметри (а = 75, с = 0, m = 231 - 1), то, якщо розкрито одне число, вся послідовність чисел стає відома. Навіть якщо супротивник знає тільки, що використовується алгоритм лінійного конгруента, знання невеликої частини послідовності досить для визначення параметрів алгоритму й всіх наступних чисел. Припустимо, що супротивник може визначити значення Х0, Х1, Х2, Х3. Тоді :
Х1 = (а Х0 + с) mod m
Х2 = (а Х1 + с) mod m
Х3 = (а Х2 + с) mod m
Ці рівності дозволяють знайти а, с и m.
Таким чином, хоча алгоритм і є гарним генератором псевдовипадкової послідовності чисел, бажано, щоб реально використовувана послідовність була непередбаченою, оскільки в цьому випадку знання частини послідовності не дозволить визначити майбутні її елементи. Ця мета може бути досягнута декількома способами. Наприклад, використання внутрішніх системних годиників для модифікації потоку випадкових чисел. Один зі способів застосування годиників складається в перезапуску послідовності після N чисел, використовуючи поточне значення годин по модулі m у якості нового початкового значення. Інший спосіб складається в простому додаванні значення поточного часу до кожного випадкового числа по модулю m.
