Загрузить исходный код ЗДЕСЬ.
#includeШифр Цезаря - к каждому символу добавляют сдвиг, число сдвига не больше числа символов в алфавите, деление по модулю для избежания переполнения, например 255 + 10 (сдвиг 10) будет = 266 - больше чем байт будет ошибка, поэтому нужно деление по модулю %.#include #include std::string caesarCipher(const std::string& text, int shift) { std::string result = ""; for (char ch : text) { // Проверяем, является ли символ буквой if (isalpha(ch)) { char base = islower(ch) ? 'a' : 'A'; // Шифрование с использованием модуля result += (ch - base + shift) % 26 + base; } else { result += ch; // Не изменяем не буквенные символы } } return result; } std::string caesarDecipher(const std::string& text, int shift) { std::string result = ""; for (char ch : text) { // Проверяем, является ли символ буквой if (isalpha(ch)) { char base = islower(ch) ? 'a' : 'A'; // Расшифровка с использованием модуля result += (ch - base - shift + 26) % 26 + base; } else { result += ch; // Не изменяем не буквенные символы } } return result; } int main() { // Устанавливаем кодовую страницу для ANSI SetConsoleOutputCP(1251); // 1251 - кодировка для русского языка std::string text = "Hello World!"; int shift = 3; std::cout << "Исходный текст: " << text.c_str() << std::endl; std::string encrypted = caesarCipher(text, shift); std::cout << "Зашифрованный текст: " << encrypted << std::endl; std::string decrypted = caesarDecipher(encrypted, shift); std::cout << "Расшифрованный текст: " << decrypted << std::endl; return 0; }
% 26 Деление по модулю в коде С++ для английского языка потому что 26 символов в алфавите-------------------------------------
% 32 Деление по модулю в коде С++ для русского языка потому что 32 символа в алфавите
В примере выше используется размер одного символа 8 бит, то есть байт. Всего может быть сдвигов для английского языке 26, для русского 32 - шифр легко взламать методом перебора, 26 и 32 комбинации небольшое число для перебора.
Шифр Цезаря является одним из самых простых шифров и подвержен взлому с помощью brute force. Поскольку шифр использует фиксированный сдвиг, возможное количество комбинаций ограничено количеством символов в алфавите: 26 комбинаций для английского текста и 32 для русского. Перебрав все возможные сдвиги, можно легко подобрать правильный и расшифровать сообщение, что делает этот шифр уязвимым для таких атак.