Расшифровать без ключа(т.е. Методом частотных анализа) - C#

Узнай цену своей работы

Формулировка задачи:

Пишем код для шифровки и расшифровки по Цезарю. Дали задание: расшифровать без ключа(т.е. Методом частотных анализ) Вот код, который решает мою проблему , но только для частного случая, когда буква "о" встречается в тексте больше чем количество других букв. Помогите реализовать для всех случаев.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.IO;
  11. namespace Cezar
  12. {
  13. public partial class Form1 : Form
  14. {
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. }
  19. char[] bukv= "абвгдеёжзийклмнопрстуфхцчшщъыьэюя".ToCharArray();
  20. string str = "";
  21. string result="";
  22. string result1 = "";
  23. int shag = 0;
  24. bool f=false;
  25. public void shifr(string str, int shag)
  26. {
  27. for (int i = 0; i < str.Length; i++)
  28. {
  29. for (int j = 0; j < bukv.Length; j++)
  30. {
  31. if (str[i] == bukv[j])
  32. {
  33. if (j + shag > bukv.Length-1)
  34. result += bukv[j + shag - bukv.Length];
  35. else
  36. result += bukv[j + shag];
  37. f = true;
  38. }
  39. }
  40. if (f==false) result += str[i];
  41. f = false;
  42. }
  43. }
  44. public void shifr1(string str, int shag)
  45. {
  46. for (int i = 0; i < str.Length; i++)
  47. {
  48. for (int j = 0; j < bukv.Length; j++)
  49. {
  50. if (str[i] == bukv[j])
  51. {
  52. if (j - shag >= 0) result1 += bukv[j - shag];
  53. else
  54. {
  55. result1 += bukv[j - shag + bukv.Length];
  56. }
  57. f = true;
  58. }
  59. }
  60. if (f == false) result1 += str[i];
  61. f = false;
  62. }
  63. }
  64. public void shag_opredelitel(string str)
  65. {
  66. char[] stroka = new char[1];
  67. int summ;
  68. int summ_rezerv = 0;
  69. for (int i = 0; i < str.Length; i++)
  70. {
  71. summ = 1;
  72. for (int j = i + 1; j < str.Length; j++)
  73. {
  74. if (str[i] == str[j])
  75. {
  76. summ++;
  77. }
  78. }
  79. if (summ > summ_rezerv)
  80. {
  81. stroka[0] = str[i];
  82. summ_rezerv = summ;
  83. }
  84. }
  85. for (int i = 0; i < bukv.Length; i++)
  86. {
  87. if (stroka[0] == bukv[i])
  88. {
  89. if (i == 15)
  90. shag = 0;
  91. if (i < 15)
  92. shag = bukv.Length - 1 - i;
  93. else shag = i - 15;
  94. }
  95. }
  96. }
  97. private void button1_Click(object sender, EventArgs e)
  98. {
  99. string path = "1.txt";
  100. using (StreamReader sr = new StreamReader(path))
  101. {
  102. str = "" + sr.ReadToEnd();
  103. }
  104. label1.Text = str; //начальный вид
  105. shifr(str, 4);
  106. label4.Text = result; //зашифрованный вид
  107. shifr1(result, 4);
  108. label5.Text = result1; //расшифрованный вид
  109. result1 = "";
  110. shag_opredelitel(result);
  111. shifr1(result, shag);
  112. label8.Text = result1; //расшифрованный вид "поиском"
  113. }
  114. }
  115. }

Решение задачи: «Расшифровать без ключа(т.е. Методом частотных анализа)»

textual
Листинг программы
  1. var text = "ыфвпфывпывп";
  2. var alphabet = Enumerable.Range(0, char.MaxValue).Select(c => (char)c).Where(c => Regex.IsMatch(c.ToString(), @"[а-яА-Я]"));
  3. var freq = alphabet.ToDictionary(a => a, a => (double)text.Count(c => c == a) / text.Length);

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


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

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

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы