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