Генератор Фібоначчі (англ. lagged Fibonacci generator) — генератор псевдовипадкових чисел, також названий адитивний генератор.

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

У зв'язку з цим лінійний конгруентний алгоритм поступово втратив свою популярність і його місце зайняло сімейство алгоритмів Фібоначчі, які можуть бути рекомендовані для використання в алгоритмах.

Історія ред.

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

 

носить назву послідовність Фібоначчі.

На початку 50-х років вивчався даний алгоритм, проте, дослідження показали, що цей генератор, як джерело випадкових чисел, був неефективний. Вчені запропонували допрацьовану формулу послідовності Фібоначчі у вигляді:

 

Однак, позитивний результат вийшов лише при  .

У 1958 році було виведено послідовність[1]:

 

де,  ,   — парне число,   - довільні цілі не всі парні числа. Числа 24 і 55 обрані так, щоб визначалася послідовність, молодші значущі числові розряди   якої мають довжину періоду  .

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

Формула ред.

Адитивні генератори генерують замість випадкових бітів випадкові слова.

Для роботи адитивному генератору потрібно якийсь початковий стан, який є ключем - набір n-бітових слів: 16-бітових, 32-бітових, 64-бітових слів і т. Д. -  .

Знаючи початковий стан, можна обчислити  е слово генератора за формулою [2]:

 

причому період генератора повинен бути більше або дорівнювати  .

Приклади алгоритмів, на основі адитивних генераторів ред.

 
S 1 2 3 4 5 6 7
  3 5 17 21 63 125 377
Випадкові

послідовності

             
Г

е

н

е

р

а

т

о

р

и


Ф

і

б

о

н

н

а

ч

і

 


01

 

0011

 

0001, 0111

 

00001111,

01011010

 

00000101,

00011011,

00100111,

01011111

 

00000011,

00001001,

00010111,

00011101,

00101011,

00110101,

00111111,

01101111

 

00000001,

00000111,

00001011,

00001101,

00010011,

00010101,

00011001,

00011111,

00100101,

00101111,

00110111,

00111011,

00111101,

01010111,

01011011,

01111111

При   для випадкової послідовності   усі   різні, причому половина їх інверсні. Жирним шрифтом виділені послідовності де Брейна[3].

Основне джерело: [4]

1) Один з широко поширених генераторів Фібоначчі ґрунтується на наступній ітеративній формулі:

 

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

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

 

де   - число бітів дійсного числа.

Вибір параметрів ред.

Лаги a і b - «магічні» і їх не слід вибирати довільно. Рекомендуються наступні значення лагів:  ,   або  . Якість одержуваних випадкових чисел залежить від значення константи, і чим воно більше, тим вище розмірність простору, в якому зберігається рівномірність випадкових векторів, утворених з отриманих випадкових чисел. У той же час, зі збільшенням величини константи a збільшується обсяг використаної алгоритмом пам'яті.

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

В даний час підібрано досить багато пар чисел a і b, наведемо деякі з них:

 

2) Брюс Шнайєр у своїй роботі «Прикладна криптографія» наводить приклади 3-х алгоритмів на основі адитивних генераторів [5]:

Алгоритм Fish ред.

Fish - це адитивний генератор, заснований на методах, які використовуються в проріджувальному генераторі. Він видає потік 32-бітових слів, які можуть бути використані (за допомогою XOR) з потоком відкритого тексту для отримання шифротекста або з потоком шифротекста для отримання відкритого тексту. Назва алгоритму являє собою скорочення від Fibonacci shrinking generator - проріджувальний генератор Фіббоначі.

По-перше, використовуйте два наступних адитивних генератора. Ключем є початкові стани цих генераторів.

 
 

Ці послідовності проріджуються попарно в залежності від молодшого значущого біта  : якщо його значення дорівнює 1, то пара використовується, якщо 0 — ігнорується.   — це послідовність використаних слів  , a   — це послідовність використаних слів  . Для генерації двох 32-бітових слів-результатів   і   ці слова використовується парами —  .

 
 
 
 

Цей алгоритм швидкий на процесорі i486/33 реалізація Fish на мові С шифрує дані зі швидкістю 15-Мбіт/с. На жаль він є небезпечним, порядок розкриття становить близько 2 40.

Алгоритм Pike ред.

Pike - це збіднена і урізана версія Fish, запропонована Росом Андерсоном, тим, хто зламав Fish. Він використовує три адитивних генератора. Наприклад:

 
 
 

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

Pike швидше Fish, так як в середньому для отримання результату потрібно 2.75 дії, а не 3. Він також занадто новий, щоб йому довіряти, але виглядає непогано.

Алгоритм Mush ред.

Mush є взаємно проріджувальний генератор. Його роботу пояснити легко. Візьмемо два адитивних генератора: А і В. Якщо біт перенесення А встановлено, тактується В. Якщо біт перенесення В встановлено, тактується А. Тактуємо А і при переповненні встановлюємо біт перенесення. Тактуємо В і при переповненні встановлюємо біт перенесення. Остаточним виходом є XOR виходів А і В. Найпростіше використовувати ті ж генератори, що і в Fish:

 
 

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

Примітки ред.

  1. Кнут Д. Искусство программирования. — том 2. — 3-е издание. — 2001 г. — гл.3.2.2.
  2. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы и исходные тексты на языке C. — 2002 г. — С. 291.
  3. В.А.Песошин, В.М.Кузнецов, А.С.Кузнецова, А.Р.Шамеева - Генераторы псевдослучайных последовательностей немаксимальной длины на регистрах сдвига.
  4. Bruce, Schneier. 16.9 Additive Generators // Applied cryptography: protocols, algorithms, and source code in C. John Wiley & Sons, Inc., New York (1996).
  5. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы и исходные тексты на языке C. — 2002 г. — гл.16.9.

Посилання ред.