✍️ Статья Взлом шифра Цезаря

The 146X Project Dublikat Web Studio Avram Lincoln AL Service Navigator Knyaz

Tartuga

💰 Проверенный продавец
Регистрация
19.12.2019
Сообщения
93
Метод 1
В данном способе мы будем просто идти по циклу от 1 до 25, применять данные значения к зашифрованному тексту в качестве ключа и выводить полученные результаты в консоль:) Как и говорил, все банально и просто.

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

string encryption(string& str, int k)
{
string s = str;

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';
}

return s;
}

И далее напишем функцию main в которой будет вводится зашифрованный текст и прогоняться по циклу для расшифровки:

int main()
{
string s;
getline(cin, s);

for (int i = 1; i < 26; i++)
{
cout << i << ": ";
cout << encryption(s, 26-i) << endl;
}
}



Итак, допустим у нас есть зашифрованная строка Python number one с ключом 4, которого мы не знаем и мы должны его получить в процессе расшифровки...

b970fa697b74af341bd11.png

Прогоняем наш зашифрованный текст по циклу и получаем:

1bf7961ad0eb15638918e.png

Наша расшифровка естественно видна с ключом 4.

Но в данном случае мы получаем список из 25 вариантов и нужно глазами еще искать что-то логическое... Согласитесь, не очень приятно?!



Метод 2
Данный метод будет основан на частотном анализе. Нам необходимо просчитать вхождение каждой буквы и сохранить ее в созданный массив. Воспользовавшись тем фактом, что 'е' является самой распространенной буквой в английском языке, обнаружение наиболее частой буквы и вычисление ее расстояния от 'е' выявит ключ.

Если сообщение достаточно небольшое, то данный способ может не отработать должным образом, и в таком случае придется пользоваться другим методом.

int main()
{

string s;
getline(cin, s);

vector<int> vec(26);


for (auto& c : s)
{
if (c >= 'a' && c <= 'z')
vec[c - 'a']++;
else if (c >= 'A' && c <= 'Z')
vec[c - 'A']++;
}


int max_index = 0;
for (int i = 1; i < 26; i++)
{
if (vec > vec[max_index])
max_index = i;
}

int key = max_index - 4;
while (key < 0)
key += 26;

cout << encryption(s, 26 - key) << endl;
}


Данная штука естественно реализовывается для быстрой дешифровки больших относительно больших текстов, когда глазками уже не особо легко выбирать подходящий вариант из 25...
 

📌 Золотая реклама

AnonPaste

Верх