Министерство образования и науки Республики Казахстан Казахский национальный университет им. аль-Фараби Байрбекова З.А. ИСПОЛЬЗОВАНИЕ АЛГОРИТМА ФАКТОРИЗАЦИИ НАТУРАЛЬНЫХ ЧИСЕЛ ДИКСОНА В КРИПТОГРАФИЧЕСКОМ АНАЛИЗЕ ДИПЛОМНАЯ РАБОТА специальность 5В100200 – «Системы информационной безопасности» Алматы 2022 1 Министерство образования и науки Республики Казахстан Казахский национальный университет им. аль-Фараби «Допущена к защите» Протокол № ___ , «___»_______ 2022 г. Заведующей кафедрой ____________ к.ф.-м.н., Мусиралиева Ш.Ж. (подпись и печать) На тему: «ИСПОЛЬЗОВАНИЕ АЛГОРИТМА ФАКТОРИЗАЦИИ НАТУРАЛЬНЫХ ЧИСЕЛ ДИКСОНА В КРИПТОГРАФИЧЕСКОМ АНАЛИЗЕ» ДИПЛОМНАЯ РАБОТА 5В100200 – «Системы информационной безопасности» Выполнил ____________________ Байрбеков З.А. (подпись) Научный руководитель к.ф.-м.н., доцент ____________________ Азанов Н.П. (подпись) Нормоконтролер ____________________ (подпись) Алматы 2022 2 Әлиасқар М.С. АҢДАТПА Бұл дипломдық жұмыс Диксонның натурал сандарды факторизациялау әдісін криптографиялық талдауға арналған және 41 беттен, 15 суреттен, 26 дереккөзден тұрады. Түйін сөздер: Диксон алгоритмі, алгоритм, жай сандар, факторлар, факторизация, RSA, қауіпсіздік, криптографиялық беріктік, криптоталдау, криптография. Зерттеу нысаны: Криптографиялық талдаудағы Диксон алгоритмі Жұмыс мақсаты: 1. Python бағдарламалау тілінде Диксон алгоритмін енгізу 2. Натурал сандарды Диксон факторизациясы арқылы RSA криптографиялық алгоритмінің крекингін енгізу Қолданылатын әдістер: Асимметриялық шифрлау әдісі, RSA шифрлау әдісі. Дипломдық жұмыстың өзектілігі: Факторизация мәселесі өзекті болып табылады, өйткені ол ашық шифрлау кілттерін (RSA және т.б.) пайдаланатын бірқатар қауіпсіздік алгоритмдерінің негізі болып табылады. Шифрлардың крипто-қауіпсіздігі кодты қысқа мерзімде бұзуға мүмкіндік беретін жылдам факторизация алгоритмдері жоқ деген болжамға негізделген және егер мұны біраз уақыттан кейін жасауға болатын болса, онда деректер өзінің өзектілігін жоғалтады. Дипломдық жұмыстың нәтижелері: Бұл жұмыста криптографиялық талдауда натурал сандарды факторизациялау есебін шешуге арналған Диксон алгоритмі, сонымен қатар RSA криптографиялық алгоритмі қарастырылды. Мақсаты Python тілінде Диксон алгоритмін енгізу болды және осы алгоритмнің көмегімен RSA алгоритмінің қарапайым бұзуы жүзеге асырылды. 3 РЕФЕРАТ Данная дипломная работа посвящена криптографическому анализу метода факторизации натуральных чисел Диксона и состоит из 41 страниц, 15 рисунков, 26 источников. Ключевые слова: алгоритм Диксона, алгоритм, простые числа, множители, факторизация, RSA, безопасность, криптостойкость, криптоанализ, криптография. Объект исследования: алгоритм Диксона в криптографическом анализе Цель работы: 1. Реализовать алгоритм Диксона на языке программирования Python 2. Реализовать взлом криптографического алгоритма RSA с использованием факторизации натуральных чисел Диксона Использованные методы: Ассиметричный метод шифрования, метод шифрования RSA. Актуальность дипломной работы: Задача факторизации актуальна тем, что выступает основой ряда алгоритмов безопасности, использующих открытые ключи шифрования (RSA и другие). Крипто стойкость шифров базируется на предположении, что не существует быстрых алгоритмов факторизации, которые за короткое время позволили бы взломать код, а если это и получится сделать через некоторое время, то данные потеряют актуальность. Результаты дипломной работы: В этой работе был рассмотрен алгоритм Диксона для решения задачи факторизации натуральных чисел в криптографическом анализе, а также криптографический алгоритм RSA. Была достигнута цель реализовать алгоритм Диксона на ЯП Python и с помощью этого алгоритма был реализован простой взлом алгоритма RSA. 4 ABSTRACT This thesis is devoted to the cryptographic analysis of Dixon's natural number factorization method and consists of 41 pages, 15 figures, 26 sources Keywords: Dixon's algorithm, algorithm, prime numbers, factors, factorization, RSA, security, cryptographic strength, cryptanalysis, cryptography. Object of study: Dixon algorithm in cryptographic analysis Objective: 1. Implement the Dixon algorithm in the Python programming language 2. Implement cracking of the RSA cryptographic algorithm using Dixon factorization of natural numbers Methods used: Asymmetric encryption method, RSA encryption method. The relevance of the thesis: The factorization problem is relevant in that it is the basis of a number of security algorithms using public encryption keys (RSA and others). The crypto security of ciphers is based on the assumption that there are no fast factorization algorithms that would allow cracking the code in a short time, and if this can be done after a while, then the data will lose its relevance. The results of the thesis: In this work, the Dixon algorithm for solving the problem of factorization of natural numbers in cryptographic analysis, as well as the RSA cryptographic algorithm, was considered. The goal was to implement Dixon's algorithm in Python, and with the help of this algorithm, a simple hack of the RSA algorithm was implemented. 5 ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ RSA – Криптографический алгоритм с открытым ключом, основывающийся на вычислительной сложности задачи факторизации больших целых чисел. Скитала – Инструмент, используемый для осуществления перестановочного шифрования, в криптографии известный также как шифр Древней Спарты SSL/TLS – Криптографические протоколы, обеспечивающие защищённую передачу данных между узлами в сети Интернет. ONE-TIME PAD – Одноразовый блокнот – это метод шифрования, который не может быть взломан, но требует использования одноразового предварительного общего ключа, размер которого не меньше размера отправляемого сообщения. НОД – Наибольший общий делитель. НОК – Наименьшее общее кратное GNFS – Общий метод решета числового поля . 6 СОДЕРЖАНИЕ ВВЕДЕНИЕ................................................................................................................. 8 1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ ............................................................... 9 1.1 Основные сведения о криптографическом анализе и о криптографии ........ 9 1.2 Факторизация целых и натуральных чисел ................................................... 12 1.3 Базовая идея факторизации ............................................................................. 14 1.4 Метод факторизации Решето Эратосфена..................................................... 15 1.5 B-гладкие числа ................................................................................................ 16 1.6 Перебор делителей ........................................................................................... 17 1.7 Общее время алгоритма .................................................................................. 18 1.8 Метод Ферма для целочисленной факторизации ......................................... 19 1.9 Ро-метод Полларда........................................................................................... 20 1.10 Метод квадратичного решета ....................................................................... 21 1.11 Общий метод решета числового поля.......................................................... 22 1.12 Алгоритм RSA ................................................................................................ 23 1.13 Система шифрования RSA ............................................................................ 25 1.14 Нахождение больших простых чисел .......................................................... 28 1.15 Метод факторизации Диксона ...................................................................... 31 2 РЕАЛИЗАЦИЯ МЕТОДА ФАКТОРИЗАЦИИ ДИКСОНА ......................... 33 2.1 Пример .............................................................................................................. 33 2.2 Пошаговое выполнение алгоритма Диксона................................................. 33 2.3 Реализация программной части алгоритма факторизации Диксона .......... 34 3 ВЗЛОМ RSA .......................................................................................................... 36 3.1 Взлом RSA. Часть 1. Нахождения факторов (по алгоритму Диксона) ...... 36 3.2 Взлом RSA. Часть 2. ........................................................................................ 37 ЗАКЛЮЧЕНИЕ ....................................................................................................... 39 СПИСОК ИСПОЛЬЗОАВННОЙ ЛИТЕРАТУРЫ ........................................... 40 7 ВВЕДЕНИЕ Вся система шифрования делится на 2 класса: алгоритмы симметричного и асимметричного шифрования. В симметричных алгоритмах и шифрующий, и дешифрующий должны знать алгоритм шифрования, называемый ключом. Одним из известных симметричных устройств была немецкая шифровальная машина “Энигма”. Алгоритмы асимметричного шифрования более безопасны, поскольку используют 2 ключа – открытый и закрытый. Открытый используется для шифрования информации, а закрытый используется для ее расшифровки. Поэтому шансы на получение одновременно обоих ключей злоумышленниками очень малы. Более того, знание закрытого ключа достаточно, чтобы вычислить открытый ключ, но получить закрытый ключ из открытого ключа практически невозможно: выбор закрытого ключа займет много времени, потому что вариантов может быть так много, что даже самые мощные компьютеры будут их вычислять десятилетиями. Одним из самых популярных алгоритмов шифрования на сегодняшний день является алгоритм асимметричного шифрования RSA. Он основан на задаче факторизации двух больших чисел, результат которой определяет крипто стойкость и криптографическую мощность алгоритма. Факторизация – это разложение числа на простые множители. Существует множество алгоритмов, решающих эту задачу, и поиск нового алгоритма продолжается до сих пор. К сожалению, в настоящее время не существует идеального алгоритма. Хоть и существуют алгоритмы, которые могут правильно разложить числа на множители, ни один из них не может разложить на множители достаточно большие числа за разумное время. В данное работе я исследовал и сделал криптографический анализ алгоритма факторизации натуральных чисел Диксона Целью данной дипломной работы является использование факторизации натуральных чисел Диксона для взлома RSA Для выполнения дипломной работы были поставлены следующие задачи: Исследовать алгоритм факторизации натуральных чисел Диксона Исследовать криптографический алгоритм RSA Реализация программы алгоритма факторизации натуральных чисел Диксона, которая осуществляет разложение чисел на простые множители Реализовать взлом RSA с помощью алгоритма факторизации натуральных чисел Диксона 8 1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ 1.1 Основные криптографии сведения о криптографическом анализе и о Криптоанализ – это процесс поиска уязвимостей в криптографических алгоритмах с целью различения алгоритма или извлечения открытого текста из зашифрованного текста без знания секретного ключа, или иногда также для восстановления секретного ключа. Криптоанализ –это изучение уязвимостей в шифрах. Согласно принципу Кирхгоффа (желание Кирхгоффа, предположение, аксиома), шифр должен быть безопасным, даже если конструкция и структура шифра, за исключением секретного ключа, являются открытыми. В соответствии с этим принципом криптографический алгоритм должен быть разработан таким образом, чтобы ни один злоумышленник не мог взломать схему, не зная ключа, даже если злоумышленнику известна полная структура схемы. Криптография – это наука о защите информации от потенциальных противников. Согласно документальным источникам, история криптографии начинается с введения скиталы, спартанского криптографического устройства, основанного на технике перестановки, которое использовалось военными в пятом веке до нашей эры. Шифр Цезаря – одна из известных древних криптографических схем, основанная на методах замены. Хотя в то время эти методы были достаточно безопасными, с появлением современных систем эти криптосистемы становятся уязвимыми. В более ранние времена криптография практиковалась в основном как форма искусства. Введение коммуникационной теории секретных систем Шенноном помогло перевести предмет из искусства в науку. Основной целью криптографии является обеспечение конфиденциальности, целостности, подлинности, анонимности, и т.п. С точки зрения безопасности криптографию можно разделить на два типа: теоретико-информационная безопасность и вычислительная безопасность. Информационно-теоретическая безопасность, также называемая совершенной безопасностью или безусловной безопасностью, определяет безопасность криптосистемы, основанную на теоретической невозможности взлома системы, даже если противнику доступны неограниченные вычислительные мощности; тогда как вычислительная безопасность определяет безопасность криптосистем на основе предположения о сложности взлома системы с использованием ограниченной вычислительной мощности. Хотя информационно-теоретические безопасные системы более безопасны по сравнению с вычислительными безопасными системами; однако такие системы довольно непрактичны для реализации [1]. Одной из таких информационно-теоретических безопасных криптосистем является one-time pad (одноразовый блокнот, шифр Вернама), для которого требуется ключ такой же длины, как и открытый текст для шифрования, и ключ 9 должен быть разным для каждого шифрования. Однако, что касается теоретикоинформационной безопасности, для вычислительной безопасности рассматриваются два послабления. Они следующие: 1. Ограниченность по времени. Если противнику доступно неограниченное время, то схему можно взломать. 2. Низкая вероятность успеха. Противник может сломать схему с очень малой вероятностью. Эта вероятность должна иметь незначительное влияние на безопасность схемы. Чтобы точно определить эти релаксации, рассматриваются два подхода: конкретный подход и асимптотический подход. Конкретный подход. В конкретном подходе безопасность криптографической схемы определяется количественно. Вычислительные усилия злоумышленника указаны, а максимальная вероятность успеха злоумышленника явно ограничивает безопасность схемы. Асимптотический подход. В асимптотическом подходе параметризуется безопасность криптографических схем параметром безопасности. Как правило, длина ключа считается параметром безопасности и предполагается, что она известна злоумышленникам. Современная криптография опирается на криптографические ключи, обычно короткие текстовые строки, для кодирования и декодирования сообщений в сочетании с криптографическими алгоритмами. В зависимости от типа используемых ключей криптография классифицируется как криптография с симметричным или асимметричным ключом. Криптография с симметричным и асимметричным ключом обеспечивает конфиденциальность данных. Шифрование с асимметричным ключом иногда называют шифрованием с открытым ключом. Цифровые подписи, один из побочных продуктов криптографии с открытым ключом, обеспечивают проверку подлинности, целостности и неотказуемости. Рисунок 1. Симметричное шифрование 10 Рисунок 2. Ассиметричное шифрование Сегодня криптография с открытым и закрытым ключом лежит в основе большей части современной инфраструктуры интернет-безопасности, включая безопасность «транспортного уровня», используемую SSL/TLS, цифровыми подписями и криптовалютами, такими как биткойн. Важно отметить, что асимметричные ключи не создают системы, которые невозможно взломать. Но пока закрытый ключ хранится в секрете, взломать шифрование практически невозможно. Помимо многочисленных эксплойтов (включая атаки со случайными числами, атаки по времени и другие), которые были обнаружены, безопасность даже самой надежной пары открытого и закрытого ключей зависит от того, сколько времени потребуется, чтобы отменить процесс факторизации участвующих чисел [2]. Рисунок 3. Криптографические методы 11 1.2 Факторизация целых и натуральных чисел Концепция разложения чисел на простые числа существует с тех пор, как Евклид определил, что такое простые числа, а идея уникальной факторизации с помощью фундаментальной теоремы арифметики ~ 300 л. до н.э. Раннее развитие математики было в основном обусловлено ее использованием в бизнесе или в обычной жизни, а факторизация целых чисел не нашла применения ни в бизнесе, ни в повседневной жизни, поэтому ее развитие всегда было обусловлено теоретическим интересом, но с конца 1970-х годов оно двигалось не теоретическим интересом, а обеспечительным интересом. История показывает, что целочисленная факторизация требует больших вычислительных мощностей по сравнению с проверкой простоты, которая не требует таких же вычислений, а история проверки простоты начинается раньше, и в 1876 году Лукас смог проверить простоту 39-значного числа по сравнению с тем, что не было до 1970 года и с помощью компьютеров, на которых Моррисон и Бриллхарт смогли разложить на множители 39-значное составное целое число. Целочисленная факторизация интересна сама по себе как одна из величайших проблем теории чисел, но она еще более интересна из-за ее использования в криптографии. Математик проявлял большой интерес к факторизации больших целых чисел с древних времен. В последнее время этот интерес возрос из-за его широкого применения в криптографии. Мысль о разложении на множители целых чисел, содержащих более сотни цифр, всегда была привлекательной. Однако это даже не казалось постижимым до изобретения квадратичного решета в 1981 году и решета числового поля в 1988 году. Алгоритмы целочисленной факторизации в основном делятся на два класса: алгоритмы специального назначения и алгоритмы общего назначения. К первому классу относятся пробное деление, метод ро-алгоритм Полларда, p-1-метод Полларда, метод эллиптических кривых, метод Ферма, метод Диксона и т.д. Ни один из этих методов в настоящее время не применим для факторизации составных целых чисел, используемых при проектировании криптосистем. Первый класс известен как «специальный», поскольку ожидаемое время выполнения зависит как от размера факторизуемого числа n, так и от свойств неизвестных множителей n. Последний класс известен как «общий», поскольку ожидаемое время работы зависит исключительно от размера факторизуемого числа n. Оценка защищенности криптосистем на основе факторинга проводится относительно современных алгоритмов факторинга общего назначения. Метод квадратичного решета и общий метод решета числового поля являются наиболее популярными алгоритмами общего назначения для факторизации больших целых чисел. Время работы обоих алгоритмов зависит от размера числа и носит субэкспоненциальный характер. Однако общий метод решета числового поля является наиболее известным современным методом факторизации больших целых чисел, содержащих более 120 цифр. 12 Целочисленная факторизация с момента появления криптосистем с открытым ключом в 1977 году стала еще более важной, поскольку многие криптосистемы полагаются на сложность факторизации целых чисел (больших целых чисел). Это означает, что очень быстрый алгоритм факторинга сделал бы небезопасными, например, наши домашние банковские операции и зашифрованную связь через Интернет. Разложение натурального числа в произведение простых чисел называется факторизацией. Основная проблема с факторизацией заключается в том, что не существует известного эффективного алгоритма, который бы факторизовал данное натуральное число n за полиномиальное время. Наиболее близким аналогом такого алгоритма является алгоритм Шора для квантовых компьютеров, который до сих пор практически не применим. Трудности с факторизацией лежат в основе современных криптосистем, наиболее известным из которых является алгоритм RSA [3]. Число называется гладким, если оно представляет собой целое число, состоящее исключительно из малых простых множителей. Гладкие числа играют решающую роль во многих интересных задачах теории чисел и криптографии, таких как целочисленная факторизация. Предполагаемая сложность факторизации больших составных целых чисел связана с трудностью обнаружения множества гладких чисел в полиномиальной последовательности, обычно выполняемой с помощью процесса, называемого просеиванием. Обнаружение и генерация гладких чисел, остается постоянной междисциплинарной областью исследований, в которой за последние годы произошли как алгоритмические, так и реализационные достижения. Целочисленная факторизация считается трудной задачей, когда число, которое нужно разложить на множители, является произведением двух больших простых чисел. Такое число 𝑛 = 𝑝 ∗ 𝑞 называется полупростым для простых чисел 𝑝 и 𝑞, 𝑝 ≠ 𝑞.. По мере роста log 2 𝑛, т. е. количества битов для представления n, вычислительные усилия для разложения n путем пробного деления растут экспоненциально. Пример факторизации натурального числа. Предположим, что a и b – целые числа. Тогда a делит b тогда и только тогда, когда b = an для некоторого числа n. Пример: 5|55 потомучто 55 = 5 ∗ 11 "a делит b" ≡ "a | b" Тут ‘a’ является фактором или делителем ‘b’ Тут ‘b’ кратно ‘a’ Доказательство с делимостью. Утверждение: для любых целых чисел a, b, c если a|b и b|c, то a|c. Определение: целое число а делит целое число b тогда и только тогда, 13 когда b = an для некоторого целого числа n. Другие определения факторов. Наибольший общий делитель (НОД): нод(a, b) – это наибольшее число, которое делит как а, так и b. Наименьшее общее кратное (НОК): нок(a, b) – наименьшее число, которое делятся и a, и b. нок(𝑎, 𝑏) = 𝑎𝑏 нод(𝑎,𝑏) (1) Относительное простые: a и b взаимно просты, если они не имеют общих делителей, так что нод(a, b) = 1. Рисунок 4. Схематическая иллюстрация факторизации числа 525. 1.3 Базовая идея факторизации Корень современного алгоритма факторизации был предложен известным математиком Ферма и в дальнейшем модифицирован Крайчиком. Пусть данное число n нечетное, составное и не является степенью простого числа. Ферма сказал, что любое нечетное число можно выразить как разность двух квадратов в 17 веке. То есть n можно записать как: 𝑛 = 𝑥 2 − 𝑦 2 = (𝑥 + 𝑦)(𝑥 − 𝑦) (2) В 1920-х годах Морис Крайчик развил идею о том, что вместо 𝑥 2 − 𝑦 2 = 𝑛, может быть достаточно, чтобы 𝑥 2 − 𝑦 2 было просто кратно n. Тогда нужнополучить только целые числа x и y такие что: 14 𝑥 2 ≡ 𝑦 2 (𝑚𝑜𝑑 𝑛) (𝑥 + 𝑦)(𝑥 − 𝑦) ≡ 0(𝑚𝑜𝑑 𝑛) (3) (4) Из последнего уравнения следует, что n делит (x+y)(x-y). Следовательно, если 𝑥 ≡ ±𝑦(𝑚𝑜𝑑 𝑛) то наибольший делитель (НОД) числа n и 𝑥 ± 𝑦 будут давать нетривиальные множители числа n. Таким образом, задача нахождения множителей n преобразуется в поиск целых чисел x и y таких что уравнение удовлетворяется. Вероятность нахождения тривиального множителя n по этой идее равна 1/2. Таким образом, нахождение k конгруэнтных уравнений, удовлетворяющих требованиям, дает 1 𝑘 нам шанс, по крайней мере, (1 − ( ) ) разложить n на множители. 2 Следовательно, обнаружено, что множество пар целых чисел (x, y), удовлетворяющих требованиям, увеличивают вероятность факторизации. В частности, если n - модуль RSA, то есть n - произведение двух простых чисел p и q, вероятность нахождения нетривиального множителя n равна 2/3 [4]. 1.4 Метод факторизации Решето Эратосфена Решето Эратосфена — это простой древний алгоритм, который находит простые числа до любого заданного предела. Он находит простые числа, составляя составные числа из каждого простого числа, начиная с первого простого числа, равного 2. Решето Эратосфена — один из наиболее эффективных способов найти все простые числа, меньшие n, когда n меньше десяти миллионов. Просеивание — очень эффективный способ разложения на множители, когда вас интересует каждое число из большого набора целых чисел. Пример. Чтобы найти все простые числа, меньшие или равные 30, мы начинаем с создания списка целых чисел от 2 до 30. Первое число в списке — 2, затем мы начинаем с вычеркивания всех целых чисел, кратных из 2-х из списка. Оставшиеся числа 2,3,5,7,9,11,13,15,17,19,21,23,25,27,29. Следующее простое число равно 3, мы повторяем ту же операцию, вычеркивая каждое целое число, кратное 3, из списка после 3. Тогда у нас остаются 2, 3, 5, 7, 11, 13, 17, 19, 23, 25,29. Затем мы продолжаем вычеркивать из списка каждое целое число, кратное 5, после самого 5, а оставшиеся числа 2,3,5,7,11,13,17,19,23,29, которые все простые числа, и мы можем остановить процедуру. 15 Рисунок 5. Алгоритм Решето Эратосфена 1.5 B-гладкие числа Гладкие числа играют важную роль для вычисления факторов. Натуральное число называется B-гладким, если ни один из его простых делителей не больше B. Определение. Натуральное число 𝑛 называется y-гладким, если оно не имеет ни одного простого делителя, превосходящего y. Пример. 1620 имеет разложение на простые множители 22 ∗ 34 ∗ 5, следовательно, 1620 является 5-гладким, поскольку ни один из его простых множителей не больше 5. Иногда полезно иметь «тест на гладкость», когда для некоторого параметра B нужно знать, является ли данное число 𝑛 B-гладким, то есть 𝑛 не имеет простого множителя, превышающего B Если мы выберем B маленьким, у нас будет преимущество, заключающееся в том, что нам не нужно много B-гладких вычетов, чтобы найти произведение подмножества, которое является квадратом [5]. Но если B слишком мало, свойство B-гладкости настолько особенное, что мы можем не найти никаких B-гладких чисел. Итак, нам нужно сбалансировать две силы, действующие на границу гладкости B: граница должна быть достаточно малой, 16 чтобы нам не требовалось слишком много B-гладких чисел для достижения успеха, но B должна быть достаточно большой, чтобы числа B-гладкости поступали с достаточная частота. 1 Оптимальным выбором оценки гладкости B является exp( √ln 𝑛 ln ln 𝑛), и 2 что время с таким выбором B составляет около 𝐵2 , то есть время выполнения 1 приведенной выше схемы для разложения n должно быть exp( √ln 𝑛 ln ln 𝑛), Мы 2 будем сокращать эту последнюю функцию от n следующим образом: 𝐿(𝑛) = 𝑒 √ln 𝑛 ln ln 𝑛) . 1.6 Перебор делителей Пробное деление было впервые описано Фибоначчи в его книге Liber Abaci (1202 г.) и представляет собой метод последовательной проверки пробных делителей числа 𝑛, чтобы частично или полностью разложить n на множители. У этого алгоритма две цели: найти простой множитель или определить, является ли целое число простым. Его временная сложность равна 𝑂(√𝑁) Принцип этого алгоритма состоит в том, чтобы полностью перебрать все возможные делители потенциала. Это можно сделать, перечислив все целые числа от 2 до квадратного корня из проверяемого числа 𝑛, а затем вычислив остаток от деления 𝑛 на каждое из этих чисел. Если остаток от деления на конкретное число 𝑚 равен нулю, то m является делителем n. В этом случае алгоритм завершает перечисление, и 𝑛 считается составным. Если вместо этого невозможно свести 𝑛 к любому из меньших чисел и достичь квадратного корня из 𝑛, то мы утверждаем, что 𝑛 простое [6]. Это можно выразить, перебирая все числа 𝑛 ∈ 𝑁, удовлетворяющие 2 ≤ 𝑛 ≤ √𝑁. Причина, по которой мы можем прекратить перечисление на квадратном корне из n, заключается в том, что алгоритм пробного деления последовательно делит заданное натуральное число на все целые числа, начиная с двух и заканчивая значением, меньшим или равным квадратному корню из проверяемого числа. Из-за большой асимптотической сложности алгоритм пробного деления редко используется в реальных ситуациях, тем не менее, поскольку алгоритм прост для понимания и реализации, его стоит изучить. 17 Рисунок 6. Алгоритм перебор делителей 1.7 Общее время алгоритма Временная сложность — это описание, которое говорит нам, сколько времени потребуется для запуска алгоритма и это имеет большое значение как для математиков, так и для программистов [7]. Время, необходимое для полного разложения составного 𝑛, по сути, равно квадратному корню из второго по величине простого множителя из 𝑛. Однако есть способы ускорить процесс. Если мы используем только простые числа в качестве пробных делителей, количество делений будет примерно 2√𝑛/ ln 𝑛. Затем можем еще больше ускорить процесс, используя только 2 и нечетные простые числа в качестве пробных делителей, тогда необходимое количество 1 делений будет приблизительно равно √𝑛 в пересчете на необходимое 2 количество делений. Пример. Пусть 𝑛 = 32851. Так как число нечетное, ясно видно, что делить на четное число нельзя. Затем мы идем дальше и пытаемся разделить на 3, что не удастся. Следующим целым числом для попытки деления будет 5, что не удается. Деление на 7 работает и дает нам целое число 4693, но 4693 не делится ни на 7, ни на 11, но, если мы разделим на 13, мы получим 361. 361 равно192 . Решение: факторизация числа 32851 равна 7 ∗ 13 ∗ 192 . Хотя алгоритм пробного деления является самым простым алгоритмом для реализации и понимания, он не обязательно является самым эффективным. Алгоритм пробного деления хорошо работает для меньших чисел, но не работает, когда мы хотим разложить на множители большие числа. 18 1.8 Метод Ферма для целочисленной факторизации Метод Ферма назван в честь французского математика Пьера де Ферма, и идея метода состоит в том, чтобы представить нечетное целое число как разность двух квадратов. То есть мы ищем целые числа a такие, что 𝑎2 − 𝑛 является квадратом [8]. Теорема. (Малая теорема Ферма.) Если n простое, то для любого целого числа a имеем 𝑎𝑛 ≡ 𝑎(𝑚𝑜𝑑 𝑛). Старая стратегия разложения числа на множители состоит в том, чтобы выразить его как разность двух непоследовательных квадратов. Если можно записать n в виде 𝑎2 − 𝑏 2 , где a и b - целые неотрицательные числа, то можно сразу же разложить n как (𝑎 + 𝑏)(𝑎 - 𝑏). Чтобы разложить число 𝑛 методом Ферма, мы вычисляем квадратный корень из 𝑛: 𝑠1 = √𝑛. Выберите наименьшее натуральное число, большее 𝑠1 : 𝑠 = [𝑠1 ] = √𝑛. Положим 𝑘 = 0,1, … и вычислим 𝑥 = 𝑠 + 𝑘, 𝑙 = 𝑥 2 − 𝑛 и выясним, является ли число 𝑙 полный квадрат некоторого натурального числа y. Если 𝑙 2 = 𝑦, то остановите итерацию. Получить факторы 𝑛: 𝑎 = 𝑥 + 𝑦, 𝑏 = 𝑥-𝑦. Если 𝑙 не является квадратом определенного натурального числа, то увеличиваем k на 1: 𝑘 = 𝑘 + 1, вычисляем 𝑥 = 𝑠 + 𝑘, 𝑙 = 𝑥 2 − 𝑛 и повторяем процедуру. Пример. Пусть n = 19691. Тогда √19691 ≈ 140.325, 𝑠 = ⌈√𝑛⌉ = 141. При k=0. Вычислим 𝑥 = 𝑠 + 𝑘 = 141 + 0 = 141, 𝑙 = 1412 − 19691 = 190 При k=1. Вычислим 𝑥 = 𝑠 + 𝑘 = 141 + 1 = 142, 𝑙 = 1422 − 19691 = 473 После этих шагов получаем: Для k = 9 мы получили 𝑙 = 2809, что является квадратом 53. Мы останавливаем итерацию и вычисляем множители 𝑎 = 𝑥 + 𝑦 = 150 + 53 = 203 и 𝑏 = 𝑥 - 𝑦 = 150 - 53 = 97. Следовательно разложение 19691 имеет следующий вид: 19691 = 203∙97. Ответ: 19691 = 203 ∙ 97 19 1.9 Ро-метод Полларда Ро-метод Полларда названный ро-методом Полларда из-за сходства с греческой буквой 𝜌(ро), ро-метод Полларда выполняет случайный поиск, используя циклические свойства некоторой последовательности [9]. Эти последовательности не являются полностью периодическими, но имеют так называемый подход к циклам, который можно проиллюстрировать ниже: Рисунок 7. Последовательность ро-методом Полларда Последовательность в конечном счете периодична, то есть существуют целые числа 𝑐 ≥ 1 и 𝑡 ≥ 0 такие, что 𝑥0 , 𝑥1 , … 𝑥𝑐+𝑡−1 различны (𝑚𝑜𝑑 𝜌), но что 𝑥𝑐+𝑖 ≡ 𝑥𝑖 (𝑚𝑜𝑑𝜌) для 𝑖 ≥ 𝑡. Определим также 𝑟 как наименьшее натуральное число с 𝑥𝑟 ≡ 𝑥2𝑟 (𝑚𝑜𝑑 ρ), то есть 𝑡 ≤ 𝑟 < 𝑡 + 𝑐, 𝑟 ≡ 0(𝑚𝑜𝑑 𝑐), если 𝑡 > 0 r = c, если t = 0. Функция 𝑟 = 𝑟(𝜌) определяет, как скоро наш алгоритм найдет простой множитель 𝑝 числа 𝑛: ведь после 𝑟(𝑝) шагов мы будем иметь 𝑄𝑖 ≡ 0 (𝑚𝑜𝑑 𝑝), и тогда множитель 𝑝 будет найден следующий расчет. Ро-метод Полларда основан на сочетании двух идей, называемых парадоксом дня рождения и принципом голубя. Пример. Факторизуем число 2449 используя метод ро-Полларда с многочленом 𝑓(𝑥) 2 = 𝑥 + 1, и сначала мы начинаем 𝑥0 = 1. 𝑛 = 2449 и начинаем итерацию, используя формулу 𝑥𝑖 = 𝑓(𝑥𝑖−1)(𝑚𝑜𝑑 𝑛), 𝑖 = 1,2,3, … на следующем шаге мы вычисляем НОД с n каждого результата следующей последовательности абсолютных значений |𝑥1 − 𝑥2|, |𝑥2 − 𝑥4|, |𝑥3 − 𝑥6|, … , |𝑥𝑘 − 𝑥2𝑘|. Начиная с начального значения 𝑥0 = 1, имеем 𝑥1 = 𝑓(𝑥0)(𝑚𝑜𝑑 𝑛) = 𝑓(1)(𝑚𝑜𝑑 2449) = (12 + 1)(𝑚𝑜𝑑 2449) = 2(𝑚𝑜𝑑 2449) = 2 𝑥2 = 𝑓(𝑥1)(𝑚𝑜𝑑 𝑛) = 𝑓(2)(𝑚𝑜𝑑 2449) = (22 + 1)(𝑚𝑜𝑑 2449) = 5(𝑚𝑜𝑑 2449)=5 Теперь |𝑥1 − 𝑥2| = |2 − 5| = 3 and 𝑑 = НОД (|𝑥1 − 𝑥2|, 𝑛) = НОД(3,2449) = 1 𝑥3 = 𝑓(𝑥2)(𝑚𝑜𝑑 𝑛) = 𝑓(5)(𝑚𝑜𝑑 2449) = (52 + 1)(𝑚𝑜𝑑 2449) = 26(𝑚𝑜𝑑 2449)=26 20 𝑥4 = 𝑓(𝑥3)(𝑚𝑜𝑑 𝑛) = 𝑓(26)(𝑚𝑜𝑑 2449) = (262 + 1)(𝑚𝑜𝑑 2449) = 677(𝑚𝑜𝑑 2449) = =677 Теперь |𝑥2 − 𝑥4| = |5 − 677| = 672 and 𝑑 = НОД (|𝑥2 − 𝑥4|, 𝑛) = НОД (672,2449) = 1 𝑥5 = 𝑓(𝑥4)(𝑚𝑜𝑑 𝑛) = 𝑓(677)(𝑚𝑜𝑑 2449) = (6772 + 1)(𝑚𝑜𝑑 2449) = 458330(𝑚𝑜𝑑 2449) = 367 𝑥6 = 𝑓(𝑥5)(𝑚𝑜𝑑 𝑛) = 𝑓(367)(𝑚𝑜𝑑 2449) = (3672 + 1)(𝑚𝑜𝑑 2449) = 134690(𝑚𝑜𝑑 2449) = 2444 Теперь |𝑥3 − 𝑥6| = |26 − 2444| = 2418 and 𝑑 = НОД (|𝑥3 − 𝑥6|, 𝑛) = НОД(2418,2449) =31 Таким образом, мы впервые получаем делитель больше 1 и меньше 2449. 𝑛 2449 Другой делитель 𝑞 = = = 79 𝑝 31 Таким образом, простая факторизация числа 2449 равна 31 ∙ 79. Ответ: 2449 = 31 ∙ 79. 1.10 Метод квадратичного решета Метод квадратичного решета, также сокращенно QS(КР), было разработано в 1981 году Карлом Померансом. Метод квадратичного сита считается вторым по скорости алгоритмом после общего метода просеивания числового поля вплоть до целых сотен десятичных цифр. Это самый быстрый метод. Метод квадратичной решетчатой факторизации представляет собой алгоритм нахождения целых чисел a и b таких, что 𝑎2 ≡ 𝑏2 (𝑚𝑜𝑑 𝑁). Алгоритм квадратичного решета работает в два этапа: этап сбора данных и этап обработки данных. На этапе сбора данных он собирает информацию, которая может привести к равенству квадратов, на этапе обработки данных он помещает всю собранную информацию в матрицу и обрабатывает ее для получения равенства квадратов. Основная идея алгоритма QSсостоит в том, чтобы найти сравнения вида 𝑥2 ≡ 𝑎𝑖(𝑚𝑜𝑑 𝑛), где ∏𝑎𝑖 — квадрат, скажем, 𝑦2. Если 𝑥 = ∏𝑥𝑖,, то 𝑥2 ≡ 𝑦2(𝑚𝑜𝑑 𝑛) Чтобы проиллюстрировать эту идею, мы можем использовать следующий пример с n = 1649. Мы начинаем, как в методе Ферма, и для xi 𝑠 берем числа чуть выше √n. 412 = 1681 ≡ 32(𝑚𝑜𝑑 1649), 422 = 1764 ≡ 115(𝑚𝑜𝑑 1649), 432 = 1849 ≡ 200(𝑚𝑜𝑑 1649). В отличие от метода Ферма, который потребовал бы дополнительных вычислений, с этим новым подходом к объединению сравнений мы можем остановиться здесь. Поскольку 32 ∙ 200 = 6400 = 802, мы нашли, что (41 ∙ 43)2 ≡ 802(𝑚𝑜𝑑 1649). Самый простой способ найти равные квадраты — это выбрать случайное число, возвести его в квадрат, а затем посмотреть, является ли остаток при 21 делении на 𝑛 квадратом какого-то другого числа. Хотя этот метод прост для понимания, он не подходит для большинства случаев. Чтобы понять, как работает квадратичное решето, нам сначала нужно понять концепцию векторных показателей. Возьмем, к примеру, число 504. Разложение на простые множители имеет вид 504 = 233271. Это можно представить в виде вектора показателей (3,2,1,0), который фиксирует степени простых чисел, участвующих в разложении. Теперь число является квадратом, если каждый элемент в его векторе степени четный. Например, при сложении векторов (3,1,0,1) и (1,3,0,1) получается (4,4,0,2). Берем каждый элемент из 𝑚𝑜𝑑 2 и выполняем сложение элементов из 𝑚𝑜𝑑 2: (1,1,0,1) + (1,1,0,1) = (0,0,0,0). При выполнении квадратичного решета операции таковы: нам нужно найти подмножество, которое дополняется до нуль-вектора с помощью 𝑚𝑜𝑑 2 сложения, то есть нам нужно найти линейно зависимые векторы. Из теоремы линейной алгебры следует, что, если количество векторов больше, чем количество элементов в каждом векторе, такая связь должна существовать. Существует эффективный способ нахождения линейно зависимых векторов путем размещения исходных векторов в виде столбцов матрицы, а затем использования метода Гаусса. Когда мы находим линейно зависимые векторы, мы умножаем числа, соответствующие этим векторам, и получаем искомый квадрат. Возведение в квадрат набора случайных чисел в 𝑚𝑜𝑑 𝑛 приводит к большому количеству различных простых множителей, длинных векторов и большой матрицы. Чтобы избавиться от этой проблемы, мы специально ищем такие числа, что 𝑁 = 𝛼2 𝑚𝑜𝑑 n имеет только малые простые делители, меньшие B, то есть B-гладкие числа. Наконец, метод факторизации Ферма используется для получения делителей числа n. Проще говоря, наибольший общий делитель 𝛼2 − 𝑁 и начальное целое число n должны быть одним из делителей самого целого числа n [10]. 1.11 Общий метод решета числового поля Общий метод решета числового поля (GNFS) — метод факторизации целых чисел. Является наиболее эффективным алгоритмом факторизации чисел длиной более 110 десятичных знаков. Сложность алгоритма оценивается эвристической формулой 3 exp ((√ 64 9 1 2 1 3 64 + 𝑜(1)) (log 𝑛)2 (loglog 𝑛)3 ) = 𝐿𝑛 [ , √ ] 3 9 (5) Метод является обобщением специального метода решета числового поля: тогда как последний позволяет факторизовать числа только некоторого специального вида, общий метод работает на множестве целых чисел, за исключением степеней простых чисел (которые факторизуются тривиально 22 извлечением корней). Метод решета числового поля (как специальный, так и общий) можно представить как усовершенствование более простого метода — метода рационального решета, либо метода квадратичного решета. Подобные им алгоритмы требуют нахождение гладких чисел порядка √𝑛. Размер этих чисел экспоненциально растёт с ростом 𝑛. Метод решета числового поля, в свою очередь, требует нахождения гладких чисел субэкспоненциального относительно 𝑛 размера. Благодаря тому, что эти числа меньше, вероятность того, что число такого размера окажется гладким выше, что и является причиной эффективности метода решета числового поля. Для достижения ускорения вычислений в рамках метода проводятся в числовых полях, что усложняет алгоритм, по сравнению с более простым рациональным решетом [11]. Основные принципы: 1. Метод факторизации Ферма для факторизации натуральных нечетных чисел 𝑛, состоящий в поиске таких целых чисел x и y, что 𝑥 2 − 𝑦 2 = 𝑛, что ведет к разложению 𝑛 = (x − y)⋅(x + y). 2. Нахождение подмножества множества целых чисел, произведение которых – квадрат. 3. Составление факторной базы: набора {−1, 𝑝1 , 𝑝2 , … , 𝑝𝑛 }, где 𝑝𝑖 — простые числа такие, что 𝑝𝑖 ≤ 𝐵 для некоторого B. 4. Просеивание выполняется подобно решету Эратосфена (откуда метод и получил своё название). Решетом служат простые числа факторной базы и их степени. При просеивании число не «вычёркивается», а делится на число из решета. Если в результате число оказалось единицей, то оно B-гладкое. 5. Основная идея состоит в том, чтобы вместо перебора чисел и проверки, делятся ли их квадраты по модулю 𝑛 на простые числа из факторной базы, перебираются простые числа из базы и сразу для всех чисел вида 𝑥 2 − 𝑛 проверяется, делятся ли они на это простое число или его степень. 1.12 Алгоритм RSA Труды Евклида и Диофанта, Ферма и Эйлера, Гаусса, Чебышева и Эрмита содержат остроумные и весьма эффективные алгоритмы решения диофантовых уравнений, выяснения разрешимости сравнений, построения больших по тем временам простых чисел, нахождения наилучших приближений и т.д. В последние два десятилетия, благодаря в первую очередь запросам криптографии и широкому распространению ЭВМ, исследования по алгоритмическим вопросам теории чисел переживают период бурного и весьма плодотворного развития. Вычислительные машины и электронные средства связи проникли практически во все сферы человеческой деятельности. Немыслима без них и современная криптография. Шифрование и дешифрование текстов можно представлять себе как процессы переработки целых чисел при помощи ЭВМ, а 23 способы, которыми выполняются эти операции, как некоторые функции, определённые на множестве целых чисел. Всё это делает естественным появление в криптографии методов теории чисел. Кроме того, стойкость ряда современных криптосистем обосновывается только сложностью некоторых теоретико-числовых задач [12]. Но возможности ЭВМ имеют определённые границы. Приходится разбивать длинную цифровую последовательность на блоки ограниченной длины и шифровать каждый такой блок отдельно. Мы будем считать в дальнейшем, что все шифруемые целые числа неотрицательны и по величине меньше некоторого заданного (скажем, техническими ограничениями) числа m. Таким же условиям будут удовлетворять и числа, получаемые в процессе шифрования. Это позволяет считать и те, и другие числа элементами кольца вычетов m . Шифрующая функция при этом может рассматриваться как взаимнооднозначное отображение колец вычетов f : m m а число f (x) представляет собой сообщение x в зашифрованном виде. Простейший шифр такого рода - шифр замены, соответствует отображению f : x x k (mod m) при некотором фиксированном целом k. Подобный шифр использовал еще Юлий Цезарь. Конечно, не каждое отображение f подходит для целей надежного сокрытия информации. В 1978 г. американцы Р. Ривест, А. Шамир и Л. Адлеман (R.L.Rivest. A.Shamir. L.Adleman) предложили пример функции f , обладающей рядом замечательных достоинств. На её основе была построена реально используемая система шифрования, получившая название по первым буквам имен авторов система RSA. Эта функция такова, что 1) существует достаточно быстрый алгоритм вычисления значений f (x) ; 2) существует достаточно быстрый алгоритм вычисления значений обратной функции f 1 ( x) ; 3) функция f (x) обладает некоторым «секретом», знание которого позволяет быстро вычислять значения f 1 ( x) ; в противном же случае вычисление f 1 ( x) становится трудно разрешимой в вычислительном отношении задачей, требующей для своего решения столь много времени, что по его прошествии зашифрованная информация перестает представлять интерес для лиц, использующих отображение f в качестве шифра. Еще до выхода из печати статьи копия доклада в Массачусетском Технологическом институте, посвящённого системе RSA. была послана известному популяризатору математики М. Гарднеру, который в 1977 г. в журнале Scientific American опубликовал статью, посвящённую этой системе шифрования. В русском переводе заглавие статьи Гарднера звучит так: Новый 24 вид шифра, на расшифровку которого потребуются миллионы лет [13]. Именно эта статья сыграла важнейшую роль в распространении информации об RSA, привлекла к криптографии внимание широких кругов неспециалистов и фактически способствовала бурному прогрессу этой области, произошедшему в последовавшие 20 лет. 1.13 Система шифрования RSA Пусть m и e натуральные числа. Функция f реализующая схему RSA, устроена следующим образом f : x x e (mod m) . (6) Для расшифровки сообщения a f (x) достаточно решить сравнение x e a (mod m) . (7) При некоторых условиях на m и e это сравнение имеет единственное решение x . Для того, чтобы описать эти условия и объяснить, как можно найти решение, нам потребуется одна теоретико-числовая функция, так называемая функция Эйлера. Эта функция натурального аргумента m обозначается (m) и равняется количеству целых чисел на отрезке от 1 до m , взаимно простых с m . Так (1) 1 и ( p r ) p r 1 ( p 1) для любого простого числа p и натурального r . Кроме того, (ab) (a) (b) для любых натуральных взаимно простых a и b . Эти свойства позволяют легко вычислить значение (m) , если известно разложение числа m на простые сомножители. Если показатель степени e в сравнении (7) взаимно прост с (m) , то сравнение (7) имеет единственное решение. Для того, чтобы найти его, определим целое число d , удовлетворяющее условиям de 1 (mod (m)), 1 d (m) . (8) Такое число существует, поскольку e, (m) 1, и притом единственно. Здесь и далее символом a, b будет обозначаться наибольший общий делитель чисел a и b . Классическая теорема Эйлера, утверждает, что для каждого числа x , взаимно простого с m , выполняется сравнение x ( m ) 1 (mod m) и, следовательно. a d x de x (mod m) . (9) 25 Таким образом, в предположении (a, m) 1, единственное решение сравнения (7) может быть найдено в виде x a d (mod m) . (10) Если дополнительно предположить, что число m состоит из различных простых сомножителей, то сравнение (5) будет выполняться и без предположения (a, m) 1. Действительно, обозначим r (a, m) и s m / r . Тогда (m) делится на (s) , а из (7) следует, что ( x, s) 1 . Подобно (9), теперь легко находим x a d (mod s) . А кроме того, имеем x 0 a d (mod r ) . Получившиеся сравнения в силу (r , s) 1 дают нам (10). Функция (6), принятая в системе RSA, может быть вычислена достаточно быстро. Обратная к f (x) функция f 1 : x x d (mod m) вычисляется по тем же правилам, что и f (x) , лишь с заменой показателя степени e на d . Таким образом, для функции (6) будут выполнены указанные выше свойства 1) и 2). Для вычисления функции (1) достаточно знать лишь числа e и m . Именно они составляют открытый ключ для шифрования. А вот для вычисления обратной функции требуется знать число d . оно и является «секретом», о котором речь идёт в пункте в). Казалось бы. ничего не стоит. зная число m . разложить его на простые сомножители, вычислить затем с помощью известных правил значение (m) и, наконец, с помощью (8) определить нужное число d . Все шаги этого вычисления могут быть реализованы достаточно быстро, за исключением первого. Именно разложение числа m на простые множители и составляет наиболее трудоемкую часть вычислений. В теории чисел несмотря на многолетнюю её историю и на очень интенсивные поиски в течение последних 20 лет, эффективный алгоритм разложения натуральных чисел на множители так и не найден. Конечно, можно, перебирая все простые числа до m , и. деля на них m , найти требуемое разложение. Но, учитывая, что количество простых в 1 этом промежутке, асимптотически равно 2 m ln m , находим, что при m , записываемом 100 десятичными цифрами, найдётся не менее 4 10 42 простых чисел, на которые придётся делить m при разложении его на множители. Очень грубые прикидки показывают, что компьютеру, выполняющему миллион делений в секунду, для разложения числа m 10 99 таким способом на простые сомножители потребуется не менее, чем 10 35 лет. Известны и более эффективные способы разложения целых чисел на множители, чем простой перебор простых делителей, но и они работают очень медленно [14]. Авторы схемы RSA предложили выбирать число m в виде произведения двух простых множителей p и q , примерно одинаковых по величине. Так как (m) ( pq) ( p 1)(q 1) , 26 (11) то единственное условие на выбор показателя степени e в отображении (6) есть (e, p 1) (e, q 1) 1 . (12) Итак, лицо, заинтересованное в организации шифрованной переписки с помощью схемы RSA, выбирает два достаточно больших простых числа p и q . Перемножая их, оно находит число m pq . Затем выбирается число e , удовлетворяющее условиям (12), вычисляется с помощью (11) число (m) и с помощью (8) - число d . Числа m и e публикуются, число d остается секретным. Теперь любой может отправлять зашифрованные с помощью (6) сообщения организатору этой системы, а организатор легко сможет расшифровывать их с помощью (10). Для иллюстрации своего метода Ривест, Шамир и Адлеман зашифровали таким способом некоторую английскую фразу. Сначала она стандартным образом (а=01, b=02, .... z=26, пробел=00) была записана в виде целого числа x , а затем зашифрована с помощью отображения (6) при m=1143816257578888676693257799761466120102182967212423625625618 4293570 6935245733897830597123563958705058989075147599290026879543541 и e 9007 . Эти два числа были опубликованы, причем дополнительно сообщалось, что m pq . где p и q - простые числа, записываемые соответственно 64 и 65 десятичными знаками. Первому, кто расшифрует соответствующее сообщение f ( x) 9686961375 4622061477 1409222543 5588290575 9991124574 3 1987469512 09308 1629822514 5708356931 4766228839 8962801339 19 , 9055182994 5157815154 была обещана награда в 100$. Эта история завершилась спустя 17 лет в 1994 г., когда D. Atkins, M. Graff, А. К. Lenstra и Р. С. Leyland сообщили о расшифровке фразы. Числа p и q оказались равными p 3490529510 8476509491 4784961990 3898133417 7646384933 8 , 7843990820 577 q 3276913299 3266709549 9619881908 3446141317 7642967992 942 . 5397982885 33 Этот замечательный результат (разложение на множители 129-значного десятичного числа) был достигнут благодаря использованию алгоритма разложения чисел на множители, называемого методом квадратичного решета. Выполнение вычислений потребовало колоссальных ресурсов. В работе, возглавлявшийся четырьмя авторами проекта, и продолжавшейся после предварительной теоретической подготовки примерно 220 дней, на добровольных началах участвовало около 600 человек и примерно 1600 компьютеров, объединённых сетью Internet [15]. 27 1.14 Нахождение больших простых чисел Конечно же, большие простые числа можно строить сравнительно быстро. При этом можно обеспечить их случайное распределение в заданном диапазоне величин. В противном случае теряла бы всякий практический смысл система шифрования RSA. Наиболее эффективным средством построения простых чисел является несколько модифицированная малая теорема Ферма [16]. Теорема 2. Пусть N , S - нечётные натуральные числа, N 1 S R , причем для каждого простого делителя q числа S существует целое число a такое, что a N 1 N 1 q 1mod N , a 1, N 1 (13) Тогда каждый простой делитель p числа N удовлетворяет сравнению p 1(mod 2S ) . Доказательство. Пусть p - простой делитель числа N , a q - некоторый делитель S . Из условий (10) следует, что в поле вычетов F p справедливы соотношения a N 1 1, a N 1 q 1, a p 1 1 (14) Обозначим буквой r порядок элемента a в мультипликативной группе поля F p . Первые два из соотношений (11) означают, что q входит в разложение на простые множители числа r в степени такой же, как и в разложение N 1, а последнее - что p 1 делится на r . Таким образом, каждый простой делитель числа S входит в разложение p 1 в степени не меньшей, чем в S , так что p 1 делится на S . Кроме того, p 1 четно. Теорема 2 доказана [17]. Следствие. Если выполнены условия теоремы 2 и R 4S 2 , то N простое число. Действительно, пусть N равняется произведению не менее двух простых чисел. Каждое из них, согласно утверждению теоремы 2, не меньше, чем 2S 1 . 2 Но тогда 2S 1 N SR 1 4S 2 2S 1. Противоречие и доказывает следствие. Покажем теперь, как с помощью последнего утверждения, имея большое простое число S , можно построить существенно большее простое число N . Выберем для этого случайным образом чётное число R на промежутке S R 4S 2 и положим N SR 1. Затем проверим число N на отсутствие малых простых делителей, разделив его на малые простые числа; испытаем N 28 некоторое количество раз с помощью алгоритма 5. Если при этом выяснится, что N - составное число, следует выбрать новое значение R и опять повторить вычисления. Так следует делать до тех пор, пока не будет найдено число N , выдержавшее испытания алгоритмом 5 достаточно много раз. В этом случае появляется надежда на то, что N - простое число, и следует попытаться доказать простоту с помощью тестов теоремы 2 [18]. Для этого можно случайным образом выбирать число a,1 a N , и проверять для него выполнимость соотношений a N 1 1 (mod N ), a R 1, N 1 . (15) Если при выбранном a эти соотношения выполняются, то, согласно следствию из теоремы 2, можно утверждать, что число N простое. Если же эти условия нарушаются, нужно выбрать другое значение a и повторять эти операции до тех пор, пока такое число не будет обнаружено. Предположим, что построенное число N действительно является простым. Зададимся вопросом, сколь долго придётся перебирать числа a , пока не будет найдено такое, для которого будут выполнены условия (15). Заметим, что для простого числа N первое условие (15), согласно малой теореме Ферма, будет выполняться всегда. Те же числа a , для которых нарушается второе условие (12), удовлетворяют сравнению a R 1 (mod N ) . Как известно, уравнение x R 1 в поле вычетов FN имеет не более R решений. Одно из них x 1 . Поэтому на промежутке 1 a N имеется не более R 1 чисел, для которых не выполняются условия (15). Это означает, что, выбирая случайным образом числа a на промежутке 1 a N , при простом N можно с вероятностью большей, чем 1 O S 1 , найти число a , для которого будут выполнены условия теоремы 2, и тем доказать, что N действительно является простым числом [18]. Заметим, что построенное таким способом простое число N будет удовлетворять неравенству N S 2 , т. е. будет записываться вдвое большим количеством цифр, чем исходное простое число S . Заменив теперь число S на найденное простое число N и повторив с этим новым S все указанные выше действия, можно построить еще большее простое число. Начав с какого-нибудь простого числа, скажем, записанного 10 десятичными цифрами (простоту его можно проверить, например, делением на маленькие табличные простые числа), и повторив указанную процедуру достаточное число раз. можно построить простые числа нужной величины. Обсудим теперь некоторые теоретические вопросы, возникающие в связи с нахождением числа R , удовлетворяющего неравенствам S R 4S 2 , и такого, что N SR 1 - простое число. Прежде всего, согласно теореме Дирихле, доказанной еще в 1839 г., прогрессия 2Sn 1 , n 1,2,3, содержит бесконечное 29 количество простых чисел. Нас интересуют простые числа, лежащие недалеко от начала прогрессии. Опенка наименьшего простого числа в арифметической прогрессии была получена в 1944 г. Ю. В. Линником. Соответствующая теорема утверждает, что наименьшее простое число в арифметической прогрессии 2Sn 1 не превосходит S C , где C - некоторая достаточно большая абсолютная постоянная. Таким образом, в настоящее время никаких теоретических гарантий для существования простого числа N SR 1, S R 4S 2 не существует. Тем не менее опыт вычислений на ЭВМ показывает, что простые числа в арифметической прогрессии встречаются достаточно близко к её началу. Упомянем в этой связи гипотезу о существовании бесконечного количества простых чисел q с условием, что число 2q 1 также простое, т. е. простым является уже первый член прогрессии [19]. Очень важен в связи с описываемым методом построения простых чисел также вопрос о расстоянии между соседними простыми числами в арифметической прогрессии. Ведь убедившись, что при некотором R число N SR 1 составное, можно следующее значение R взять равным R 2 и действовать так далее, пока не будет найдено простое число N . И если расстояние между соседними простыми числами в прогрессии велико, нет надежды быстро построить нужное число N . Перебор чисел R до того момента, как мы наткнемся на простое число N окажется слишком долгим. В более простом вопросе о расстоянии между соседними простыми числами p n и p n 1 в 38 натуральном ряде доказано лишь, что p n1 p n O p n61 , что, конечно, не очень хорошо для наших целей. Вместе с тем существует так называемая гипотеза Крамера (1936 г.), что p n1 p n O ln 2 p n , дающая вполне приемлемую опенку. Примерно такой же результат следует и из расширенной гипотезы Римана. Вычисления на ЭВМ показывают, что простые числа в арифметических прогрессиях расположены достаточно плотно. В качестве итога обсуждения в этом пункте подчеркнём следующее: если принять на веру, что наименьшее простое число, а также расстояние между соседними простыми числами в прогрессии 2Sn 1 при S n 4S 2 оцениваются величиной Oln S , то описанная схема построения больших простых чисел имеет полиномиальную опенку сложности. Кроме того, несмотря на отсутствие теоретических опенок времени работы алгоритмов, отыскивающих простые числа в арифметических прогрессиях со сравнительно большой разностью, на практике эти алгоритмы работают вполне удовлетворительно. На обычном персональном компьютере без особых затрат времени строятся таким способом простые числа порядка 10 300 [20]. Конечно, способ конструирования простых чисел для использования в схеме RSA должен быть массовым, а сами простые числа должны быть в каком- 30 то смысле хорошо распределёнными. Это вносит ряд дополнительных осложнений в работу алгоритмов. Наконец, отметим, что существуют методы построения больших простых чисел, использующие не только простые делители N 1, но и делители чисел N 1, N 2 1, N 2 N 1. В основе их лежит использование последовательностей целых чисел, удовлетворяющих линейным рекуррентным уравнениям различных порядков. Отметим, что последовательность a n , члены которой присутствуют в формулировке малой теоремы Ферма, составляет решение рекуррентного уравнения первого порядка u n1 au n , u 0 1 . 1.15 Метод факторизации Диксона Метод факторизации Диксона представляет собой целочисленный алгоритм факторизации. Это прототипный факторный метод. Известен единственный факторно-базовый метод, для которого известна оценка времени выполнения, не зависящая от предположений о свойствах гладкости значений полинома. Технология Диксона основана на обнаружении конгруэнтности квадратов по модулю целого числа. Используя алгоритм факторизации Ферма, мы можем найти сравнение, выбирая псевдослучайные значения x и надеясь, что 𝑥 2 𝑚𝑜𝑑𝑁 является полным квадратом. Алгоритм Диксона пытается эффективно найти x и y, вычисляя x, 𝑦𝜖𝑍𝑛 так, 2 что𝑥 ≡ 𝑦 2 (𝑚𝑜𝑑𝑁). Тогда с вероятностью ≥1/2, 𝑥 ≢ ±𝑦(𝑚𝑜𝑑𝑁), следовательно, НОД(x − y, n) дает множитель n с вероятностью ≥1/2. История. В 1981 году Джон Д. Диксон, математик из Карлтонского университета, разработал метод целочисленной факторизации, носящий его имя. Алгоритм Диксона не используется на практике, потому что он довольно медленный, но он важен в области теории чисел, потому что это единственный алгоритм субэкспоненциального факторинга с детерминированным (не предполагаемым) временем выполнения, и он является предшественником алгоритма квадратичной решетчатой факторизации, который в высшей степени практичен. Этот подход был открыт Майклом Моррисоном и Джоном Бриллхартом и опубликован в 1975 году. Диксон не знал всей истории, когда опубликовал свою статью 1981 года, но включил ее в более позднюю статью. Кажется, это тема важной работы в области криптологии за последние 38 лет. Статья Диксона 1981 года была отклонена первым же журналом, в который он ее отправил. Диксон не предполагал, что описанная им рандомизированная версия будет на практике конкурентоспособна с алгоритмами, которые использовались в настоящее время. Метод. Предположим, мы пытаемся разложить на множители составное число N. Мы выбираем границу B и идентифицируем базу множителей (которую мы 31 назовем P), множество всех простых чисел, меньших или равных B [21]. Затем мы ищем положительные целые числа z, такие что 𝑧 2 𝑚𝑜𝑑𝑁 является B-гладким. Поэтому мы можем написать для подходящих показателей, 𝑎 𝑧 2 ≡ ∏𝑝𝑖 ∈𝑃 𝑝𝑖 𝑖 (𝑚𝑜𝑑𝑁) (16) Когда мы сгенерируем достаточное количество этих отношений (обычно достаточно, чтобы количество отношений было на несколько больше, чем размер P), мы можем использовать методы линейной алгебры (например, исключение Гаусса) для перемножения этих различных отношений таким образом, чтобы показатели простых чисел в правой части были четными [22]. 𝑎 +𝑎𝑖,2 +...+𝑎𝑖,𝑘 𝑧12 𝑧22 … 𝑧𝑘2 = ∏𝑝𝑖 ∈𝑃 𝑝𝑖 𝑖,1 (𝑚𝑜𝑑𝑁) (17) Это дает нам сравнение квадратов вида 𝑎2 ≡ 𝑏2 (𝑚𝑜𝑑𝑁), которое можно превратить в факторизацию N, N = НОД(a + b, N)(N/НОД(a + b, N)). Эта факторизация может оказаться тривиальной (то есть N = N 1), что может произойти только в том случае, если a ≡ b(modN), и в этом случае нам придется повторить попытку с другой комбинацией отношений; но если повезет, мы получим нетривиальную пару множителей N, и алгоритм завершится Факторная база. Факторная база – это небольшой набор простых чисел, обычно используемый в качестве математического инструмента в алгоритмах, включающих обширное просеивание потенциальных факторов данного целого числа [23]. Если мы хотим факторизовать целое число N. Нам нужно сгенерировать большое количество целочисленных пар (x, y) для которых 𝑥 ≢ ±𝑦, 𝑥 2 ≡ 𝑦 2 (𝑚𝑜𝑑𝑁) и 𝑥 2 (𝑚𝑜𝑑𝑁) и 𝑦 2 (𝑚𝑜𝑑𝑁) может быть полностью факторизовано по выбранной факторной базе, то есть все их простые множители в P. B-гладкий. Натуральное число называется B-гладким, если ни один из его простых делителей не больше B. Например, 720 имеет простую факторизацию 24 32 51 : Поэтому 720 является 5-гладким, поскольку ни один из его простых множителей не больше 5 [24]. 32 2. РЕАЛИЗАЦИЯ МЕТОДА ФАКТОРИЗАЦИИ ДИКСОНА 2.1 Пример Попытаемся разложить на множители N = 84923, используя границу B = 7. Тогда факторная база равна P = 2, 3, 5, 7 [25]. Затем случайным образом ищем целые числа между 4|√84923| = 292 и N, квадраты которых являются B-гладкими. Предположим, что два из найденных чисел — 513 и 537: 5132 𝑚𝑜𝑑84923 = 8400 = 24 ∗ 3 ∗ 52 ∗ 7 5132 𝑚𝑜𝑑84923 = 33600 = 26 ∗ 3 ∗ 52 ∗ 7 Так (513 ∗ 537)2 84923 = 210 ∗ 32 ∗ 52 ∗ 72 Для приведенных ниже вычислений применяем некоторые правила модульной арифметики и деления целых чисел. (513 ∗ 537)2 84923 = (275481)2 𝑚𝑜𝑑84923 (84923. 3)2 + 2. (84923.3.20712) + 207122 𝑚𝑜𝑑84923 = 0 + 0 + 207122 𝑚𝑜𝑑84923 (we use 𝑎𝑛 𝑚𝑜𝑑𝑏 = (𝑎𝑚𝑜𝑑𝑏)𝑛 (ab)modc=(a mod c).(bmodc) С учетом того, что целые числа, кратные модулю 8492384923, равны нулю.То есть 207122 𝑚𝑜𝑑84923 = (24 ∗ 3 ∗ 52 ∗ 7)2 𝑚𝑜𝑑84923 = 168002 𝑚𝑜𝑑84923 Результат факторизации равен 84923 = НОД(20712 - 16800, 84923) * НОД(20712 + 16800, 84923) = 163 * 521. 2.2 Пошаговое выполнение алгоритма Диксона Скажем, мы хотим разложить n = 23449 на s = 2,3,5,7. Здесь x = |√n|= 154. Начиная отсюда, первые связанные квадраты, которые мы получаем: 9702 mod(23449) = 2940 = 22 ∗ 3 ∗ 5 ∗ 72 86212 mod(23449) = 11760 = 24 ∗ 3 ∗ 5 ∗ 72 И так (970 ∗ 8621)2 ≡ (22 ∗ 3 ∗ 5 ∗ 72 )2 (mod23449) То есть 145262 ≡ 58802 (mod23449) 33 Теперь находим: НОД(14526-5880,23449)=131 НОД(14526+5880,23449)=179 Коэффициенты n = 131 * 179 2.3 Реализация программной части алгоритма факторизации Диксона В ходе реализации консольной программы алгоритма факторизации Диксона на языке Pyhton, были использованы такие библиотеки как math, sqrt, gcd, numpy. Метод Диксона начинается с выбора границы b и определения факторной базы всех простых чисел, меньших b, которые являются квадратичными остатками n Для начала создаем функцию factor(n) для нахождения делителей числа с использованием алгоритма факторизации Диксона с одним входным параметром n, дальше внутри функции создаем факторную базу для данного числа, начиная с ячейки корня f данного числа N. Создаем пусстой массив для хранения связанных квадратов, далее создаем цикл для каждого числа от квадратного корня до N. Рисунок 8. Реализация программной части алгоритма Диксона. Затем многократно выбираем целое число r в диапазоне 1 <r <n, вычисляем его квадрат по модулю n, а если квадрат является гладким над факторной базой, добавим его в список отношений, останавливаясь, когда в коэффициенте больше отношений, чем факторов фактора базы, плюс небольшой резерв для тех случаев, которые терпят неудачу [26]. Идея состоит в том, чтобы идентифицировать 34 набор отношений, используя линейную алгебру, где простые групповые простые числа образуют квадрат. Затем возьмем квадратный корень из произведения всех простых коэффициентов в соотношениях, возьмем произведение соответствующих r и вычислим НОД для определения фактора. Рисунок 9. Реализация программной части алгоритма Диксона. Рисунок 10. Результат вывода двух факторов. Если находим фактор, отличный от 1, то добавляем его в окончательный массив факторов и в конце возвращаем уникальные факторы в массиве. В результате реализованной консольной программы, продемонстрирован корректная работа реализации алгоритма факторизации Диксона. 35 3. ВЗЛОМ RSA 3.1 Взлом RSA. Часть 1. Нахождения факторов (по алгоритму Диксона) Злоумышленнику необходимо разложить n=pq, где p и q — простые числа, чтобы найти показатель степени расшифровки. Не существует известного «простого» или «быстрого» способа факторизации. Вы можете попробовать «наивный» способ, который состоит в 1 том, чтобы разделить n на все числа до 𝑛2 . В худшем случае временная сложность этого будет 𝑂(𝑛1/2 ). Это может выглядеть неплохо, но n — это количество битов, которое компьютер должен записать. Это означает, что 𝑛 = 2𝑥 , поэтому 𝑂(𝑛1/2 ) = 𝑂(𝑛2/𝑥 ) = 𝑂(𝑒 𝑐∗𝑥 ), что является экспоненциальной временной сложностью, а c равноlog 2 (2) /2. В этой программной части для взлома RSA использовал 60-битные простые числа, тут мне даётся ключ шифрования [e, N], где N можно легко разложить на исходные простые числа (p и q). Как только я взломаю p и q, я смогу легко найти ключ дешифрования [d, N]. Получив ключ дешифрования, смогу расшифровать его с помощью M=CiphermodN. Параметры шифрования: e: 65537 N: 440894422403908465781875324689536669 Шифр: 141572643146697586291443115734146893 Я использовал 60-битные простые числа. Для реализации программной части взлома криптосистемы RSA, использовал такие библиотеки как sys, pyecm (Рис. 11). Далее использую алгоритм факторизации Диксона для нахождения 2 простых фактора (Рис. 12). Теперь нужно взломать N, простые числа p и q, составляющие значение. Рисунок 11. Начало реализации атаки на RSA. 36 Рисунок 12. Результат вычисленных 2 факторов p и q. 3.2 Взлом RSA. Часть 2. После того как мы нашли p и q. p = 603426456710150131 и q = 730651461335722799, найдём число PHI – это число должно быть взаимно простым по формуле (p-1)*(q-1). PHI = (p-1)*(q-1) = 440894422403908464447797406643663740. Определим такое число e, для которого является истинным следующее соотношение (𝑒 ∗ 𝑑)𝑚𝑜𝑑((𝑝 − 1) ∗ (𝑞 − 1)) = 1. Назовем открытым ключем числа e и n, а секретным – d и n. Число e нам дано, е = 65537. Теперь находим 𝑒 −1 𝑚𝑜𝑑𝑃𝐻𝐼(и где (𝑑 ∗ 𝑒)𝑚𝑜𝑑𝑃𝐻𝐼 = 1). Обратное по модулю 65537 mod 440894422403908464447797406643663740 Результат: 424755360204738889914171119530458233 (Рис. 13) d = 424755360204738889914171119530458233. Полученный результат – это ключ расшифровки. Рисунок 13. Результат ключа расшифровки 37 Теперь могу расшифровать c помощью этой формулы сообщение: Сообщение = Шифр𝑑 𝑚𝑜𝑑𝑁; d = 424755360204738889914171119530458233; шифр = 141572643146697586291443115734146893; N = 440894422403908465781875324689536669; Сообщение = 1401; Рисунок 14. Результат расшифровки сообщения Это тоже самое, что и шифр, поэтому ключи шифрования и дешифрования сработали. Таким образом ключ шифрования – [65537, 440894422403908465781875324689536669], а ключ дешифрования [424755360204738889914171119530458233,4408944224039084657818753246895] Рисунок 15. Доказательство 38 ЗАКЛЮЧЕНИЕ В данное работе я исследовал и сделал криптографический анализ алгоритма факторизации натуральных чисел Диксона Целью данной дипломной работы являлась использование факторизации натуральных чисел Диксона для взлома RSA Для выполнения дипломной работы были выполнены следующие задачи: Исследовать алгоритм факторизации натуральных чисел Диксона Исследовать криптографический алгоритм RSA Реализация программы алгоритма факторизации натуральных чисел Диксона, которая осуществляет разложение чисел на простые множители Реализовать взлом RSA с помощью алгоритма факторизации натуральных чисел Диксона В ходе дипломной работы были рассмотрены основные методы криптографии. Были изучены основные ассиметричные алгоритмы шифрования и криптосистема RSA. Существует немало различных методов факторизации, однако при определенной длине ключ имеет высокую стойкость к факторизации. Таким образом задача модификации текущих алгоритмов факторизации вполне актуальна. Кроме этого не менее актуальной стоит задача создания новых алгоритмов. Основные направления модификации - распараллеливание вычислительных задач (актуально к факторизации на эллиптических кривых), использование быстрых вычислений, оптимизация процесса вычислений, применение новых алгоритмов и другие. Исследование существующих в настоящее время методов факторизации позволит изучить, проанализировать и найти недостатки и вероятные пути улучшения существующих алгоритмов факторизации. При исследовании алгоритмов важно выделить особые блоки алгоритма и их модифицировать. В этой дипломной работе я объяснил, как реализовать метод факторизации Диксона для простых множителей. Помимо повышения эффективности, этот алгоритм может выполняться параллельно многими машинами, что делает его отличным методом факторизации очень больших чисел. Этот тип параллельной атаки использовался для факторизации RSA. За основу построения алгоритма был принят алгоритм RSA для взлома этой криптосистемы с помощью факторизации натуральных чисел Диксона, изучена соответствующая литература по алгоритму, и был построен алгоритм и реализован программный продукт в среде визуального и консольного программирования PyCharm и Jupyter Notebook под ОС типа Windows для IBM PC-совместимых компьютеров. В заключении, после анализа полученных результатов были сделаны выводы, согласно которым алгоритм работает и применим для поставленной задачи. 39 СПИСОК ИСПОЛЬЗОАВННОЙ ЛИТЕРАТУРЫ 1. Richard Crandall and Carl Pomerance. Prime Numbers: A Computational Perspective. — 1st. — Springer, 2001. — ISBN 0-387-94777-9. Section 6.1: The quadratic sieve factorization method, pp. 227-244. 2. Черемушкин А. В. Лекции по арифметическим алгоритмам в криптографии. — М.: МЦНМО, 2001. — С. 74-80. — 104 с. — ISBN 5-94057-0607. 3. Василенко О. Н. Теоретико-числовые алгоритмы в криптографии. — М.: МЦНМО, 2003. — С. 78-83. — 328 с. — ISBN 5-94057-103-4. 4. Ишмухаметов Ш. Т. Методы факторизации натуральных чисел: учебное пособие. — Казань: Казан. ун., 2011. — С. 115-117. — 190 с. 5. Lenstra A. K., Lenstra H. W., Lovasz L. (1982). «Factoring polynomials with rational coefficients». Math. Ann. 261. 6. Коблиц Н. Курс теории чисел и криптографии — 2-е издание — М.: Научное издательство ТВП, 2001. — 254 с. — ISBN 978-5-85484-014-9, 9785-85484-012-5 7. Нестеренко А. Ю. Теоретико-числовые методы в криптографии М.: Московский государственный институт электроники и математики, 2012. — 224 с. — ISBN 978-5-94506-320-4 8. Введение в криптографию / Ященко, В. В.. — Москва: МЦНМО, 1999. — 272 с. — ISBN 5-900916-40-5. 9. Шнайер, Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си = Applied Cryptography. Protocols, Algorithms and Source Code in C. — Москва: Триумф, 2002. — 816 с. — 3000 экз. — ISBN 5-89392-055-4. 10. Саломаа А. Криптография с открытым ключом. — М.: Мир, 1995. — 318 с. — ISBN 5-03-001991-X. 11. Б. А. Фороузан. Схема цифровой подписи Эль-Гамаля // Управление ключами шифрования и безопасность сети / Пер. А. Н. Берлин. — Курс лекций. 12. Алфёров А.П., Зубов А.Ю., Кузьмин А.С., Черемушкин А.В. Основы криптографии. 13. Нечаев В.И. К вопросу о сложности детерминированного алгоритма для дискретного логарифма // Математические заметки. — 1994. — Февраль (т. 55, вып. 2). — С. 91-101. 14. Factoring polynomials with rational coefficients, A.K. Lenstra, H.W. Lenstra, L. Lovasz, Mathematische Annalen 261 (1982), 515—534 15. Гатчин Ю.А., Коробейников А.Г. Основы криптографических алгоритмов. Учебное пособие. - СПб.: СПбГИТМО(ТУ), 2002. 16. [Электронный ресурс] // habrahabr.ruАлгоритм Диффи-Хеллмана // URL: https://habrahabr.ru/post/151599/. 17. [Электронный ресурс] // volpi.ru Алгоритмы асимметричного шифрования // URL: http://www.volpi.ru/umkd/zki/index.php?man=1&page=18. 18. [Электронный ресурс] // ru.wikipedia.org Факторизация с помощью эллиптических кривых //URL: https://ru.wikipedia.org/wiki/ 40 19. Методы практической криптографии, В.А. Мухачев, В.А.Хорошко, Киев 2005 20. [Электронный ресурс] // koralexand.ru Криптографические методы защиты информации // URL: http://koralexand.ru/?page_id=149 21. [Электронный ресурс] // URL: http://cryptowiki.net/index.php?title=Схемы_открытого_шифрования 22. Глухов М.М., Круглов И.А., Пикчур А.Б., Серемушкин А.В. Введение в теоретико-числовые методы криптографии,, 2011 23. [Электронный ресурс] // fb.ru RSA-шифрование. Описание и реализация алгоритма // URL: http://fb.ru/article/255506/rsa-shifrovanie-opisanie-i-realizatsiyaalgoritma-rsa 24. Динара Скрипник. Лекции по технической защите [Электронный ресурс] // URL: http://www.intuit.ru/studies/courses/2291/591/lecture/12691. 25. [Электронный ресурс] Труды научно-технической конференции кластера пензенских предприятий, обеспечивающих безопасность информацио нных технологий.// URL: http://пниэи.рф/activity/science/BIT/T8-p10.pdf 26. [Электронный ресурс] // ru.wikipedia.org RSA // URL: ru.wikipedia.org/wiki/RSA. 41