The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project The YapLink Project

Взлом шифра Цезаря

Tartuga

Местный
Регистрация
19.12.2019
Сообщения
101
Реакции
22
Метод 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, которого мы не знаем и мы должны его получить в процессе расшифровки...


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


Наша расшифровка естественно видна с ключом 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...
 
Верх