Алгоритмы генерации псевдопростых чисел в «Borland C++ 3. 1»

УДК 681.3.067

И.А. Кукало, П.А. Миклин, Р.В. Литвинов

Алгоритмы генерации псевдопростых чисел в «Бог!апа С++ 3.1»

Выполнено экспериментальное исследование быстродействия алгоритмов генерации простых чисел методом пробных делений и методами малой теоремы Ферма, Рабина — Миллера и Соловэя — Штрассена, использующими фильтр деления на малые простые числа. Для каждого из методов представлены временные зависимости скорости генерации от числа разрядов, полученные усреднением большого ансамбля частных реализаций.

В конце XX — начале XXI в. мировое сообщество вступило в новую технологическую эпоху — эру информационных технологий. Эта индустрия занимается производством, обработкой, хранением и передачей информации. Он стала неотъемлемой частью мировой хозяйственной системы, вполне самостоятельным и довольно значительным сектором экономики. Зависимость современного общества от информационных технологий настолько высока, что сбои в информационных системах способны привести к значительным общественным и межгосударственным инцидентам.

Передача информации — ключевая отрасль для информационных технологий, ведающая вопросами транспортировки информации. Однако именно при транспортировке информация более всего уязвима к различного рода злоупотреблениям. Действительно, узлы хранения и обработки данных ввиду их компактности можно физически защитить от доступа злоумышленников, чего не скажешь о линиях связи протяженностью многие сотни или тысячи километров, защитить их практически невозможно. Поэтому именно для каналов передачи информации весьма актуальна проблема защиты информации. Важнейшую роль в решении этой проблемы играет криптография. Ее привлекательность состоит в том, что в отличие от других подходов криптографические методы защиты информации основаны на преобразовании самой информации и никак не связаны с характеристиками ее материальных носителей, вследствие чего наиболее универсальны и потенциально дешевы в реализации.

Важным понятием в криптографии является ключ — сменный элемент шифра, который применяется для шифрования конкретного сообщения. При создании ключей в современных ассиметричных криптосистемах и их распределении между пользователями используются большие простые числа, разрядность (биты) которых может достигать нескольких сотен или даже тысяч. Арифметические операции с такими числами на обычных ПК требуют создания специального программного обеспечения [1], в том числе реализации быстрых алгоритмов генерации простых чисел [2]. Огромная разрядность этих чисел, диктуемая современными требованиями безопасности, делает детерминированные алгоритмы малоэффективными. В настоящее время для этой цели используются методы генерации чисел, простоту которых можно обеспечить с вероятностью не менее 1—2 128.

1. Базовый метод генерации больших простых чисел с использованием фильтра деления на малые простые числа

Этот метод опирается на теорему Евклида о бесконечности множества простых чисел. Алгоритм работы метода следующий: генерируется псевдослучайное число п, затем осуществляется тестирование этого числа на простоту каким-либо из методов [3]. Попытка продолжается до тех пор, пока не найдется простое число либо количество попыток N не станет равным

где К > 1 — коэффициент запаса; [...] — операция взятия целой части.

Формула (1) получена на основе закона распределения простых чисел, который показывает, что вероятность случайно выбранного числа оказаться простым равна 1/1пп. Алгоритм базового метода может быть представлен следующими шагами:

1) задаём I — нижняя граница диапазона, в котором должно находиться простое число;

2) задаём и — верхняя граница диапазона, в котором должно находиться простое число;

3) проверим корректность задания диапазона 2 < I < и;

4) подсчитаем максимальное количество попыток г ^ 100([log2u]+1);

5) г ^ г — 1;

6) если г < 0, то лимит попыток исчерпан (событие имеет очень малую вероятность; в наших исследованиях ни разу не реализовалось; в случае его реализации, необходимо перезапустить программу);

7) выберем в заданном интервале и < п < I случайное число п;

8) если п меньше, чем 1999, то тестирование выполняется методом пробного деления на все известные (табулированные) простые числа, меньшие, чем п. Если делитель существует, то переходим на шаг 5;

9) если п больше, чем 1999, то тестирование выполняется методом пробного деления на все известные (табулированные) простые числа, меньшие, чем 1999. (Этот шаг позволяет исключить 85 % составных чисел [1].) Если делитель существует, то переходим на шаг 5;

10) тестируем п на простоту выбранным методом;

11) если тест отрицателен, переходим на шаг 5;

12) если тест положителен, то сгенерировано простое число в заданном диапазоне. Этот алгоритм реализован в виде программы, написанной на языке программирования

С++ и не зависит явно от особенностей того или иного теста, оформленного в виде подпрограммы, вызываемой на шаге 8.

2. Алгоритмы тестирования на простоту

2.1. Метод пробных делений

Этот тест представляет собой специально написанную на языке программирования С++ функцию. Он основан на пробном последовательном делении сгенерированного псевдослучайного числа п на все целые числа от 2 до [2].

2.2. Метод на основе малой теоремы Ферма

Тест также оформлен в виде специально написанной функции. Он использует утверждение малой теоремы Ферма о том, что если п простое, то выполняется условие: при всех а е {2,3,...,п—1} , для которых НОД(а,п)=1, имеет место сравнение

Обратное утверждение неверно. Если сравнение (2) не выполнено, хотя бы для одного а е{2,3,..., п—1}, то п — составное.

Для сокращения времени генерации удобно использовать в качестве а («свидетеля» простоты), известные (табулированные) простые числа, что позволяет исключить проверку условия НОД(а,п)=1. Тогда можно применить следующий вероятностный алгоритм тестирования на простоту: г ^ 1.

Выбираем из упорядоченного по величине массива простых чисел г-е простое число.

Проверяем выполнимость сравнения (2):

если сравнение не выполнено, то ответ «п — составное»;

если сравнение выполнено, то г ^ г + 1;

если г < и, то переходим к шагу 2;

если г > и, то ответ «п — псевдопростое с точностью 1 — 2 и», где и >1 — коэффициент точности.

2.3. Метод на основе теста Соловэя — Штрассена

Этот метод основан на следующей теореме. Для любого нечетного п следующие условия эквивалентны: п — простое, для любого а е^ выполняется сравнение

а'

п-1 _

1 (mod п).

Тогда можно использовать следующий вероятностный алгоритм тестирования на простоту:

1) г ^ 1;

2) выбираем из упорядоченного по величине массива простых чисел г-е простое число;

3) проверяем выполнимость сравнения (3);

4) если сравнение не выполнено, то ответ «п — составное»;

5) если сравнение выполнено, то г ^ г + 1;

6) если г < U, то переходим к шагу 2;

7) если г > U, то ответ «п — псевдопростое с точностью 1 — 2 и», где U > 1 — коэффициент точности.

2.4. Метод на основе теста Миллера — Рабина

Пусть п — нечетное и п — 1=2st; t — нечетное. Если число п является простым, то при всех а > 2 выполняется сравнение

an-1 = 1

t 2t qS_11

Поэтому, рассматривая элементы at, a2t,... , a2 t , можно заметить, что либо среди них найдется равный -1(mod n), либо at = 1 (mod n) . На этом замечании основан следующий вероятностный тест простоты:

1) г ^ 1;

2) выбираем из упорядоченного по величине массива простых чисел г-е простое число;

3) вычисляем at (mod п );

4) если at = +1 (mod п), то переходим к шагу 3;

/ t / t tt tt \2s 1

5) (a ) , (a ) , (a ) ... (a ) (mod п) до тех пор, пока не появится -1;

6) если ни одно из этих чисел не равно -1, то ответ «п — составное»;

7) если мы достигли -1, то г ^ г + 1;

8) если г < U, то переходим к шагу 2;

9) если г > U, то ответ «п — псевдопростое с точностью 1 — 4 U», где U > 1 — коэффициент точности.

2.5. Метод генерации псевдослучайных чисел

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

Xi+1 = (Xi  a + 1)modm ,

где a = 6364136223846793005; m = Параметры a и m были взяты из таблицы результатов спектрального теста [1]. При этих числах последовательность имеет максимальную длину периода и обладает хорошими статистическими свойствами. Для того чтобы тесты всегда проводились с различными числами, перебор данной псевдослучайной последовательности начинался с разного члена этой последовательности, номер которого, в свою очередь, генерировался встроенным в Borland C++ 3.1 генератором псевдослучайных чисел.

3. Результаты численных экспериментов

Описанные выше алгоритмы были реализованы в виде специальных программ, написанных на языке Borland C++ 3.1 с использованием подключаемых модулей для элементарных арифметических операций с большими числами [1]. В теле программы был организован счетчик времени ее работы. Время генерации простого (псевдопростого) числа являлось выходным параметром программы, так же как само число и количество занимаемых им бит. Программа, реализующая какой-либо из описанных выше методов, запускалась не менее 25 раз на ПК со следующими параметрами: Toshiba Satellite L100-194 15"XGA СМ-1700/256Мб DDRII^O^/DVD—RW/WiFi/WXPh. Время генерации усреднялось по всем полученным реализациям.

Результаты работы программ представлены на рис. 1 в виде зависимостей времени генерации от числа бит. Особенностью зависимостей 2—4 является их флуктуирующий характер. Амплитуда флуктуаций уменьшается с ростом числа реализаций, используемых при получении усредненной зависимости (на единичных реализациях амплитуда флуктуаций на порядок выше). Наличие флуктуаций обусловлено вероятностным характером алгоритмов генерации простых чисел, отвечающих кривым 2—4. Подобные флуктуации отсутствуют на кривой 1, отвечающей детерминированному алгоритму пробных делений.

Как известно [4], теоретическая сложность вычислений метода пробных делений (кривая 1) оценивается соотношением

N = О {4П),

где п — исследуемое число.

s

S я

й Л <и К

<и Л

PQ

10 9 8 76 5' 4 321

100 200 300 400 500 600 700 800 900 1000 Разрядность числа, бит

Рис. 1. Зависимость времени генерации простого числа от количества разрядов: 1 — методом пробного деления; 2 — методом на основе теста Миллера — Рабина; 3 — методом на основе малой теоремы Ферма; 4 — методом на основе теста Соловэя — Штрассена;

5 — теоретическая оценка сложности вычислений

В свою очередь теоретическая сложность вычислений методов на основе теста Миллера — Рабина (2), малой теоремы Ферма (3) и теста Соловэя — Штрассена (4) оценивается как [5]

N = O (log3 n) = O (k3

-V-,.

где к, — разрядность числа. Таким образом, вычислительная сложность у последних трех тестов не ниже, чем у метода пробных делений (О(^3 п) << О(п0 5)), что демонстрируется кривыми на рис. 1. Высокая вычислительная сложность метода пробных делений делает его малопригодным для практической реализации.

Кривая 5 на рис. 1 описывается зависимостью N = 8,913 • 10"9 к3 и соответствует теоретической оценке с ограничивающей постоянной С = 8,913 • 10"9 , где экспериментальная зависимость была аппроксимирована теоретической зависимостью методом наименьших квадратов. Из сравнения этой кривой с кривыми 2—4 видно, что реализованные программы генерации простых чисел с числом разрядов, превышающим 900 бит, работают чуть быстрее, чем предсказывает теоретическая оценка.

4

0

Заключение

Таким образом, в работе представлены алгоритмы генерации больших простых чисел на основе методов пробного деления, Миллера — Рабина, малой теоремы Ферма, Соловэя — Штрассена, непосредственно пригодные для программной реализации в среде Borland С++ 3.1. Выполнены численные расчеты скорости генерации от числа разрядов. Определена нижняя граница числа разрядов, равная 900 бит, начиная с которой разработанные программы работают быстрее, чем предсказывает теоретическая оценка сложности вычислений.

Литература

1. Вельшенбах М. Криптография на Си и С++ в действии / М. Вельшенбах. - М. : Триумф, 2004. - 464 с.

2. Смарт Н. Криптография / Н. Смарт. - М. : Техносфера, 2005. - 528 с.

3. Фергюсон Н., Шнайер Б. Практическая криптография / Н. Фергюсон, Б. Шнайер. -М. : Вильямс, 2005. - 424 с.

4. Василенко О.Н. Теоретико-числовые алгоритмы в криптографии / О.Н. Василенко. -М. : МЦНМО, 2003. - 328 с.

5. Черемушкин А.В. Лекции по арифметическим алгоритмам в криптографии / А.В. Черемушкин. - М. : МЦНМО, 2002. - 104 с.

Кукало Иван Анатольевич

Студент гр. 1А5 ТУСУРа Эл. почта: ka1ita@ms.tusur.ru

Миклин Павел Александрович

Доцент кафедры радиоэлектроники и защиты информации ТУСУРа Эл. почта: mpa@gpb.tomsknet.ru

Литвинов Рудольф Викторович

Канд. физ.-мат. наук, доцент кафедры радиоэлектроники и защиты

информации ТУСУРа

Эл. почта: litvinovrv@rzi.tusur.ru

I.A. Kukalo, P.A. Miklin, R.V. Litvinov

Algorithms of generation of the pseudo prime numbers in «Borland C++ 3.1»

The experimental investigation of the performance of the generation algorithms of the prime numbers has been carried out. These algorithms are based on the methods of trial divisions, Miller-Rabin, Soloway - Strassen and minor Fermat's theorem, using the filter of division into small prime number. For each type of the method the dependences of the time generation on the byte length have been plotted on the assumption of averaging of the large ensemble of partial realizations.