Шифр Цезаря, также известный как шифр сдвига, назван соответственно в честь его предполагаемого изобретателя римского императора Юлия Цезаря. Чтобы «обеспечить» конфиденциальность некоторых сообщений, связанных с военными действиями, выполнялся алфавитный сдвиг в этих сообщениях.
К примеру:
C H E E S E
F K H H V H
Ключом в данном примере естественно будет три (3)
Таким образом, все, что мы сделали, это переместили значение в алфавите каждой буквы «вправо» на три. Достаточно просто.
Что если буквы в конечном итоге сместятся за алфавит?
X R A Y
A S B Z
Все, что мы должны сделать, это прокрутить значения далее по кругу.
Давайте сделаем выражение для сдвига, для реализации в коде, который мы позже также напишем.) Допустим, индекс «А» равен 0, а индекс «Х» будет 25. Наш ключ(значение сдвига) - k.
Наше выражение будет выглядеть так:
Код:
character = ( index(character) + k ) % 26 + "A"
Давайте сместим «B» на 3 в качестве примера. Индекс «B» равен 1.
Код:
1 + 3 = 4
4 % 26 = 4
4 + "A" = "E"
Реализация шифра Цезаря на c++ будет выглядет соответственно таким образом:
Код:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string s; int k;
getline(cin, s);
cin >> k;
for (auto& c : s)
{
if (c >= 'a' && c <= 'z')
c = ((c - 'a' + k) % 26) + 'a';
else if (c >= 'A' && c <= 'Z')
c = ((c - 'A' + k) % 26) + 'A';
}
cout << s << endl;
}
Вы естественно заметили, что вместо того, чтобы использовать index()метод, я вычел из исходного символа c 'a',чтобы получить индекс. Это потому, что компьютер обрабатывает символы как специальные unsigned int (беззнаковые целочисленные), обычно однобайтовые.
(В шифре Цезаря игнорируются неалфавитные символы, те они остаются со своими значениями и мы с ними ничего не делаем)