Криптография – наука о методах обеспечения конфиденциальности (невозможности прочтения информации посторонним) и аутентичности (целостности и подлинности авторства, а также невозможности отказа от авторства) информации.
История криптографии по существу равна по возрасту истории существования письменности, потому что именно с появлением письменности возникла потребность придумывать различные способы для хранения информации в виде, доступном только для определенного круга лиц. До нашей эры был придуман «Шифр Цезаря», который заключался в замене каждого символа в тексте на символ, отстоящий от него в алфавите на фиксированное число позиций. Криптоаналитики искали способы расшифровывать закодированные сообщения. Криптографы (шифровальщики) и криптоаналитики (дешифровальщики) находились в постоянном противоборстве: первые постоянно придумывали новые шифры, с первого взгляда недоступные для криптоаналитиков, а вторые находили способы дешифрования скрытых сообщений.
Современная криптография образует отдельное научное направление на стыке математики и информатики. Практическое применение криптографии стало неотъемлемой частью жизни современного общества – её используют в таких отраслях, как электронная коммерция, электронный документооборот (включая цифровые подписи), телекоммуникации и других.
Существует огромное количество различных способов шифрования данных. Целью данной лабораторной работы является изучение программного продукта, реализующего способы шифрования и дешифрования текста по треугольнику Паскаля, методом Гронсфельда и по матрице, и сохраняющего результаты шифрования (количество зашифрованных символов и их последовательность), а также информацию о способе шифрования в бинарном файле.
В треугольнике Паскаля на вершине и по бокам стоят единицы. Каждое число равно сумме двух расположенных над ним чисел. Строки треугольника симметричны относительно вертикальной оси. Продолжать треугольник можно бесконечно.
1.из треугольника Паскаля выбирается строка с номером, равным числу букв в слове;
2.k-я буква исходного слова заменяется на букву, отстоящую от исходной на число букв, указанное в k-м столбце выбранной строки треугольника Паскаля (отсчет производится по часовой стрелке, как показано на рис.4.2).
А Б В Г Д Е Ж З
Я И
Ю Й
Э К
Ь Л
Ы М
Ъ Н
Щ О
Ш П
Ч Ц Х Ф У Т С Р
Рис.4.2 – схема отсчета
Алгоритм дешифрования отличается только направлением отсчета: он будет обратным, т.е. против часовой стрелки.
Метод Гронсфельда
Шифр Гронсфельда – это шифр сложной замены, представляющий собой модификацию шифра Цезаря числовым ключом. Здесь над буквами исходного сообщения записывают цифры числового ключа. Если ключ короче сообщения, то его запись циклически повторяют. В отличие от шифра Цезаря, где зашифрованную букву отсчитывают по алфавиту как третью, здесь выбирают ту букву, которая смещена по алфавиту на соответствующую цифру ключа.
По матрице Виженера
Матрица Виженера представлена на рис.4.3. Применительно к шифру Цезаря каждая шифруемая буква сдвигалась бы на три строки (сдвиг +3), т.е. А стало бы Г, Б стало бы Д и т.д. Здесь же сдвиг зависит от буквы ключа.
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
Б
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
В
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
Г
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Д
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Е
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Ж
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
З
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
И
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
Й
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
К
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
Л
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
М
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
Н
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
О
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
П
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
Р
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
С
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
Т
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
У
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
Ф
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Х
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Ц
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ч
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ш
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Щ
Щ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Ъ
Ъ
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ы
Ы
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ь
Ь
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Э
Э
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Ю
Ю
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Я
Я
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Рис.4.3 – матрица Виженера
Шифрование происходит так: в матрице Виженера ищется столбец, соответствующий букве исходного текста, затем ищется строка, соответствующая букве ключа и на их пересечении будет находиться соответствующая буква зашифрованного текста.
При дешифровании ищется строка, соответствующая первому символу ключевого слова, и в этой строке ищется первый символ зашифрованного текста. Столбец, в котором находится последний, соответствует первому символу исходного текста. Следующие символы зашифрованного текста расшифровываются подобным же образом.
Если буквы А-Я соответствуют числам 1-32 (без буквы Ё), то шифрование и дешифрование по матрице Виженера можно записать в виде формул соответственно:
1.Интерфейс проектируемого приложения должен удовлетворять требованиям:
· интерфейс должен быть удобен и прост в использовании;
· интерфейс должен соответствовать принципу универсальности, который подразумевает поддержание основных правил построения интерфейса, характерных для основных диалоговых систем; при этом предполагается единообразие управления, единообразие назначения элементов;
· интерфейс по возможности должен обнспечивать минимальное число физических манипуляций пользователя (предполагается исключение лишних переходов).
2.Сохраните модуль главной формы под именем LR_4, а проект – под именем PR_LR_4. Главная форма приложения представлена на рис.4.4. В свойство Caption главной формы занесено ШИФРОВАНИЕ / ДЕШИФРОВАНИЕ ДЛЯ ВВОДА ДОПУСТИМЫ ПРОПИСНЫЕ РУССКИЕ БУКВЫ И СИМВОЛ-РАЗДЕЛИТЕЛЬ ‘_’. Главное меню содержит раздел Файл (с подразделами Открыть исходный текст, Открыть шифрованный текст, Выход), раздел Операции (с подразделами Инициализация, Очистка полей) и раздел Справка (с подразделом О программе). Для подраздела Очистка полей свойство Enabled имеет значение false.
Рис.4.4 – главная форма по окончании проектирования
3.Наиболее часто употребляемые команды главного меню (Выход, Инициализация, Очистка полей) продублированы на инструментальной панели, расположенной под главным меню. Здесь используется простейшая по проектированию инструментальная панель. Она состоит из простой панели Panel1 (страница Стандарт) с зачищенным свойством Caption, на которой размещены три кнопки SpeedButton1,2,3 (страница Дополнительно). Двум из них даны осмысленные имена: sbtnInit (SpeedButton2), sbtnClear (SpeedButton3) (см. заголовочный файл модуля главной формы LR_4.h). Пиктограммы (изображения) помещены на кнопки через свойство Glyph соответственно из файлов dooropen, check, clear в папке …Program Files\Common Files\Borland Shared\Images\Buttons. В свойство Hint кнопок занесены соответственно всплывающие подсказки выход, инициализация, очистка полей, в свойство ShowHint – true. Для кнопки SpeedButton3 (очистка полей) свойство HelpType поставлено в значение htKeyword (режим полной подсказки).
4.Перенесите на форму (страница Диалоги) компоненты SaveDialog1 и OpenDialog1, а со страницы Стандарт - компонент PopupMenu1. Двойным щелчком на компоненте PopupMenu1 перейдите в Конструктор Меню (окно Form1->PopupMenu1) и внесите разделы Сохранить и Сохранить как.
5.Остальная часть главной формы делится на три примерно равные части компонентами - панелями GroupBox1,2,3 (страница Стандарт). В свойство Caption панелей внесено соответственно: Треугольник Паскаля, Метод Гронсфельда, По матрице.
6.На панели GroupBox1 размещены две метки Label1,2 (Исходный текст, Зашифрованный текст), два компонента Memo1,2 и две кнопки Button1,2 (страница Стандарт) с надписями (Шифрование, Дешифрование). Заданные средой имена (значение свойства Name) Memo1, Memo2 заменены на осмысленные имена: TextPascal, CodedTextPascal (см. LR_4.h). В свойство PopupMenu компонента Memo1 занесено значение PopupMenu1, что позволит через Memo1 задавать идентичный исходный текст для всех трех способов шифрования. Заданные средой имена (значение свойства Name) Button1, Button2 заменены на осмысленные – btnEncryptP, btnDecryptP, а свойству Enabled присвоено значение false.
7.На панели GroupBox2 размещены три метки Label3,4,5 (Ключ (3-8 цифр), Исходный текст, Зашифрованный текст), три компонента Memo3,4,5 (заданные средой имена заменены на edtKeyG, TextG, CodedTextG) и две кнопки Button3,4 (заданные средой имена заменены на btnEncryptG, btnDecryptG, свойство Enabled - false).
8.На панели GroupBox3 размещены три метки Label6,7,8 (Ключ (буквы), Исходный текст, Зашифрованный текст), три компонента Memo6,7,8 (заданные средой имена заменены на edtKeyM, TextM, CodedTextM) и две кнопки Button5,6 (заданные средой имена заменены на btnEncryptM, btnDecryptM, свойство Enabled - false).
Рис.4.5 – форма «О программе»
Рис.4.6 – главная форма с результатами тестирования
Рис.4.7 – окно Редактора Кода с окном Исследователя Классов
(начало структуры проекта)
Рис.4.8 – окно Редактора Кода с окном Исследователя Классов
(продолжение структуры проекта)
Рис.4.9 – окно Редактора Кода с окном Исследователя Классов
(окончание структуры проекта)
9.Перейдем к изучению кода приложения. В проекте использован модуль, не связанный с какой-либо формой. Чтобы создать такой модуль, нужно выполнить команду Файл/Новый/Другое… и открывшемся окне Новые элементы на странице Новый щелкнуть на пиктограмме Модуль. Модулю дано имя main. В заголовочном файле этого модуля main.h размещено объявление класса, а в файле реализации модуля main.cpp – реализация класса (определения функций-элементов класса).
10.Для работы с проектом большие удобства пользователю предоставляет Исследователь Классов. По умолчанию окно Исследователя Классов (рис.4.7,8,9) появляется автоматически встроенным в окно Редактора Кода. (Оно закрывается щелчком на крестике и открывается командой Вид|ClassExplorer.) В окне Исследователя Классов можно видеть структуру своего проекта, модулей и классов. Если в окне Исследователя Классов сделать двойной щелчок на имени класса, функции или переменной, то курсор в окне Редактора Кода перейдет на строку, в которой этот класс, функция или переменная объявлена. Такая возможность относится ко всем файлам проекта, в том числе и к файлам модулей, которые не связаны с какой-либо формой. Например, на рис.4.7 представлен случай, когда двойным щелчком на имени Codec файл main.h был загружен в окно Редактора Кода.
15.На рис.4.5 представлена дополнительная форма «О программе». Это пример представления информации о программе и разработчике. Для включения в проект новой пустой формы достаточно выполнить команду Файл/Новый/Форма или нажать соответствующую быструю кнопку. Модулю дополнительной формы дано имя about. На форме размещены: компонент Image1 (страница Дополнительно), три метки Label1,2,3 и кнопка Button1 с надписью ОК для закрытия этой формы. Картинка помещена на компонент Image1 через его свойство Picture из файла cbuilder в папке …Program Files\Common Files\Borland Shared\Images\Default. Для метки Label1 свойству WordWrap присвоено значение true, чтобы получить возможность переноса слов длинной надписи на новую строчку. Ниже представлены заголовочный файл about.h и файл реализации about.cpp модуля about.
1.Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск. Щелкните на кнопке ОК формы «О программе». На главной форме подраздел меню Очистка полей, дублирующая его кнопка инструментальной панели и кнопки Шифрование, Дешифрование окажутся недоступными.
2. В окне TextPascal (Memo1)наберите исходный текст (см. рис.4.6). Щелчком правой кнопкой мыши на окне вызовите всплывающее меню и командой сохранить или сохранить как выведите исходный текст в текстовый файл. Командой Файл/Открыть исходный текст выведите исходный текст в остальные окна исходного текста. Команда главного меню Операции/Инициализация или щелчок на дублирующей ее кнопке инструментальной панели инициализация сделают доступными команду Операции\Очистка полей, кнопку инструментальной панели очистка полей и кнопки Шифрование, Дешифрование, и недоступными команду Операции/Инициализация и кнопку инициализация.
3. Зашифровать исходный текст всеми тремя способами и сохранить зашифрованные тексты с возможностью дешифрования. Для этого нужно, щелкая на кнопках Шифрование, в диалоговом окне сохранения файла указывать имя файла и закрывать окно кнопкой Сохранить.
4. Дешифровать зашифрованные тексты. Для этого, поочередно стирая исходный текст, щелкайте на кнопках Дешифрование.
5. Вывести на экран зашифрованные тексты. Для этого, стерев зашифрованные тексты, вводите команду Файл\Открыть шифрованный текст и указывайте имена файлов. Убедитесь в правильности операций, повторив п.4. На этом тестирование приложения завершается.
6. Введите команду Операции/Очистка полей или щелкните на кнопке очистка полей. Зашифруйте и дешифруйте произвольные тексты, большие в 3-4 раза тестируемого текста.
7. Командой Файл/Выход или щелчком на кнопке выход завершите выполнение приложения.
Контрольные вопросы
1.Как шифровать текст по треугольнику Паскаля, методом Гронсфельда, по матрице? Приведите блок-схемы алгоритмов.
2.Как шифровать слово по треугольнику Паскаля, методом Гронсфельда, по матрице? Приведите блок-схемы алгоритмов.
3.Как шифровать букву по треугольнику Паскаля, методом Гронсфельда, по матрице? Приведите блок-схемы алгоритмов.
4.Как выводятся в файл результаты шифрования?
5.Как дешифровать находящийся в файле зашифрованный текст?
6.Какие возможности дает использование в проекте модулей без форм? Как создать такой модуль? Что он содержит?
7.Объясните содержание класса Codec по его объявлению.
8.Как выполняется директива условной компиляции?
9.Расскажите о реализации класса Codec. С какой целью реализация класса отделяется от его объявления?
10.Как выполняется конструктор класса?
11.Как выполняется деструктор класса?
12.Укажите в коде точки, где вызывается конструктор класса.
13.Где и как нужно изменить код, чтобы вывести количество вызовов конструктора?
14.Укажите в коде точки, где вызывается деструктор класса.
15.Где и как нужно изменить код, чтобы вывести количество вызовов деструктора?
16.Как в приложении дать сведения о приложении и его разработчике? Приведите примеры.
17.Как осуществляется в проекте связь между модулями?
18.Расскажите о порядке проектирования инструментальной панели. Как связать панель с меню?
19.Какие возможности предоставляет пользователю Исследователь Классов?
20.Расскажите о возможных вариантах интерфейса для данного задания.