Tartuga
Местный
- Регистрация
- 19.12.2019
- Сообщения
- 101
- Реакции
- 22
Метод 1
В данном способе мы будем просто идти по циклу от 1 до 25, применять данные значения к зашифрованному тексту в качестве ключа и выводить полученные результаты в консоль Как и говорил, все банально и просто.
Итак запишем наш исходный алгоритм шифра в функцию для шифровки, создав буферную переменную, которая будет равна нашей строке, чтобы не изменять при проходе по циклу каждый раз саму строку, тк иначе получится каша, сами подумайте...
Итак, допустим у нас есть зашифрованная строка Python number one с ключом 4, которого мы не знаем и мы должны его получить в процессе расшифровки...
Прогоняем наш зашифрованный текст по циклу и получаем:
Наша расшифровка естественно видна с ключом 4.
Но в данном случае мы получаем список из 25 вариантов и нужно глазами еще искать что-то логическое... Согласитесь, не очень приятно?!
Метод 2
Данный метод будет основан на частотном анализе. Нам необходимо просчитать вхождение каждой буквы и сохранить ее в созданный массив. Воспользовавшись тем фактом, что 'е' является самой распространенной буквой в английском языке, обнаружение наиболее частой буквы и вычисление ее расстояния от 'е' выявит ключ.
Если сообщение достаточно небольшое, то данный способ может не отработать должным образом, и в таком случае придется пользоваться другим методом.
Данная штука естественно реализовывается для быстрой дешифровки больших относительно больших текстов, когда глазками уже не особо легко выбирать подходящий вариант из 25...
В данном способе мы будем просто идти по циклу от 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...