StudyDocs.ru Logo

Lab1.docx


МІНІСТЕРСТВО НАУКИ І ОСВІТИ, МОЛОДІ ТА СПОРТУ УКРАЇНИЖитомирський державний технологічний університет

Факультет ІКТКафедра ПЗСГрупа ПІ-43М
Лабораторна робота №1Шифр Віжинера



Виконала: Скок К.О.


Перевірив: Крижанівський В.Б.




Житомир 2015


Завдання: Напишіть програму, яка дозволить вам «зламати» шифротекст, отриманий за допомогою шифру Віженера. В даному варіанті шифру Віженера замість додавання за модулем 26 використана операція побайтового XOR.Шифротекст (в hex-форматі):F96DE8C227A259C87EE1DA2AED57C93FE5DA36ED4EC87EF2C63AAE5B9A7EFFD673BE4ACF7BE8923CAB1ECE7AF2DA3DA44FCF7AE29235A24C963FF0DF3CA3599A70E5DA36BF1ECE77F8DC34BE129A6CF4D126BF5B9A7CFEDF3EB850D37CF0C63AA2509A76FF9227A55B9A6FE3D720A850D97AB1DD35ED5FCE6BF0D138A84CC931B1F121B44ECE70F6C032BD56C33FF9D320ED5CDF7AFF9226BE5BDE3FF7DD21ED56CF71F5C036A94D963FF8D473A351CE3FE5DA3CB84DDB71F5C17FED51DC3FE8D732BF4D963FF3C727ED4AC87EF5DB27A451D47EFD9230BF47CA6BFEC12ABE4ADF72E29224A84CDF3FF5D720A459D47AF59232A35A9A7AE7D33FB85FCE7AF5923AA31EDB3FF7D33ABF52C33FF0D673A551D93FFCD33DA35BC831B1F43CBF1EDF67F0DF23A15B963FE5DA36ED68D378F4DC36BF5B9A7AFFD121B44ECE76FEDC73BE5DD27AFCD773BA5FC93FE5DA3CB859D26BB1C63CED5CDF3FE2D730B84CDF3FF7DD21ED5ADF7CF0D636BE1EDB79E5D721ED57CE3FE6D320ED57D469F4DC27A85A963FF3C727ED49DF3FFFDD24ED55D470E69E73AC50DE3FE5DA3ABE1EDF67F4C030A44DDF3FF5D73EA250C96BE3D327A84D963FE5DA32B91ED36BB1D132A31ED87AB1D021A255DF71B1C436BF479A7AF0C13AA14794Крок 1. Знаходимо довжину ключа:// формуємо список списків з кожних і-х елементівList<List<int>> list = new List<List<int>>();List<double> resultList = new List<double>();for (int i = 2; i <= 20; i++){ // вибираємо кожен і-й елемент і додаємо його у список List<int> subList = new List<int>(); for (int j = 0; j < arrayCodeDec.Length; j += i) { subList.Add(arrayCodeDec[j]); } list.Add(subList); // рахуємо частоту зустрічаємості символів List<int> pList = new List<int>(); for (int j = 0; j < subList.Count; j++) { if (!pList.Contains(subList.ElementAt(j))) { pList.Add(subList.ElementAt(j)); } } double result = 0; for (int j = 0; j < pList.Count; j++) { double x = Convert.ToDouble(CountElementInList(subList, pList.ElementAt(j))); double y = Convert.ToDouble(subList.Count); result += Math.Pow((x / y), 2); } resultList.Add(result);}int key = resultList.IndexOf(resultList.Max()) + 2;Крок 2. Розшифровуємо повідомлення:// розшифровуємо текстint[] arrayKey = new int[14];// 1й елемент ключаtxbMessage.Text += "1\r\n";List<List<int>> temp = new List<List<int>>();for (int i = 0; i <= 255; i++){ if ((arrayCodeDec[0] ^ i) >= 65 && (arrayCodeDec[0] ^ i) <= 90) { List<int> subTemp = new List<int>(); for (int j = 0; j < arrayCodeDec.Length; j += key) subTemp.Add(arrayCodeDec[j] ^ i); temp.Add(subTemp); }}foreach(var el in temp){ bool x = el.All(elem => (elem >= 32 && elem <= 47) || (elem >= 65 && elem <= 90) || (elem >= 97 && elem <= 122)); if (x) WriteList(el);}arrayKey[0] = 186;for (int j = 0; j < arrayCodeDec.Length; j += key) txbMessage.Text += (char)(arrayCodeDec[j] ^ arrayKey[0]);txbMessage.Text += "\r\n";// 2й елемент ключаtxbMessage.Text += "2\r\n";temp = new List<List<int>>();for (int i = 0; i <= 255; i++){ if ((arrayCodeDec[1] ^ i) >= 97 && (arrayCodeDec[1] ^ i) <= 122 || (arrayCodeDec[1] ^ i) == 35) { List<int> subTemp = new List<int>(); for (int j = 1; j < arrayCodeDec.Length; j += key) subTemp.Add(arrayCodeDec[j] ^ i); temp.Add(subTemp); }}foreach (var el in temp){ bool x = el.All(elem => (elem >= 32 && elem <= 35) || (elem >= 39 && elem <= 41) || (elem >= 44 && elem <= 46) || (elem >= 65 && elem <= 90) || (elem >= 97 && elem <= 122)); if (x) WriteList(el);}arrayKey[1] = 31;for (int j = 1; j < arrayCodeDec.Length; j += key) txbMessage.Text += (char)(arrayCodeDec[j] ^ arrayKey[1]);txbMessage.Text += "\r\n";// Остаточний варыант ключаarrayKey = {186, 31, 145, 178, 83, 205, 62, 186, 31, 145, 178, 83, 205, 62};// виводимо розшифрований текстtxbMessage.Text = "";for (int i = 0; i < arrayCodeDec.Length; i += 0){ int j = 0; while (j < 14 && i < 470) { txbMessage.Text += (char)(arrayCodeDec[i++] ^ arrayKey[j]); j++; }}Розшифрований текст: Cryptography is the practice and study of techniques for, among other things, secure communication in the presence of attackers. Cryptography has been used for hundreds, if not thousands, of years, but traditional cryptosystems were designed and evaluated in a fairly ad hoc manner. For example, the Vigenere encryption scheme was thought to be secure for decades after it was invented, but we now know, and this exercise demonstrates, that it can be broken very easily.