Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет Л3.docx
Скачиваний:
2
Добавлен:
18.07.2022
Размер:
39.62 Кб
Скачать

Код программы взлома:

private static readonly char[] _alphabet = { 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я' }; public Form1() { InitializeComponent(); } private static int CheckFirstKey(int k) { var x = 32; var y = k; while (x != y) { if (x > y) x -= y; else y -= x; } return x; } private static char[] Caesar(char[] alph, int a, int b) { char[] newAlph = new char[32]; for (int i = 0; i < 32; i++) { newAlph[i] = alph[(a * i + b) % 32]; } return newAlph; } private static string Decrypt(int a, int b, string s) { char[] newAlph = Caesar(_alphabet, a, b); string result = ""; foreach (char c in s) { if (c != ' ') for (int i = 0; i < 32; i++) { if (c == newAlph[i]) { result += _alphabet[i]; break; } } else result += ' '; } return result; } private static List<string> ReadFile(string filePath) { Regex rgx = new Regex("[^а-я ]"); string str = rgx.Replace(File.ReadAllText(filePath).ToLower(), ""); var array = str.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Distinct().ToList(); List<string> result = new List<string>(); foreach (var v in array) { if (v.Length > 3) result.Add(v); } return result; } private static int[] Break(string filePath) { List<string> dictionary = ReadFile("словарь.txt"); List<string> encryptedText = ReadFile(filePath); int count = 0; int half = 500; int key1 = 0; int key2 = 0; for (int i = 1; i < 32; i++) { if (CheckFirstKey(i) == 1) { for (int j = 1; j < 32; j++) { foreach (var v in encryptedText) { if (dictionary.Contains(Decrypt(i, j, v))) { count += 1; if (count == half) { key2 = j; key1 = i; break; } } } if (count == half) { break; } } if (count == half) { break; } } } int[] result = { key1, key2 }; return result; } private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Text files(*.txt)|*.txt"; if (openFileDialog.ShowDialog() == DialogResult.OK) { textBox1.Text = openFileDialog.FileName; } } private void button2_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Text files(*.txt)|*.txt"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { int[] keys = Break(textBox1.Text); int key1 = keys[0]; int key2 = keys[1]; Regex rgx = new Regex("[^а-я ]"); string s = rgx.Replace(File.ReadAllText(textBox1.Text).ToLower(), ""); File.WriteAllText(saveFileDialog.FileName, Decrypt(key1, key2, s)); MessageBox.Show(key1.ToString(), "Первый ключ"); MessageBox.Show(key2.ToString(), "Второй ключ"); } }

Вывод: используемый шифр не сложно взломать перебором или частотным анализом. Данный алгоритм слишком прост, его стоит использовать только для усложнения более комплексных алгоритмов шифрования. Алгоритм взлома довольно прост. При большом количестве данных процесс взлома может занять много времени.

Соседние файлы в предмете Информационная безопасность