Здравствуйте) Очень нужна помощь с одной мудреной программкой, реализующей частотный криптоанализ для шифротекстов, зашифрованных шифром Цезаря. Как я поняла, суть заключается в том, что эта программа сама должна угадать ключ сдвига, сравнив частоту встречаемости символов в зашифрованном тексте с эталонными частотами…Прошу подскажите, как это можно сделать? Вот наработочки…
using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
namespace Крип2
{
class Program
{ //алфавит мощностью 26 (массив 25)
static string A = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private string CodeEncode(string s, int k)
{
var letterQty = A.Length;
var retVal = "";
for (int i = 0; i < s.Length; i++)
{
var c = s[i];
var index = A.IndexOf(c);
if (index < 0)
{
//если символ не найден, то добавляем его как символ открытого текста
retVal += c.ToString();
}
else
{
var codeIndex = (letterQty + index + k) % letterQty;
retVal += A[codeIndex];
}
}
return retVal;
}
//Дешифрование
public string Decrypt(string s, int k)
=> CodeEncode(s, -k);
//словарь частоты встречаемости символов
private static Dictionary<string, double> symbols = new Dictionary<string, double>()
{
["A"] = 0.082,
["B"] = 0.015,
["C"] = 0.028,
["D"] = 0.043,
["E"] = 0.130,
["F"] = 0.022,
["G"] = 0.020,
["H"] = 0.061,
["I"] = 0.070,
["J"] = 0.002,
["К"] = 0.008,
["L"] = 0.040,
["M"] = 0.024,
["N"] = 0.067,
["O"] = 0.075,
["P"] = 0.019,
["Q"] = 0.001,
["R"] = 0.060,
["S"] = 0.063,
["T"] = 0.091,
["U"] = 0.028,
["V"] = 0.010,
["W"] = 0.024,
["X"] = 0.001,
["Y"] = 0.020,
["Z"] = 0.001
};
static void Main()
{
// Массив для хранения частот
int[] c = new int[(int)char.MaxValue];
string g = File.ReadAllText("text.txt");
string s = g.Replace(" ", "");
foreach (char t in s)
{
c[(int)t]++;
}
// Частотный анализ
for (int i = 0; i < (int)char.MaxValue; i++)
{
if (c[i] > 0 && char.IsLetterOrDigit((char)i))
{
Console.WriteLine("Буква: {0} Частота: {1}", (char)i, Math.Round(((double)c[i] / (double)s.Length ), 3));
}
}
}
}
}
Заранее зашифрованный Цезарем текст в документе ( ключ сдвига 11, его должна угадать программа).
text.txt (805 Байт)