Шифр Цезаря, реализация Visual Studio С++

Загрузить исходный код ЗДЕСЬ.


	#include 
	#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;
	}

Шифр Цезаря - к каждому символу добавляют сдвиг, число сдвига не больше числа символов в алфавите, деление по модулю для избежания переполнения, например 255 + 10 (сдвиг 10) будет = 266 - больше чем байт будет ошибка, поэтому нужно деление по модулю %.
	
	% 26

	Деление по модулю в коде С++ для английского языка потому что 26 символов в алфавите

-------------------------------------
	
	% 32

	Деление по модулю в коде С++ для русского языка потому что 32 символа в алфавите

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

Шифр Цезаря является одним из самых простых шифров и подвержен взлому с помощью brute force. Поскольку шифр использует фиксированный сдвиг, возможное количество комбинаций ограничено количеством символов в алфавите: 26 комбинаций для английского текста и 32 для русского. Перебрав все возможные сдвиги, можно легко подобрать правильный и расшифровать сообщение, что делает этот шифр уязвимым для таких атак.