Как создать шифр Цезаря и дешифратор на языке C

Последнее обновление: 04/12/2025
Автор: Исаак
  • Шифр Цезаря заменяет каждую букву другой, смещенной на фиксированное число позиций, определяемых ключом.
  • В языке C это реализовано путем преобразования букв в числовые коды, применения сумм и модуля 26, а также учета заглавных и строчных букв.
  • Такие функции, как isalpha, isupper, islower, strlen и модульная конструкция, упрощают интерактивную программу для шифрования, дешифрования и подбора паролей.
  • Это исторически значимый, но криптографически слабый алгоритм, идеальный для использования в качестве образовательного и обучающего упражнения. programación.

Программа шифрования Цезаря на языке C

Если вы только начинаете изучать язык программирования C и хотите получить практический проект, Создайте программу для шифрования и дешифрования с использованием шифра Цезаря. Это идеальный вариант. Он простой, заставляет оперировать строками, работать с символами и мыслить математическими терминами, но при этом не сводит с ума сложностью.

Помимо того, что это служит упражнением по программированию, Шифр Цезаря — отличная отправная точка в мир криптографии.Вы узнаете, что такое ключ, почему некоторые системы уязвимы и как взломать шифрование методом подбора. Мы рассмотрим это шаг за шагом, с теорией, примерами и несколькими подходами к реализации на языке C.

Что такое шифр Цезаря и откуда он взялся?

Вызов шифр ЦезаряШифр сдвига, или шифр сдвига, — одна из старейших существующих криптографических систем. Его название происходит от Юлий Цезарь, который он, как говорят, использовал для командования замаскированные военные сообщения своим генералам, так что если бы кто-то перехватил текст, то не смог бы понять его с первого взгляда.

Идея очень проста: Каждая буква исходного сообщения заменяется другой, которая находится на фиксированное число позиций вперед или назад в алфавите.Это количество позиций является ключНапример, при нажатии клавиши 3 буква A становится D, B становится E, C становится F и так далее до буквы Z, где алфавит «разворачивается» и снова начинается с A.

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

Смещенный алфавит в шифре Цезаря

Математические основы шифра Цезаря

За этим классическим методом стоит очень компактная математическая формулировка. Мы пронумеровали каждую букву от 0 до n-1 (где n — размер алфавита), мы можем выразить шифр как:

C = (P + k) mod n

где P это положение исходной буквы, C это позиция зашифрованной буквы, k является ключом к перемещению и n это общее количество Символы алфавита (26 в английском алфавите без ñ). Оператор модуль Это гарантирует, что по достижении конца алфавита отсчет начнется заново.

Чтобы получить сообщение, просто отменить операцию:

P = (C − k) mod n

На практике, когда мы реализуем это на языке C, мы работаем не с абстрактными позициями, а с числовые коды символов (совместимые с ASCII или UTF-8)Заглавные буквы от A до Z занимают значения от 65 до 90, а строчные буквы от aa до z находятся в диапазоне от 97 до 122. Используя эти диапазоны, мы можем вычесть базовый код («A» или «a»), применить сдвиг по модулю 26 и снова прибавить основание.

Ключевая деталь: Модульная работа гарантирует «круговой эффект» алфавита.Если сдвинуть Z на три позиции с помощью клавиши 3 в верхнем регистре, то получится C, поскольку расчет производится в диапазоне 0-25, а затем преобразуется обратно в код ASCII.

Базовые концепции криптографии, которые вам необходимы

Работа с шифром Цезаря позволяет вам усвоить несколько классические концепции криптографии пока не углубляясь в высшую математику или современные алгоритмы.

  Как измерить FPS в видеоиграх для Windows

Мы называем исходное незашифрованное сообщение плоский текстЭто то, что вы хотите передать: например, «До свидания» или целая фраза. Результат после шифрования: тексто чифрадо o криптограмма, который выглядит как строка бессмысленных букв, например «Dglrv».

Процесс преобразования открытого текста в шифртекст называется шифрование, тогда как обратная операция называется расшифровкаВ обоих случаях, а ключкоторый в шифре Цезаря представляет собой просто целое число от 1 до 26 (или от 0 до 25, в зависимости от того, как вы его определяете в программе), и его применение в таких сервисах, как Gmail.

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

Пример шифрования и дешифрования Цезаря

ASCII, порядковые числительные и преобразование букв в цифры

Чтобы реализовать эту систему на языке C, вам нужно хорошо понимать как компьютеры представляют персонажейИсторически в основном использовалась кодировка ASCII, в которой каждому символу присваивается целое число от 0 до 127, хотя на практике чаще всего используются печатаемые диапазоны от 32 до 126.

Как мы уже отметили, Заглавные буквы AZ имеют коды от 65 до 90., y строчные буквы az от 97 до 122Цифры от 0 до 9 находятся в диапазоне от 48 до 57. В настоящее время принято работать с UTF-8, но для основных символов она сохраняет те же значения, что и ASCII, поэтому наш код все равно будет действителен.

Обычный трюк заключается в том, чтобы преобразовать букву в ее числовой кодманипулировать этим числом с помощью операций сложения, вычитания и деления по модулю, а затем преобразовать его обратно в символ. Питон Это делается с помощью функций ord () y chr (); в языке C они не существуют как таковые, но Сам тип char можно рассматривать как целое число., а символьные константы, такие как «А» или «а», действуют как числовые значения.

Например, чтобы переместить букву «А» на три позиции вперед в букве С, можно подумать следующим образом: «А» имеет код 65, вы добавляете 3 и получаете 68, что соответствует «D».При работе с заглавными буквами сначала вычтите «A», чтобы нормализовать диапазон до 0-25, примените смещение по модулю 26, а затем снова прибавьте «A», чтобы восстановить правильный код.

Общая структура программы на языке C для шифра Цезаря

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

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

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

Код C для шифра Цезаря

Использование стандартных функций языка C для работы с символами

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

  Уменьшить размер документа онлайн бесплатно

Функциональная клава:

В частности, для шифра Цезаря вас особенно заинтересует:

  • исальфа(с): возвращает ненулевое значение, если c — буква (заглавная или строчная), и ноль в противном случае.
  • isupper(c): проверяет, является ли c заглавной буквой.
  • ниже(c): проверяет, является ли c строчной буквой.

Con estas funciones puedes легко фильтровать, какие символы будут обработаныЕсли isalpha(c) ложно, вы просто копируете символ в результат и переходите к следующему. Если это буква, вы выбираете подходящий диапазон (AZ или az) в соответствии с isupper или islower и применяете сдвиг, не опасаясь выйти за пределы соответствующего алфавита.

Параллельно вам понадобится заголовок для таких функций, как strlen ()что позволяет узнать длину строки и использовать ее в цикле для o в то время как путем повторения сообщения.

Пример реализации базового шифра Цезаря на языке C

Очень распространенная версия программы на языке C определяет функцию, которую мы могли бы вызвать, например: прекратить(), отвечающий за преобразовать на месте полученную строку или создать зашифрованную копию из входного буфера.

Типичный поток:

  • En Основной ()Пользователю предлагается обработать текст.
  • Запрашивается ключ смещения, и он проверяется, чтобы убедиться, что он находится в допустимом диапазоне.
  • Функция шифрования вызывается путем передачи текста и ключа.
  • Результат отображается на экране.

Внутренняя структура:

  • Рассчитайте длину текста с помощью strlen() для установки пределов цикла.
  • Обойти строку символ за символом, используя целочисленный индекс.
  • Проверьте, является ли каждый символ заглавной буквой, строчной буквой или не алфавитным.
  • Примените смещение с помощью соответствующей формулы и оператора % 26.
  • Оставьте неалфавитные символы без изменений.

Использование оператором 26% имеет решающее значение для результата оставаться в пределах алфавитаТаким образом, если вы сдвинете z с помощью клавиши 3, вы получите c вместо странного символа кода ASCII.

Манипулирование строками в C: scanf, fgets и буферы

Одним из самых сложных аспектов написания этих программ на языке C является не само шифрование, а способ чтения строки из стандартного вводаХотя `scanf` с "%s" кажется заманчивым, у него есть несколько проблем: он обрезает чтение на первом пробеле, плохо контролирует размер буфера и легко может вызвать переполнение, если не соблюдать осторожность.

Вот почему многие современные примеры предпочитают использовать fgets () для чтения целых строк. Эта функция получает буфер, его максимальный размер и источник ввода (обычно stdin) и гарантирует, что ограничения не будут превышены. Компромисс заключается в том, что Обычно он оставляет разрыв строки в конце строки.Поэтому обычно лучше очистить строку вручную, пройдясь по ней и заменив «\n» на «\0» при его появлении.

В любом случае алгоритм шифрования не зависит от того, как вы получили строку: Вы можете инкапсулировать логику Цезаря в функцию, которая получает заранее подготовленный char[], а затем в main решите, следует ли заполнить этот массив с помощью fgets, scanf или любого другого метода в соответствии с вашими потребностями.

Полная реализация шифра Цезаря на языке C

Структура полной интерактивной программы

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

Очень четкая организация заключается в разделении логики на несколько функций:

  • получитьMode(): спрашивает пользователя, хочет ли он зашифровать, расшифровать или использовать метод подбора пароля, и возвращает символ или короткую строку, представляющую выбранный режим.
  • получитьСообщение(): отвечает за запрос текста на обработку и его возврат.
  • получитьКлей(): запрашивает ключ у пользователя, заставляет пользователя ввести значение от 1 до максимального (например, 26) и возвращает это целое число.
  • getTranslatedMessage(режим, сообщение, ключ): применяет логику шифрования или дешифрования в соответствии с режимом, возвращая преобразованный текст.
  Как создавать интеллект-карты. 7 рекомендуемых программ

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

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

#включать // Для printf и scanf #include // Для strlen // Функция, которая применяет шифр Цезаря void caesar_cipher(char *text, int shift) { for (int i = 0; i < strlen(text); i++) { char c = text[i]; // текущий символ // Если это заглавная буква if (c >= 'A' && c <= 'Z') { text[i] = ((c - 'A' + shift) % 26) + 'A'; } // Если это строчная буква else if (c >= 'a' && c <= 'z') { text[i] = ((c - 'a' + shift) % 26) + 'a'; } // Если это не буква, оставляем как есть } } int main() { char message[100]; // буфер для текста int shift; // значение сдвига printf("Введите сообщение для шифрования: "); scanf("%99[^\n]", message); // Считывает до 99 символов, включая пробелы printf("Введите смещение (например, 3): "); scanf("%d", &offset); // Применить шифрование caesar_cipher(message, offset); printf("Зашифрованное сообщение: %s\n", message); return 0; }

Обработка заглавных букв, строчных букв и специальных символов

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

Типичная логика это:

  • Если символ не проходит проверку isalpha ()Он копируется непосредственно в результат без каких-либо изменений.
  • Если это заглавная буква, то она нормализует значение путем вычитания «А»Смещение применяется по модулю 26, а затем снова добавляется «А».
  • Если это строчная буква, то делается то же самое, но с диапазоном, основанным на «а».
  • Если при добавлении ключа вы выходите за пределы диапазона (за пределы «Z» или «z»), вычтите 26; если при вычитании вы выходите за пределы диапазона, прибавьте 26.

Таким образом, вы можете сделать тексты типа «До свидания» с клавишей 3 «Dglrv» с учётом заглавной буквы и строчных остальных букв, и что при расшифровке вы точно возвращаетесь к оригиналу.

Также важно знать, что Шифр Цезаря не изменяет пробелы и знаки препинания.Это позволяет сохранить визуальную структуру предложений и абзацев, но при этом длина сообщения и относительное расположение слов остаются видимыми для злоумышленника.

более безопасные алгоритмы шифрования и хеширования
Связанная статья:
Более безопасные алгоритмы шифрования и хеширования: полное руководство