Кpиптогpафия от папиpуса до компьютеpа


Простейшие алгоритмы генерации - часть 3


В ней случайность ряда проверяется отображением на экране дисплея пар его чисел (Gn+1, Gn) в прямоугольнике размером 128 х 512. Это простой и удобный способ проверки случайности рядов чисел, так как на глаз заметны малейшие закономерности в получаемом орнаменте. Из опытов с этой программой можно убедиться, что как ни экспериментируй с подбором К, все равно закономерности видны и чисто случайного рада чисел не получишь. Вспомните ехидное предложение Додо "становиться строго в беспорядке" из "Алисы в стране чудес". Результат можно несколько улучшить. Если С нечетно и K=1+4*i, то период ряда равен М. После долгих поисков К исследователи остановились на значениях 69069 и 71365. Кроме значений М=2**N широко используются выборы простых М, например, простого числа М=2**31-1, известного со времен Эйлера (Это число "плохо" тем, что в двоичной записи содержит лишь единицы. Однако оно может использоваться, если вычисления выполняются в десятичной арифметике.)
     Однако обратимся к фактам. В 1948 году фон Нейман предложил генератор псевдослучайных чисел, который через год подвергся резкой критике. В 1972 году в пакете прикладных программ IBM 360 на языке Фортран появилась программа RANDU, а в 1977-м Форсайт показал, что тройки ее последовательных значений лежат на 15 параллельных плоскостях. В 1979 году Скраг опубликовал компактный алгоритм генерации псевдослучайных чисел, а через год Плаке доказал его статистическую неудовлетворительность. Этому списку нет конца: более месяца работы автор потерял из-за некомпетентно сделанного генератора случайных чисел в системе М86 ЕС 1840, который использовался для моделирования сложных процессов. В журнале "Наука и жизнь" за октябрь 1986 года М. Максимов поместил статью-предупреждение под названием "Случайны ли случайные числа?", где совершенно справедливо отметил негодность используемых генераторов. По его данным, генератор FRAN у БК-0010 имеет длину периода всего лишь 2**15, а бьет рекорды бессмыслицы генератор Бейсика ДВК, который имеет период лишь 8192 и последовательные тройки его "случайных" чисел, функционально связанные уравнением Gn-6*G(n+1)+9*G(n+2), равны целым числам. Не иначе, как от отчаяния, рад исследователей одновременно использует два и даже три разных генератора, смешивая их значения. Если разные генераторы независимы, то сумма их последовательностей обладает дисперсией, равной сумме дисперсий отдельных последовательностей. Иначе говоря, случайность рядов возрастает при их суммировании. Это дает слабую надежду на возможность конструирования генератора с приемлемыми для криптографии свойствами: случайностью и большой длиной периода.
     Заметим, что некоторые "запутывания" последовательностей псевдослучайных чисел лишь ухудшают их статистические свойства. Далеко не всегда сложность формирования рада порождает случайность распределения. Например, генератор случайных чисел из игровой программы неизвестного происхождения для программируемого калькулятора использовал в качестве случайных чисел первые цифры последовательности {83**K}. Легко доказывается, что такой генератор будет на 14% чаще давать цифру 7, чем 8. В литературе приводится громадное количество формул для генерации случайных рядов, и автору довелось испытать их не один десяток, но, не то чтобы хорошей, а даже удовлетворительной по статистическим свойствам найти не удалось. Сдается, что часть подобных способов генерации случайных рядов предложена в качестве шутки криптографами, желающими упростить себе работу. Однако в системах программирования обычно используют все же конгруэнтные генераторы по алгоритму, предложенному Национальным бюро стандартов США, который, имея длину периода 2**24, обеспечивает очень неплохие статистические свойства. К сожалению, длина его периода для криптографии слишком мала и, кроме того, было доказано, что последовательности, генерируемые конгруэнтными генераторами, не являются криптографически стойкими. Если дана часть такой последовательности достаточной длины, то ее параметры могут быть восстановлены.
     Интересный класс генераторов случайных чисел неоднократно предлагался многими специалистами целочисленной арифметике, в частности Джорджем Марсалиа и Арифом Зейманом. Генераторы этого типа основаны на использовании последовательностей Фибоначчи. Классический пример такой последовательности {0, 1, 1, 2, 3, 5, 8, 13, 21, 34...}. За исключением первых двух ее членов, каждый последующий член равен сумме двух предшествующих. Если брать только последнюю цифру каждого числа в последовательности, то получится последовательность чисел {0, 1, 1, 2, 5, 8, 3, 1, 4, 5, 9, 4...} Если эта последовательность применяется для начального заполнения массива большой длины, то, используя этот массив, можно создать генератор случайных чисел Фибоначчи с запаздыванием, где складываются не соседние, а удаленные числа. Марсалиа и Зейман предложили ввести в схему Фибоначчи "бит переноса", который может иметь начальное значение 0 или 1. Построенный на этой основе генератор "сложения с переносом" приобретает интересные свойства, на их основании можно создавать последовательности, период которых значительно больше, чем у применяемых в настоящее время конгруэнтных генераторов. По образному выражению Марсалиа, генераторы этого класса можно рассматривать как усилители случайности. "Вы берете случайное за- полнение длиной в несколько тысяч бит и генерируете длинные последовательности случайных чисел". Однако большой период сам по себе еще не является достаточным условием. Слабые места гамм бывает трудно обнаружить и аналитику требуется применять утонченные методы анализа последовательностей, чтобы выделить определенные закономерности, которые скрыты в большом массиве цифр.
     Последнее, на чем следует остановить внимание, это особенности использования стандартных генераторов случайных чисел в различных языках программирования, если уж ими пришлось воспользоваться. Так отметим, что известный в Бейсике оператор RANDOMIZE (Он такой же, как и во всех других языках программирования. например. Pascal или C++.) , применяемый для начальной установки генератора случайных чисел, может ошарашить пользователя. Ибо после выполнения:

     RANDOMIZE 231
     х = RND
     RANDOMIZE 231
     у = RND




- Начало -  - Назад -  - Вперед -



Книжный магазин