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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы