Skip to content

Практическая работа №11

Разработка программ шифрования: шифр Цезаря и шифр Атбаш

Section titled “Разработка программ шифрования: шифр Цезаря и шифр Атбаш”

Цель работы: Изучить принципы простейших символьных алгоритмов шифрования, освоить работу со строками и символами в C++, а также реализовать два классических шифра: шифр Цезаря и шифр Атбаш.

Основные теоретические положения

Section titled “Основные теоретические положения”

Шифр Цезаря — один из самых простых и древних методов шифрования. Каждая буква текста заменяется на букву, расположенную через определённое число шагов в алфавите.

Например, при сдвиге shift = 3:

A → D
B → E
C → F
...
X → A
Y → B
Z → C

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

Шифр Атбаш — моноалфавитная замена, где каждая буква отображается в «зеркальную»:

A ↔ Z
B ↔ Y
C ↔ X
...

Этот шифр симметричен — операция шифрования совпадает с дешифрованием.

Работа со строками и символами в C++

Section titled “Работа со строками и символами в C++”

Для обработки символов используются их ASCII-коды:

  • 'A'..'Z' — диапазон 65–90
  • 'a'..'z' — диапазон 97–122

Размер сдвига регулируется операциями:

(char)('A' + (c - 'A' + shift + 26) % 26)

1. Алгоритм шифра Цезаря

Section titled “1. Алгоритм шифра Цезаря”
  1. Пройти по каждому символу строки.
  2. Если символ — буква латиницы:
    • определить, находится ли он в 'A'..'Z' или 'a'..'z',
    • применить формулу циклического сдвига.
  3. Иначе — оставить символ без изменений.
  4. Собрать результат в строку.

Для каждой буквы:

  • если заглавная:

    newChar = 'Z' - (c - 'A')
  • если строчная:

    newChar = 'z' - (c - 'a')

Все не-буквы остаются без изменений.

Пример реализации (C++): Псевдокод

Section titled “Пример реализации (C++): Псевдокод”
string encryptCaesar(const string& text, int shift) {
// цикл по символам
// проверка диапазонов A..Z, a..z
// циклический сдвиг
}
string decryptCaesar(const string& text, int shift) {
// сдвиг в обратную сторону
return encryptCaesar(text, -shift);
}
string atbash(const string& text) {
// для каждой буквы зеркальное отображение
}

  1. Написать программу на языке C++.
  2. Реализовать две функции для шифра Цезаря:
    • encryptCaesar
    • decryptCaesar
  3. Реализовать функцию:
    • atbash
  4. Шифрование должно корректно обрабатывать:
    • буквы латинского алфавита (A–Z, a–z),
    • любой целый сдвиг (в том числе отрицательный),
    • остальные символы должны сохраняться.
  5. Выводить:
    • исходный текст,
    • зашифрованный текст,
    • расшифрованный текст,
    • результат шифра Атбаш.

Задания для выполнения

Section titled “Задания для выполнения”
ЗадачаОписание
1Шифрование ЦезаряРеализуйте функцию encryptCaesar(), принимающую строку и величину сдвига и возвращающую зашифрованную строку.
2Дешифрование ЦезаряРеализуйте функцию decryptCaesar(), использующую обратный сдвиг.
3ИнтеграцияПользователь вводит текст и сдвиг. Программа выводит: зашифрованный текст и расшифрованный обратно.
ЗадачаОписание
4Шифр АтбашРеализуйте функцию atbash(). Выполните шифрование введённого текста.
5Сравнение шифровВыведите в консоль сравнение: исходный → Цезарь → Атбаш.

  1. Чем отличаются моноалфавитные и полиалфавитные шифры?
  2. В чём преимущество и в чём слабость шифра Цезаря?
  3. Почему шифр Атбаш является полностью симметричным?
  4. Что происходит с символами, не являющимися буквами алфавита?
  5. Как обработать отрицательный сдвиг в шифре Цезаря?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. Саймон Сингх — Код. Тайная история шифрования. (Глава о Цезаре)
  2. Брюс Шнайер — Прикладная криптография. (История шифров)
  3. Шилдт Г. — C++: Полное руководство. (Работа со строками и ASCII)