Расшифровать без ключа(т.е. Методом частотных анализа) - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д