Шифр Цезаря на языке Си

В этой статье я расскажу про шифрование текста на языке C методом сдвига символов (также известный как шифр Цезаря). Пользователь вводит натуральное число n – это количество символов, на которое мы сдвигаем данный символ. Например, если n = 2, то буква ‘б’ превращается в букву ‘г’. Будем считать, что буквы идут по кругу, то есть за буквой ‘я’ следует буква ‘а’. Программа должна уметь как зашифровывать, так и расшифровывать текст. Шифровать будем только русские и английские буквы (другие символы: знаки препинания, пробелы и т.п. – шифровать не будем, оставим их без изменения). Ввод/вывод производим из файла.

Приступим к написанию программы. Подключим необходимые библиотеки и определим две константы – количество букв в английском и русском алфавитах соответственно.

Примечание. Константу RUS сделаем равной 32, потому что буква ‘ё’ в таблице символов ASCII в кодировке Windows 1251 находится за границей русского алфавита.

Теперь напишем функцию, которая будет шифровать текст из входного файла. В качестве аргумента она будет принимать число n – количество символов, на которое сдвигать символы в тексте:

Опишу по порядку, что происходит в этой функции. Открывает входной файл “input.txt” для чтения, открываем (или если он отсутствует, то создаем)  выходной файл “output.txt” для записи. Функцией getc() будем по одному считывать символы из входного файла. Запускаем цикл с предусловием while (!feof(fp1)), функция в скобках проверяет, не достигли ли мы конца файла. В if’ах проверяем принадлежность считанного символа одной из групп символов, если считанный символ ‘c’ – это русская или английская буква, то выполняем ее шифрование, сдвигаем: c = c + (n % ENG). Остаток от деления на количество букв в алфавите берем для того, чтобы при n >= ENG убрать лишний “круг(и)” прохода по алфавиту. Если зашифрованная буква вышла за границы алфавита, то делаем круг и возвращаемся к началу: if (c > ‘Z’) c = ‘A’ + (c – ‘Z’) – 1;. Записываем символ в выходной файл.

Если же считанный символ ‘c’ не является буквой, а является другим символом (для контроля этого мы вводили переменную flag), то в этом случае выполнится условие if (!flag) fprintf (fp2, “%c”, c); и мы запишем символ ‘c’ в выходной файл без изменения.

В конце функции закрываем файлы “input.txt” и “output.txt”.

Теперь напишем функцию, которая расшифровывает текст. Здесь практически все то же самое, за исключение того, что теперь мы не “прибавляем” символы, а “вычитаем”:

Теперь функция main:

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

Демонстрация работы программы. Введем n = 2:

Шифр Цезаря. Демонстрация работы программы

Исходный текст:

Шифр Цезаря - текст для шифрования

Получается такой зашифрованный текст:

Шифр Цезаря - зашифрованный текст

Скачать исходник программы Шифр Цезаря можно, кликнув на кнопку ниже:

Скачать исходник

 

Шифр Цезаря на языке Си
5 (100%) 5 votes

Поделиться в соц. сетях:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">