19.02.2019 20:15
Occul
 



Шифр Цезаря, также известный как шифр сдвига, назван соответственно в честь его предполагаемого изобретателя римского императора Юлия Цезаря. Чтобы «обеспечить» конфиденциальность некоторых сообщений, связанных с военными действиями, выполнялся алфавитный сдвиг в этих сообщениях.

К примеру:

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 (беззнаковые целочисленные), обычно однобайтовые.

(В шифре Цезаря ​​игнорируются неалфавитные символы, те они остаются со своими значениями и мы с ними ничего не делаем)

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.