Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет_END.doc
Скачиваний:
6
Добавлен:
24.09.2019
Размер:
173.06 Кб
Скачать

Алгоритмы, основанные на алфавитных перестановках.

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

Например, часть священных писаний на иврите была зашифрована методом Ат-Баш, по которому первой букве алфавита ставилась в соответствие последняя буква, второй – предпоследняя и т.д. Как видим, данный алгоритм не имеет ключа вовсе. Достаточно угадать способ шифрования и любые тексты, зашифрованные им, могут быть расшифрованы.

Другой известный алгоритм – шифр Цезаря. В исходном виде данного метода каждая буква текста заменялась на букву, отстоящую от нее в алфавите на позиций. – в данном случае и есть ключ. Сам Цезарь использовал . Т.е. например, литера 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, то сбрасываем его в ноль (возвращаемся в начало ключа).