Расшифровать без ключа(т.е. Методом частотных анализа) - C#
Формулировка задачи:
Пишем код для шифровки и расшифровки по Цезарю. Дали задание: расшифровать без ключа(т.е. Методом частотных анализ)
Вот код, который решает мою проблему , но только для частного случая, когда буква "о" встречается в тексте больше чем количество других букв. Помогите реализовать для всех случаев.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace Cezar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
char[] bukv= "абвгдеёжзийклмнопрстуфхцчшщъыьэюя".ToCharArray();
string str = "";
string result="";
string result1 = "";
int shag = 0;
bool f=false;
public void shifr(string str, int shag)
{
for (int i = 0; i < str.Length; i++)
{
for (int j = 0; j < bukv.Length; j++)
{
if (str[i] == bukv[j])
{
if (j + shag > bukv.Length-1)
result += bukv[j + shag - bukv.Length];
else
result += bukv[j + shag];
f = true;
}
}
if (f==false) result += str[i];
f = false;
}
}
public void shifr1(string str, int shag)
{
for (int i = 0; i < str.Length; i++)
{
for (int j = 0; j < bukv.Length; j++)
{
if (str[i] == bukv[j])
{
if (j - shag >= 0) result1 += bukv[j - shag];
else
{
result1 += bukv[j - shag + bukv.Length];
}
f = true;
}
}
if (f == false) result1 += str[i];
f = false;
}
}
public void shag_opredelitel(string str)
{
char[] stroka = new char[1];
int summ;
int summ_rezerv = 0;
for (int i = 0; i < str.Length; i++)
{
summ = 1;
for (int j = i + 1; j < str.Length; j++)
{
if (str[i] == str[j])
{
summ++;
}
}
if (summ > summ_rezerv)
{
stroka[0] = str[i];
summ_rezerv = summ;
}
}
for (int i = 0; i < bukv.Length; i++)
{
if (stroka[0] == bukv[i])
{
if (i == 15)
shag = 0;
if (i < 15)
shag = bukv.Length - 1 - i;
else shag = i - 15;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
string path = "1.txt";
using (StreamReader sr = new StreamReader(path))
{
str = "" + sr.ReadToEnd();
}
label1.Text = str; //начальный вид
shifr(str, 4);
label4.Text = result; //зашифрованный вид
shifr1(result, 4);
label5.Text = result1; //расшифрованный вид
result1 = "";
shag_opredelitel(result);
shifr1(result, shag);
label8.Text = result1; //расшифрованный вид "поиском"
}
}
}Решение задачи: «Расшифровать без ключа(т.е. Методом частотных анализа)»
textual
Листинг программы
var text = "ыфвпфывпывп"; var alphabet = Enumerable.Range(0, char.MaxValue).Select(c => (char)c).Where(c => Regex.IsMatch(c.ToString(), @"[а-яА-Я]")); var freq = alphabet.ToDictionary(a => a, a => (double)text.Count(c => c == a) / text.Length);