Неслучайная случайность

Всякий, кто питает слабость к арифметическим методам получения случайных чисел, грешен вне всяких сомнений.

Джон фон Нейман

Генераторы псевдослучайных чисел находят применение в различных программах, и, естественно, принцип их работы зависит от области применения. Для применения в криптографических системах генераторы псевдослучайных чисел должны отвечать следующим требованиям:

  • генерируемая последовательность должна иметь большой период;
  • генерируемая последовательность не должна иметь скрытых периодичностей;
  • генерируемая последовательность должна иметь равномерный спектр.

Одними из наиболее часто используемых являются варианты схемы, предложенной Д.Х.Лемером (линейный конгруэнтный генератор):

Gn+1 = (a*Gn+c) mod m

Сложность использования этого генератора состоит в выборе хороших значений G0, a, c и m. Например, в государственном стандарте РФ ГОСТ Р34.10-94 "Процедуры выработки и проверки цифровой подписи на базе асимметричных криптографических алгоритмов" полу-чение псевдослучайных чисел осуществляется с использованием линейного конгруэнтного датчика:

Gn+1 = (19381*Gn+c) mod 216

Пользователь выбирает начальное значение G0 и c, причем c - нечетное. Вообще говоря, существует ряд правил для выбора коэффициентов:

  • число m должно быть достаточно велико;
  • при использовании двоичной системы a выбирается таким образом, что a mod 8=5;
  • число c должно быть нечетным. Желательно также соблюдать соотношение c/m = 0.5-(1/6)*sqrt(3);

Всем требованиям, предъявляемым к генераторам псевдослучайных последовательностей для применения в криптографических системах, отвечают генераторы, основанные на теории конечных полей Галуа.

Бинарная псевдослучайная последовательность периода 2n-1 образуется при делении некоторого начального значения на неприводимый многочлен степени n, который называется порождающим многочленом. Шаг деления состоит в сдвиге начального значения влево на один бит (умножение на 2) и установке крайнего правого бита в значение суммы бит по модулю 2 (XOR), умноженных на соответствующие коэффициенты порождающего многочлена.

var
 rg:byte;
 counter,carry,c7,c3,c0:byte;
begin
 rg:=1;
 for counter:=1 to 128 do
 begin
 if (rg AND 128)<>0
 then c7:=1
 else c7:=0;
 if (rg AND 8)<>0
 then c3:=1
 else c3:=0;
 if (rg AND 1)<>0
 then c0:=1
 else c0:=0;
 Carry:=c7 XOR c3 XOR c0;
 rg:=rg*2 OR Carry;
 end;
end;

Приведенный алгоритм реализует деление начального значения на порождающий многочлен x7+x3+1 и генерирует последовательность с периодом 127. Алгоритм реализован на Delphi, но для практического использования предпочтительным представляется ассемблерный вариант.

Несколько слов о неприводимых многочленах. Их нахождение производится путем подбора и требует больших вычислительных мощностей. Несомненно, криптографические ведомства развитых стран ведут работу в этой области, но результаты не попадают в открытую печать. Известен неприводимый многочлен x61+x3+1 (период генерируемой последовательности 2 305 843 009 213 693 951), по многочленам больших степеней информацию обнаружить не удалось. Опубликованы таблицы неприводимых многочленов, например, для сте-пеней <=33. Для получения последовательностей больших периодов можно использовать несколько параллельно работающих генераторов.

А.В.БЫЧЕНКОВ,
[email protected]

Версия для печатиВерсия для печати

Номер: 

28 за 1999 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя levsha
Есть такая статья W. Stahnke, Math. Comp. 27 (1973), 977-980 в ней приведены все неприводимые многочлены k<168. Возможно кому-то удасться найти. Ссылка дается в Д.Кнут "ИП" т.2