Файл: Методы кодирования данных (Функциональные модели).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 01.04.2023

Просмотров: 86

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Введение

Испокон веков не было ценности большей, чем информация. ХХ век – век информатики и информатизации. Технология дает возможность передавать и хранить все большие объемы информации. Это благо имеет и оборотную сторону. Информация становится все более уязвимой по разным причинам:

• возрастающие объемы хранимых и передаваемых данных;

• расширение круга пользователей, имеющих доступ к ресурсам ЭВМ, программам и данным;

• усложнение режимов эксплуатации вычислительных систем.

Поэтому все большую важность приобретает проблема защиты информации от несанкционированного доступа (НСД) при передаче и хранении. Сущность этой проблемы – постоянная борьба специалистов по защите информации со своими «оппонентами».

Для того чтобы ваша информация, пройдя шифрование, превратилась в «информационный мусор», бессмысленный набор символов для постороннего, используются специально разработанные методы – алгоритмы шифрования. Такие алгоритмы разрабатываются учеными математиками или целыми коллективами сотрудников компаний или научных центров.

Алгоритмы шифрования делятся на два больших класса: симметричные (AES, ГОСТ, Blowfish, CAST, DES) и асимметричные (RSA, El-Gamal). Симметричное шифрование

Для работы применяется всего один пароль. Происходит всё следующим образом:

1. Существует некий математический алгоритм шифрования.

2. На его вход подаётся текст и пароль.

3. На выходе получаем зашифрованный текст.

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

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

Несмотря на свои ограничения и угрозу безопасности, подход до сих пор широко распространён в криптографии. Дело в том, что он очень прост в работе и понимании. И техническая нагрузка на железо невелика (как правило, всё работает очень быстро).


Ассиметричное шифрование

Здесь применяют 2 пароля — публичный (открытый) и секретный (закрытый). Первый отсылается всем людям, второй остаётся на стороне сервера. Эти названия достаточно условные, а зашифрованное одним из ключей сообщение можно расшифровать лишь с помощью другого. По сути и значимости они равноценны.

Данные алгоритмы шифрования дают возможность без проблем распространять пароли по сети, ведь не имея 2-го ключа, любое исходное сообщение останется для вас непонятным шифром. Кстати, на этом принципе работает и протокол SSL, позволяющий устанавливать безопасные соединения с пользователями, т. к. закрытый ключ есть только на стороне сервера. Для ассиметричного шифрования хранение паролей проще, ведь секретный ключ не нужно передавать кому-либо. А в случае взлома сервер сменит пару ключей и разошлёт всем новые комбинации.

Считается, что ассиметричное шифрование «тяжелее» симметричного. Всё потому, что оно требует больше компьютерных ресурсов. Есть ограничения и на процесс генерации ключей.

Как правило, возможности ассиметричного шифрования используют для выполнения идентификации пользователей (например, при входе на сайт). Или с его помощью создают сессионный ключ для симметричного шифрования (речь идёт о временном пароле для обмена данными между сервером и пользователем). Или формируют зашифрованные цифровые подписи. В последнем случае проверить такую подпись может каждый, используя публичный ключ, находящийся в открытом доступе.

Что важно знать

Давайте перечислим основные моменты и сравним оба вида шифрования:

1. Симметричный алгоритм прекрасно подходит при передаче больших объёмов зашифрованных данных. Ассиметричный в этом случае будет работать медленнее. Кроме того, при организации обмена информацией по ассиметричному алгоритму оба ключа должны быть известны обеим сторонам либо пар должно быть две (по одной на каждую сторону).

2. Ассиметричное шифрование позволяет дать старт безопасному соединению без каких-либо усилий со стороны пользователя. Если говорить о симметричном шифровании, то пользователю нужно знать пароль. Однако не стоит думать, что ассиметричный подход безопасен на 100 %. К примеру, он подвержен атакам «человек посередине». Это когда между сервером и вами размещается компьютер, который вам отсылает свой открытый ключ, а при передаче информации с вашей стороны, использует открытый ключ сервера. В итоге происходит перехват конфиденциальных данных.


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

4. Симметричный шифр обычно строится на основании ряда блоков с математическими функциями преобразования, ассиметричный — на математических задачах. Тот же RSA создан на задаче возведения в степень с последующим вычислением модуля. В результате алгоритмы симметричного шифрования модифицировать просто, а ассиметричного — практически невозможно.

5. Лучший эффект достигается при комбинации обоих видов шифрования. Происходит это так:

— посредством ассиметричного алгоритма серверу отсылается сессионный ключ для симметричного шифрования;

— происходит обмен информацией по симметричному алгоритму.

Тут возможны варианты, но общий смысл обычно не меняется.

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

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

Алгоритм RSA стоит у истоков асимметричной криптографии. В 1982 году была создана RSA Data Security Inc. тремя парнями – математиками Рональдом Ривестом (R. Rivest), Ади Шамиром (A. Shamir) и Леонардом Адльманом (L. Adleman), которые в 1977 году опубликовали свою идею алгоритма. В результате обороты продаж этой компании составили $900 миллионов, принеся создателям и огромные деньги, и признание мировой общественности. Но были и другие люди... Шифр RSA (под другим названием), однако с точностью до совпадения всех обозначений, был открыт в 1969 году. В штаб-квартиру правительственой связи в Великобритании был предложен шифр, авторами которого были Клиффорд Кокс, Малькольм Вильямсон и Джеймс Эллис, сотрудники этой организации.

Из-за математической сложности, руководство шифровальной службы Великобритании не приняло этот шифр в качестве рабочего инструмента. В чём же заключалась разница? Ривест, Шамир и Адлерман опубликовали алгоритм в открытой печати, и он стал всем известен, а эти люди, как сотрудники секретной службы, написали разработанный ими шифр своему начальству. Убедить начальство в 69 году в Англии у них не получилось, ведь тогда никакого понятия односторонних функций не существовало. Да, они использовались, но на доводы о сложности разложения произведения двух простых больших чисел им возражали в духе «ну мало ли математических задач, пройдёт 3 года и может какой-нибудь студент вам всё разложит. И что вы будете делать?». И шифр был отклонён. Описание положили «в стол», а т.к. они были сотрудниками секретной службы, наложили гриф Top Secret, соответственно ни о какой публикации и не могло идти речи. Его сняли лишь в 1983 году, это уже через 6 лет после открытой публикации RSA. Забавность в том, что они обозначали p и q — простые числа, n — произведение, d от слова decription, e — encryption, и вообще алгоритм был идентичен…


Таким образом, 3 человека, которые могли занять место Ривеста, Шамира и Адлермана, могли только следить за распространением полной копии своего алгоритма, который им публиковать не разрешили. Известно, что Агентство национальной безопасности (США) пыталось бороться с распространением алгоритма RSA уже после того, как его начали использовать всё больше и больше людей, однако попытки оказались безуспешны. Асимметричное шифрование прочно вошло в наш мир…

Это, конечно, далеко не единственный случай. Зачастую засекреченные теоремы (например, из теории решёток, теории групп, булевой алгебры и пр.) имеющие стратегическое значение, рассекречивались уже не при жизни автора, таким образом написанная дата создания теоремы была позже смерти самого автора.

1. Постановка задачи

Разработать и отладить программу на языке Лисп реализующую криптографический алгоритм кодирования информации с открытым ключом – RSA.

Шифрование:

Входные данные: M – сообщение, состоящее из целых чисел.

Выходные данные: T – Зашифрованное сообщение.

Дешифрование:

Входные данные: T – Результат шифрования.

Выходные данные: M – изначальное сообщение.

    1. Язык программирования Лисп

LISP (от англ. LISt Processing - "обработка списков") - семейство языков программирования, основанных на представлении программы системой линейных списков символов, которые притом являются основной структурой данных языка. Лисп считается вторым после Фортрана старейшим высокоуровневым языком программирования. В 1950-х годах специалисты по искусственному интеллекту начали поиски языка программирования, который бы позволял манипулировать понятиями, выраженными словами и фразами на естественном языке. Первый результат был получен в виде семейства языков под названием ИПЛ (IPL, от Information Processing Languages - языки обработки информации), созданного одним из пионеров в области искусственного интеллекта Алленом Ньюэллом и его сотрудниками. Центральным для ИПЛ являлось понятие списка. Представляя данные в виде списка слов и символов, программист мог связать понятия в памяти компьютера приблизительно таким же образом, как, по мнению специалистов по искусственному интеллекту, они связываются в памяти человека. Понятием списка заинтересовался и Джон Маккарти, разносторонний математик, один из ведущих исследователей в области искусственного интеллекта (причем сам термин искусственный интеллект был предложен именно им в 1956 году).


Язык Лисп был предложен Джоном Маккарти в работе в 1960 году и ориентирован на разработку программ для решения задач не численного характера. Английское название этого языка - LISP является аббревиатурой выражения LISt Processing (обработка списков) и хорошо подчеркивает основную область его применения. Понятие "список" оказалось очень емким. В виде списков удобно представлять алгебраические выражения, графы, элементы конечных групп, множества, правила вывода и многие другие сложные объекты. Списки являются наиболее гибкой формой представления информации в памяти компьютеров. Неудивительно поэтому, что удобный язык, специально предназначенный для обработки списков, быстро завоевал популярность. После появления LISP различными авторами был предложен целый ряд других алгоритмических языков ориентированных на решение задач в области искусственного интеллекта. Однако это не помешало LISP остаться наиболее популярным языком для решения таких задач. На протяжении почти сорокалетней истории его существования появился ряд диалектов этого языка: Common LISP, Mac LISP, InterLISP, Standard LISP и др. [3] Различия между ними не носят принципиального характера и в основном сводятся к несколько отличающемуся набору встроенных функций и некоторой разнице в форме записи программ. Поэтому, программист, научившийся работать на одном из них, без труда сможет освоить и любой другой. Большим достоинством LISP является его функциональная направленность, т. е. программирование ведется с помощью функций. Причем функция понимается как правило, сопоставляющее элементам некоторого класса соответствующие элементы другого класса. Сам процесс сопоставления не оказывает никакого влияния на работу программы, важен только его результат - значение функции. Это позволяет относительно легко писать и отлаживать большие программные комплексы. Ясность программ, четкое разграничение их функций, отсутствие каверзных побочных эффектов при их выполнении является обязательными требованиями к программированию таких логически сложных задач, каковыми являются задачи искусственного интеллекта. Дисциплина в программировании становится особенно важной, когда над программой работает не один человек, а целая группа программистов.

Основные функции языка Лисп

К числу основных особенностей языка Лисп относится то, что программой является несколько определенных пользователем функций. С точки зрения синтаксиса Лисп-функция, как и обрабатываемые ею данные, представляет собой так называемое S-выражение. В простейшем случае S-выражением является атом (идентификатор или число), в более сложном - список, т.е. последовательность элементов, разделенных обычно пробелом и заключенных в круглые скобки. Списки языка Лисп имеют рекурсивную структуру: элементом списка может быть произвольное S-выражение - как атом, так и список, например: (1() (a b (c)) class). Некоторые S-выражения можно вычислять, получая в результате значения (тоже S-выражения); такие выражения называются формами. Формой может быть переменная, т.е. атом-идентификатор, которому было присвоено значение одной из функций Лиспа (значением такой формы является текущее значение переменной). Формой является также список-обращение к функции вида(f a1, a2 ... an), где f - имя функции, а ai - ее аргументы (n≥0). Программа на Лиспе представляет собой последовательность таких форм, и ее выполнение заключается в их вычислении. В большинстве версий языка Лисп имеется много встроенных (стандартных) функций, на основе которых составляется программа. Все они есть в наиболее известных версиях Лиспа, таких как Common Lisp и MuLisp. Для определения новых функций используется встроенная функция defun, к которой возможны следующие (равноценные) обращения: (defun f (lambda (v1 v2 ... vn) e)) или (defun f (v1 v2 ... vn) e). Вычисление функции defun в качестве побочного эффекта приводит к появлению в программе новой функции с именем f ; vi - формальные параметры новой функции (n≥0), а e - форма, зависящая от vi. Таким образом, определяется обычная ЛИСП-функция, т.е. функция с фиксированным количеством аргументов, которые всегда вычисляются при обращении к ней. При последующем обращении к этой уже определенной функции (f a1 a2 ... an) сначала вычисляются аргументы (фактические параметры) ai, затем вводятся локальные переменные vi, которым присваиваются значения соответствующих аргументов ai, и далее вычисляется форма e при этих значениях переменных vi, после чего эти переменные уничтожаются. Значением данной формы становится значение функции f при аргументах ai. Операции над списками (car l) - значением аргумента l должен быть непустой список, тогда значением функции является первый элемент (верхнего уровня) этого списка (cdr l) и значением функции является "хвост" этого списка, т.е. список, полученный отбрасыванием первого элемента. Кроме этих двух функций-селекторов элементов списка часто используются функции, являющиеся их суперпозициями. Имена всех таких функций начинаются на букву c, а заканчиваются на букву r, между ними же может стоять произвольная комбинация из не более чем 5 букв a и d, например, (cadar l)≡(car(cdr(car l))) . Предполагается, что список-аргумент l всех этих функций, так же как и следующей функции nth, содержит необходимое число элементов (в противном случае вычисления прерываются). (nth n l) - значением аргумента n должно быть положительное целое число (обозначим его N), а значением аргумента l - список. Значением функции является N-й от начала элемент этого списка. (last l) - функция выбирает последний (от начала) элемент списка, являющегося значением ее аргумента. программирование диалект язык лисп (cons e l) - в отличие от предыдущих функций эта функция является конструктором, т.е. строит новый список, который и выдает в качестве своего результата. Первым элементом этого списка будет значение аргумента e, а хвостом списка - значение аргумента l . Например, (append l1 l2). Эта функция осуществляет слияние (конкатенацию) двух списков, являющихся значением двух ее аргументов. (list e1 e2 ... en ) - еще одна функция конструктор, она имеет произвольное количество аргументов, из их значений она строит список (количество элементов результирующего списка равно количеству аргументов). Арифметические функции