
- •«Мордовский государственный университет им. Н. П. Огарёва»
- •Курсовая работа Программа на языке с
- •«Мордовский государственный университет им. Н. П. Огарёва»
- •Задание на курсовую работу
- •4.6 Исходный код
- •4.7 Пример выполнения
- •4.8 Пример выполнения
- •Алгоритмы, основанные на операции «исключающее или» (xor).
- •Алгоритмы, основанные на алфавитных перестановках.
- •Постановка задачи
- •Описание алгоритма
- •Исходный код
- •Пример выполнения
Алгоритмы, основанные на алфавитных перестановках.
Другим простейшим семейством алгоритмов шифрования являются алгоритмы, построенные на алфавитных преобразованиях. Подобные методы шифрования часто применялись в древности.
Например, часть священных писаний на иврите была зашифрована методом Ат-Баш, по которому первой букве алфавита ставилась в соответствие последняя буква, второй – предпоследняя и т.д. Как видим, данный алгоритм не имеет ключа вовсе. Достаточно угадать способ шифрования и любые тексты, зашифрованные им, могут быть расшифрованы.
Другой известный
алгоритм – шифр Цезаря. В исходном виде
данного метода каждая буква текста
заменялась на букву, отстоящую от нее
в алфавите на
позиций.
– в данном случае и есть ключ. Сам Цезарь
использовал
.
Т.е. например, литера A
заменялась на литеру D,
B
– на E,
Z
– на C,
и т.д.
Разумеется, число можно варьировать как угодно. Более того, можно использовать ключ из произвольного количества чисел:
,
смещая первую
букву текста на
,
вторую – на
,
третью – на
и т.д. Дойдя до
,
разумеется, возвращаемся снова к
.
Именно этот алгоритм и реализован далее в практической части.
Постановка задачи
Написать программу шифрования текста по следующему алгоритму. Задан ключ key (массив из 10 целых цифр) и файл с текстом. Каждый k-ый символ текста заменяется на символ в том же регистре, расположенный на key[k] позиций правее в алфавите (при k=10 снова переходим к key[0] и т.д.).
Знаки препинания и пробелы не изменять. Результирующий файл должен иметь отличное от исходного расширение.
Описание алгоритма
Запрашиваем имя входного файла, открываем его. В случае ошибки завершаем программу.
Далее необходимо подготовить имя выходного файла, заменив в нем расширение (например, на .out). Для этого ищем в имени файла первую точку с конца функцией strrchr. Функция возвращает указатель на искомый символ или NULL в случае его отсутствия (в этом случае устанавливаем символ в конец строки, чтобы приписать расширение). Начиная с возвращенного указателя записываем в следующие 5 символов строки символы «.out\0».
Открываем выходной файл с новым именем. В случае ошибки завершаем программу.
Посимвольно читаем файл и, если очередной прочитанный символ является символом латинского алфавита, то шифруем его:
– если это большая буква, то отнимаем от нее символ «A», тем самым получаем номер буквы в алфавите (от 0 до 25);
– прибавляем к этому смещению key[k], получив номер шифрованной буквы;
– получаем остаток от деления на 26, т.к. номер шифрованной буквы может оказаться больше 25;
– прибавляем к полученному номеру символ «A» что и будет зашифрованным символом;
– аналогичным образом шифруем и прописные символы, с той разницей, что отнимается и прибавляется символ «a»;
– для остальных символов, не входящих в латиницу, ничего не предпринимаем;
– записываем символ в выходной файл;
– увеличиваем k, чтобы следующий символ шифровать следующим числом ключа;
– если k превысило 9, то сбрасываем его в ноль (возвращаемся в начало ключа).