Исследование методов современной криптографии, разработка программного обеспечения для реализации алгоритмов кодирования и декодирования информации

V Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке

Исследование методов современной криптографии, разработка программного обеспечения для реализации алгоритмов кодирования и декодирования информации

Барашев И.И. 1
1Технический колледж ФГБОУ ВО "Тамбовский государственный технический университет"
Мосягина Н.Г. 1
1Технический колледж ФГБОУ ВО “Тамбовский государственный технический университет”
Автор работы награжден дипломом победителя III степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

ВВЕДЕНИЕ

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

  • Большой объем информации обрабатываемой с помощью компьютеров
  • Быстрое увеличение вычислительной мощности
  • Резкое расширение количества пользователей.
  • Распространение сетевых технологий.

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

 

  1. История криптографии

 

История криптографии насчитывает около 4 тысяч лет. В качестве основного критерия периодизации криптографии возможно использовать технологические характеристики используемых методов шифрования [1].

Первый период (приблизительно с 3-го тысячелетия до н. э.) характеризуется господством моноалфавитных шифров (основной принцип — замена алфавита исходного текста другим алфавитом через замену букв другими буквами или символами). Второй период (хронологические рамки — с IX века на Ближнем Востоке (Ал-Кинди) и с XV века в Европе (Леон Баттиста Альберти) — до начала XX века) ознаменовался введением в обиход полиалфавитных шифров. Третий период (с начала и до середины XX века) характеризуется внедрением электромеханических устройств в работу шифровальщиков. При этом продолжалось использование полиалфавитных шифров.

Четвёртый период — с середины до 70-х годов XX века — период перехода к математической криптографии. В работе Шеннона появляются строгие математические определения количества информации, передачи данных, энтропии, функций шифрования. Обязательным этапом создания шифра считается изучение его уязвимости к различным известным атакам — линейному и дифференциальному криптоанализу. Однако до 1975 года криптография оставалась «классической», или же, более корректно, криптографией с секретным ключом.

Современный период развития криптографии (с конца 1970-х годов по настоящее время) отличается зарождением и развитием нового направления — криптография с открытым ключом. Её появление знаменуется не только новыми техническими возможностями, но и сравнительно широким распространением криптографии для использования частными лицами.

Правовое регулирование использования криптографии частными лицами в разных странах сильно различается — от разрешения до полного запрета.

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

 

  1. Классификация криптографических методов защиты информации

По виду воздействия на исходную информацию методы криптографического преобразования информации могут быть разделены на четыре группы:

  1. Шифрование
  2. Стенография
  3. Кодирование
  4. Сжатие
  5. Процесс шифрования заключается в проведении обратимых математических, логических, комбинаторных и других преобразований исходной информации, в результате которых зашифрованная информация представляет собой хаотический набор букв, цифр, других символов и двоичных кодов.

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

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

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

Скрытый файл также может быть зашифрован. Если кто-то случайно обнаружит скрытый файл, то зашифрованная информация будет воспринята как сбой в работе системы. Комплексное использование стеганографии и шифрования многократно повышает сложность решения задачи обнаружения и раскрытия конфиденциальной информации.

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

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

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

 

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 – Диалоговое окно

 

Задание шифра цезаря

Для того что бы задать значения шифрования необходимо выполнить следующие действия:

  1. Выделить первое поле
  2. Ввести значение с клавиатуры или выбрать его с помощью стрелочек.
  3. Повторить предыдущие действия для остальных блоков

В итоге должно получиться, что то вроде этого

 

Рисунок 2 – Заданный шифр цезаря

 

Кодирования информации.

Для кодирования информации необходимо:

  1. Задать шифр цезаря
  2. Перевести ползунок в режим кодирования
  3. Ввести информацию, которую нужно закодировать в поле ввода
  4. Нажать на кнопку выполнить

 

Алгоритм декодирования информации.

Для декодирования информации необходимо:

  1. Задать шифр цезаря согласно тому, что был указан при шифровании
  2. Перевести ползунок в режим декодирования
  3. Ввести закодированную информацию в поле ввода
  4. Нажать на кнопку выполнить

 

Функция для шифрования шифром цезаря [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 Обеспечение информационной безопасности автоматизированных систем.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ

 

  1. Басалова Г.В. Основы криптографии [Электронный ресурс] / Г.В. Басалова. — Электрон. текстовые данные. — М. : Интернет-Университет Информационных Технологий (ИНТУИТ), 2016. — 282 c. — 2227-8397. — Режим доступа: http://www.iprbookshop.ru/52158.html
  2. Ожиганов А.А. Криптография [Электронный ресурс] : учебное пособие / А.А. Ожиганов. — Электрон. текстовые данные. — СПб. : Университет ИТМО, 2016. — 142 c. — 2227-8397. — Режим доступа:      http://www.iprbookshop.ru/67231.html
  3. Визуальное программирование на основе библиотеки MFC [Электронный ресурс] : методические указания к лабораторным работам по курсу «Визуальное программирование» для студентов направления 09.03.02 Информационные системы и технологии / . — Электрон. текстовые данные. — Саратов: Вузовское образование, 2016. — 57 c. — 2227-8397. — Режим доступа: http://www.iprbookshop.ru/28324.html
  4. Мир знаний [Электронный ресурс] . — Режим доступа: http://mirznanii.com/a/315286/istoriya-kriptografii
  5. Информационный портал Студопедия [Электронный ресурс] . — Режим доступа:https://studopedia.ru/2_105320_zashchita-informatsii-aktualnost-voprosov-zashchiti-informatsii.html

 

 

 

Просмотров работы: 328