Исследование методов современной криптографии, разработка программного обеспечения для реализации алгоритмов кодирования и декодирования информации
Барашев И.И. 1
1Технический колледж ФГБОУ ВО "Тамбовский государственный технический университет"
Мосягина Н.Г. 1
1Технический колледж ФГБОУ ВО “Тамбовский государственный технический университет”
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
ВВЕДЕНИЕ
Все чаще люди пользуются компьютерными системами и сетями. Проблема защиты информации в компьютерных системах является важной и занимает одно из ключевых мест в современном мире. И это обусловлено такими причинами как:
- Большой объем информации обрабатываемой с помощью компьютеров
- Быстрое увеличение вычислительной мощности
- Резкое расширение количества пользователей.
- Распространение сетевых технологий.
И люди чаще всего пренебрегают защитой своей информации или защитой от не санкционированного доступа. И одно из решений этих проблем, является использование шифрования.
- История криптографии
История криптографии насчитывает около 4 тысяч лет. В качестве основного критерия периодизации криптографии возможно использовать технологические характеристики используемых методов шифрования [1].
Первый период (приблизительно с 3-го тысячелетия до н. э.) характеризуется господством моноалфавитных шифров (основной принцип — замена алфавита исходного текста другим алфавитом через замену букв другими буквами или символами). Второй период (хронологические рамки — с IX века на Ближнем Востоке (Ал-Кинди) и с XV века в Европе (Леон Баттиста Альберти) — до начала XX века) ознаменовался введением в обиход полиалфавитных шифров. Третий период (с начала и до середины XX века) характеризуется внедрением электромеханических устройств в работу шифровальщиков. При этом продолжалось использование полиалфавитных шифров.
Четвёртый период — с середины до 70-х годов XX века — период перехода к математической криптографии. В работе Шеннона появляются строгие математические определения количества информации, передачи данных, энтропии, функций шифрования. Обязательным этапом создания шифра считается изучение его уязвимости к различным известным атакам — линейному и дифференциальному криптоанализу. Однако до 1975 года криптография оставалась «классической», или же, более корректно, криптографией с секретным ключом.
Современный период развития криптографии (с конца 1970-х годов по настоящее время) отличается зарождением и развитием нового направления — криптография с открытым ключом. Её появление знаменуется не только новыми техническими возможностями, но и сравнительно широким распространением криптографии для использования частными лицами.
Правовое регулирование использования криптографии частными лицами в разных странах сильно различается — от разрешения до полного запрета.
Современная криптография образует отдельное научное направление [2] на стыке математики и информатики — работы в этой области публикуются в научных журналах, организуются регулярные конференции. Практическое применение криптографии стало неотъемлемой частью жизни современного общества — её используют в таких отраслях как электронная коммерция, электронный документооборот (включая цифровые подписи), телекоммуникации и других.
- Классификация криптографических методов защиты информации
По виду воздействия на исходную информацию методы криптографического преобразования информации могут быть разделены на четыре группы:
- Шифрование
- Стенография
- Кодирование
- Сжатие
- Процесс шифрования заключается в проведении обратимых математических, логических, комбинаторных и других преобразований исходной информации, в результате которых зашифрованная информация представляет собой хаотический набор букв, цифр, других символов и двоичных кодов.
Для шифрования информации используются алгоритм преобразования и ключ. Как правило, алгоритм для определенного метода шифрования является неизменным. Исходными данными для алгоритма шифрования служит информация, подлежащая зашифровыванию, и ключ шифрования. Ключ содержит управляющую информацию, которая определяет выбор преобразования на определенных шагах алгоритма и величины операндов, используемых при реализации алгоритма шифрования. Операнд – это константа, переменная, функция, выражение и другой объект языка программирования, над которым производятся операции.
- В отличие от других методов криптографического преобразования информации, методы стеганографии позволяют скрыть не только смысл хранящейся или передаваемой информации, но и сам факт хранения или передачи закрытой информации. В основе всех методов стеганографии лежит маскирование закрытой информации среди открытых файлов, т.е. скрываются секретные данные, при этом создаются реалистичные данные, которые невозможно отличить от настоящих. Обработка мультимедийных файлов в информационных системах открыла практически неограниченные возможности перед стеганографией.
Графическая и звуковая информация представляются в числовом виде. Так, в графических объектах наименьший элемент изображения может кодироваться одним байтом. В младшие разряды определенных байтов изображения в соответствии с алгоритмом криптографического преобразования помещаются биты скрытого файла. Если правильно подобрать алгоритм преобразования и изображение, на фоне которого помещается скрытый файл, то человеческому глазу практически невозможно отличить полученное изображение от исходного. С помощью средств стеганографии могут маскироваться текст, изображение, речь, цифровая подпись, зашифрованное сообщение.
Скрытый файл также может быть зашифрован. Если кто-то случайно обнаружит скрытый файл, то зашифрованная информация будет воспринята как сбой в работе системы. Комплексное использование стеганографии и шифрования многократно повышает сложность решения задачи обнаружения и раскрытия конфиденциальной информации.
- Содержанием процесса кодирование информации является замена исходного смысла сообщения (слов, предложений) кодами. В качестве кодов могут использоваться сочетания букв, цифр, знаков. При кодировании и обратном преобразовании используются специальные таблицы или словари. В информационных сетях кодирование исходного сообщения (или сигнала) программно-аппаратными средствами применяется для повышения достоверности передаваемой информации.
Часто кодирование и шифрование ошибочно принимают за одно и тоже, забыв о том, что для восстановления закодированного сообщения, достаточно знать правило замены, в то время как для расшифровки сообщения помимо знания правил шифрования, требуется ключ к шифру.
- Сжатие информации может быть отнесено к методам криптографического преобразования информации с определенными оговорками. Целью сжатия является сокращение объема информации. В то же время сжатая информация не может быть прочитана или использована без обратного преобразования. Учитывая доступность средств сжатия и обратного преобразования, эти методы нельзя рассматривать как надежные средства криптографического преобразования информации. Даже если держать в секрете алгоритмы, то они могут быть сравнительно легко раскрыты статистическими методами обработки. Поэтому сжатые файлы конфиденциальной информации подвергаются последующему шифрованию. Для сокращения времени передачи данных целесообразно совмещать процесс сжатия и шифрования информации.
3 Разработка программного обеспечения для реализации алгоритмов кодирования и декодирования информации (шифр цезаря)
Шифр Цезаря — один из древнейших шифров. При шифровании каждый символ заменяется другим, отстоящим от него в алфавите на фиксированное число позиций. Шифр Цезаря можно классифицировать как шифр подстановки, при более узкой классификации — шифр простой замены.
Шифр назван в честь римского императора Гая Юлия Цезаря, использовавшего его для секретной переписки. Естественным развитием шифра Цезаря стал шифр Виженера. С точки зрения современного криптоанализа, шифр Цезаря не имеет приемлемой стойкости.
3.1. Описание алгоритма шифрования
Если сопоставить каждому символу алфавита его порядковый номер (нумеруя с 0), то шифрование и дешифрование можно выразить формулами [1] модульной арифметики[1][2]:
y=(x+k) mod n
x — символ открытого текста,
y — символ шифрованного текста,
n — мощность алфавита,
k — ключ.
С точки зрения математики шифр Цезаря является частным случаем аффинного шифра.
3.2 Выбор средств проектирования
Для своего проекта я выбрал язык C++ с библиотекой MFC.
Достоинства
C++ — чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения[3]. В частности:
- Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщённое программирование, метапрограммирование (шаблоны, макросы).
- Предсказуемое выполнение программ является важным достоинством для построения систем реального времени. Весь код, неявно генерируемый компилятором для реализации языковых возможностей (например, при преобразовании переменной к другому типу), определён в стандарте. Также строго определены места программы, в которых этот код выполняется. Это даёт возможность замерять или рассчитывать время реакции программы на внешнее событие.
- Автоматический вызов деструкторов объектов при их уничтожении, причём в порядке, обратном вызову конструкторов. Это упрощает (достаточно объявить переменную) и делает более надёжным освобождение ресурсов (память, файлы, семафоры и т. п.), а также позволяет гарантированно выполнять переходы состояний программы, не обязательно связанные с освобождением ресурсов (например, запись в журнал).
- Пользовательские функции-операторы позволяют кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме.
- Язык поддерживает понятия физической (const) и логической (mutable) константности. Это делает программу надёжнее, так как позволяет компилятору, например, диагностировать ошибочные попытки изменения значения переменной. Объявление константности даёт программисту, читающему текст программы дополнительное представление о правильном использовании классов и функций, а также может являться подсказкой для оптимизации. Перегрузка функций-членов по признаку константности позволяет определять изнутри объекта цели вызова метода (константный для чтения, неконстантный для изменения). Объявление mutable позволяет сохранять логическую константность при использовании кэшей и ленивых вычислений.
- Используя шаблоны, возможно создавать обобщённые контейнеры и алгоритмы для разных типов данных, а также специализировать и вычислять на этапе компиляции.
- Возможность имитации расширения языка для поддержки парадигм, которые не поддерживаются компиляторами напрямую. Например, библиотека Boost.Bind позволяет связывать аргументы функций.
- Возможность создания встроенных предметно-ориентированных языков программирования. Такой подход использует, например библиотека Boost.Spirit, позволяющая задавать EBNF-грамматику парсеров прямо в коде C++.
- Используя шаблоны и множественное наследование можно имитировать классы-примеси и комбинаторную параметризацию библиотек. Такой подход применён в библиотеке Loki, класс SmartPrt которой позволяет, управляя всего несколькими параметрами времени компиляции, сгенерировать около 300 видов «умных указателей» для управления ресурсами.
- Кроссплатформенность: стандарт языка накладывает минимальные требования на ЭВМ для запуска скомпилированных программ. Для определения реальных свойств системы выполнения в стандартной библиотеке присутствуют соответствующие возможности (например, std::numeric_limits <T>). Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
- Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования — при необходимости язык позволяет обеспечить максимальную эффективность программы.
- Имеется возможность работы на низком уровне с памятью, адресами.
- Высокая совместимость с языком Си, позволяющая использовать весь существующий Си-код (код на Си может быть с минимальными переделками скомпилирован компилятором C++; библиотеки, написанные на Си, обычно могут быть вызваны из C++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на Си, вызывать код, написанный на С++).
Недостатки
Отчасти недостатки C++ унаследованы от языка-предка — Си, — и вызваны изначально заданным требованием возможно большей совместимости с Си. Это такие недостатки, как:
- Синтаксис, провоцирующий ошибки:
- Операция присваивания обозначается как =, а операция сравнения как ==. Их легко спутать, при этом операция присваивания возвращает значение, поэтому присваивание на месте выражения является синтаксически корректным, а в конструкциях цикла и ветвления появление числа на месте логического значения также допустимо, так что ошибочная конструкция оказывается синтаксически правильной. Типичный пример подобной ошибки: if (x=0) { операторы }Здесь в условном операторе по ошибке написано присваивание вместо сравнения. В результате, вместо того, чтобы сравнить текущее значение x с нулём, программа присвоит x нулевое значение, а потом интерпретирует его как значение условия в операторе if. Так как нуль соответствует логическому значению «ложь», блок операторов в условной конструкции не выполнится никогда. Ошибки такого рода трудно выявлять, но во многих современных компиляторах предлагается диагностика некоторых подобных конструкций.
- Операции присваивания (=), инкрементации (++), декрементации (--) и другие возвращают значение. В сочетании с обилием операций это позволяет, хотя и не обязывает, создавать трудночитаемые выражения. Наличие этих операций в Си было вызвано желанием получить инструмент ручной оптимизации кода, но в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях. С другой стороны, один из основных принципов языков Си и C++ — позволять программисту писать в любом стиле, а не навязывать «хороший» стиль.
- Макросы (#define) являются мощным, но опасным средством. Они сохранены в C++ несмотря на то, что необходимость в них, благодаря шаблонам и встроенным функциям, не так уж велика. В унаследованных стандартных Си-библиотеках много потенциально опасных макросов.
- Некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдаёт беззнаковый результат.
- C++ позволяет пропускать break в ветви оператора switch с целью последовательного выполнения нескольких ветвей. Такой же подход принят в языке Java. Есть мнение, что это затрудняет понимание кода. Например, в языке C# необходимо всегда писать либо break, либо использовать goto case N для явного указания порядка выполнения.
- Препроцессор, унаследованный от Си, очень примитивен. Это приводит с одной стороны к тому, что с его помощью нельзя (или тяжело) осуществлять некоторые задачи метапрограммирования, а с другой, вследствие своей примитивности, он часто приводит к ошибкам и требует много действий по обходу потенциальных проблем. Некоторые языки программирования (например, Scheme и Nemerle) имеют намного более мощные и более безопасные системы метапрограммирования (также называемые макросами, но мало напоминающие макросы Си/C++).
- Плохая поддержка модульности (по сути, в классическом Си модульность на уровне языка отсутствует, её обеспечение переложено на компоновщик). Подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла (#include) серьёзно замедляет компиляцию при подключении большого количества модулей (потому что результирующий файл, который обрабатывается компилятором, оказывается очень велик). Эта схема без изменений скопирована в C++. Для устранения этого недостатка, многие компиляторы реализуют механизм прекомпиляции заголовочных файлов (англ. Precompiled header).
К собственным недостаткам C++ можно отнести:
- Сложность и избыточность, из-за которых C++ трудно изучать, а построение компилятора сопряжено с большим количеством проблем. В частности:
- Многие конструкции С++ позволяют делать то же самое, что и конструкции Си, также присутствующие в С++. Это иногда сбивает с толку новичков. Например, приведение типов при помощи dynamic_cast позволяет привести указатель или ссылку строго в пределах иерархии классов. Это делает код более надёжным, декларативным и позволяет находить приведения в пределах иерархии при помощи инструментов типа grep. Однако вследствие требования высокой степени совместимости с Си старое приведение типов всё ещё поддерживается.
- Иногда шаблоны приводят к порождению кода очень большого объёма. Для снижения размера машинного кода можно специальным образом подготавливать исходный код. Другим решением является стандартизованная ещё в 1998 году возможность экспорта шаблонов. Некоторые авторы считают, что её трудно реализовать и поэтому она доступна не во всех компиляторах. «Раздувание» машинного кода вследствие использования шаблонов часто преувеличивается, и современные компиляторы во многих случаях успешно устраняют это явление.
- Метапрограммирование на основе шаблонов C++ сложно и при этом ограничено в возможностях. Оно состоит в реализации средствами шаблонов C++ интерпретатора примитивного функционального языка программирования, выполняющегося во время компиляции. Сама по себе данная возможность весьма привлекательна, но такой код весьма трудно воспринимать и отлаживать. Менее распространённые языки Lisp/Scheme, Nemerle имеют более мощные и одновременно более простые для восприятия подсистемы метапрограммирования. Кроме того, в языке D реализована сравнимая по мощности, но значительно более простая в применении подсистема шаблонного метапрограммирования.
- Явная поддержка функционального программирования присутствует только в будущем стандарте c++0x. Данный пробел устраняется различными библиотеками (Loki, Boost), использующими средства метапрограммирования для расширения языка функциональными конструкциями (например, поддержкой лямбд/анонимных методов), но качество подобных решений значительно уступает качеству встроенных в функциональные языки решений. Такие возможности функциональных языков, как сопоставление с образцом, вообще крайне сложно эмулировать средствами метапрограммирования.
- Некоторые считают недостатком языка C++ отсутствие встроенной системы сборки мусора. С другой стороны, средства C++ позволяют реализовать сборку мусора на уровне библиотеки Противники сборки мусора полагают, что RAII является более достойной альтернативой. С++ позволяет пользователю самому выбирать стратегию управления ресурсами.
- Описание программы кодирования и декодирования информации
Программа представляет собой простой графический интерфейс (Рисунок 1) и предназначена для кодирования и декодирования информации.
Для увеличения стойкости алгоритма в ней используются 3 шифра цезаря с 3 различными ключами.
Интерфейс программы
Рисунок 1 – Диалоговое окно
Задание шифра цезаря
Для того что бы задать значения шифрования необходимо выполнить следующие действия:
- Выделить первое поле
- Ввести значение с клавиатуры или выбрать его с помощью стрелочек.
- Повторить предыдущие действия для остальных блоков
В итоге должно получиться, что то вроде этого
Рисунок 2 – Заданный шифр цезаря
Кодирования информации.
Для кодирования информации необходимо:
- Задать шифр цезаря
- Перевести ползунок в режим кодирования
- Ввести информацию, которую нужно закодировать в поле ввода
- Нажать на кнопку выполнить
Алгоритм декодирования информации.
Для декодирования информации необходимо:
- Задать шифр цезаря согласно тому, что был указан при шифровании
- Перевести ползунок в режим декодирования
- Ввести закодированную информацию в поле ввода
- Нажать на кнопку выполнить
Функция для шифрования шифром цезаря [3].
CString encodeCezar(CString text,int key,int c) {
wchar_t* textin = text.GetBuffer();
int length = text.GetLength();
for (int i = c; i < length; i+=3)
textin[i] += key;
return text;
}
Построчное описание функций шифрования
CString encodeCezar(CString text,int key,int c) Объявление функции .
В при вызове функции в нее вводятся параметры:
- CString text – текст который нужно закодировать.
- Int key – ключ шифрования.
- Int c – с какого символа начинать шифрование.
wchar_t* textin = text.GetBuffer(); Объявление переменной для хранения входного текста и изменение его типа из CString в wchar_t.
Int length = text.GetLength(); Объявление переменной для хранения размера входного текста.
for (int i = c; i < length; i+=3) Цикл для перебора каждой 3 буквы начиная от указанной.
textin[i] += key; Смещение буквы на значение выбранного ключа
return text; Возвращение измененного текста
Функция для дешифрования шифром цезаря [3].
CString dencodeCezar(CString text, int key, int c) {
wchar_t* textin = text.GetBuffer();
int length = text.GetLength();
for (int i = c; i < length; i += 3)
textin[i] -= key;
return text;
}
Построчное описание функций дешифрования
CString dencodeCezar(CString text, int key, int c) Объявление функции.
В при вызове функции в нее вводятся параметры:
- CString text – текст который нужно декодировать.
- Int key – ключ шифрования.
- Int c – с какого символа начинать дешифровку.
wchar_t* textin = text.GetBuffer(); Объявление переменной для хранения входного текста и изменение его типа из CString в wchar_t.
int length = text.GetLength(); Объявление переменной для хранения размера входного текста.
for (int i = c; i < length; i+=3) Цикл для перебора каждой 3 буквы начиная от указанной.
textin[i] -= key; Смещение буквы на значение выбранного ключа
return text; Возвращение измененного текста
Алгоритм программы
ЗАКЛЮЧЕНИЕ
Проблема защиты информации в современном обществе занимает одно из ключевых мест. Актуальность и важность проблем защиты информации в компьютерных информационных системах и сетях обусловлена следующими причинами:
резкое увеличение вычислительной мощности современных компьютеров при одновременном упрощении их эксплуатации; увеличение объемов информации, накапливаемой, хранимой и обрабатываемой с помощью компьютеров; высокие темпы роста количества персональных компьютеров, находящихся в эксплуатации в самых разных сферах деятельности; резкое расширение круга пользователей, имеющих непосредственный доступ к вычислительным ресурсам и массивам данных; бурное развитие программных средств, не всегда соответствующих даже минимальным требованиям безопасности; повсеместное распространение сетевых технологий и объединение локальных сетей в глобальные.
Технический колледж ТГТУ проводит подготовку квалифицированных специалистов по направлению 10.02.05 Обеспечение информационной безопасности автоматизированных систем. Одним из важнейших направлений организации образовательного процесса в колледже является модернизация методов и технологий непрерывной профессиональной подготовки на основе информационно-коммуникационных технологий. Особое внимание уделяется проектированию электронных ресурсов, позволяющих выработать профессиональные умения и навыки студентов: виртуальные практикумы, программы для визуализации и моделирования технологических процессов.
Разработанная шифровальная машина войдет в состав информационной профессионально - ориентированной дидактической среды колледжа, может использоваться при проведении уроков теоретического и производственного обучения, организации практических занятий и учебных практик, дополнительной подготовке обучающихся специальности 10.02.05 Обеспечение информационной безопасности автоматизированных систем.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ
- Басалова Г.В. Основы криптографии [Электронный ресурс] / Г.В. Басалова. — Электрон. текстовые данные. — М. : Интернет-Университет Информационных Технологий (ИНТУИТ), 2016. — 282 c. — 2227-8397. — Режим доступа: http://www.iprbookshop.ru/52158.html
- Ожиганов А.А. Криптография [Электронный ресурс] : учебное пособие / А.А. Ожиганов. — Электрон. текстовые данные. — СПб. : Университет ИТМО, 2016. — 142 c. — 2227-8397. — Режим доступа: http://www.iprbookshop.ru/67231.html
- Визуальное программирование на основе библиотеки MFC [Электронный ресурс] : методические указания к лабораторным работам по курсу «Визуальное программирование» для студентов направления 09.03.02 Информационные системы и технологии / . — Электрон. текстовые данные. — Саратов: Вузовское образование, 2016. — 57 c. — 2227-8397. — Режим доступа: http://www.iprbookshop.ru/28324.html
- Мир знаний [Электронный ресурс] . — Режим доступа: http://mirznanii.com/a/315286/istoriya-kriptografii
- Информационный портал Студопедия [Электронный ресурс] . — Режим доступа:https://studopedia.ru/2_105320_zashchita-informatsii-aktualnost-voprosov-zashchiti-informatsii.html
Просмотров работы: 328