1. 1 Основные понятия и определения криптографии 8 2 Симметричные и асимметричные криптосистемы 11
Скачать 193.57 Kb.
|
2.2 Реализация алгоритма на С#Создадим для разрабатываемой программы следующий интерфейс (рисунок 9). Рисунок 9. Пользовательский интерфейс программ На рисунках 10 и 11 представлена демонстрация работы написанной программы для шифрования алгоритмом DES. Рисунок 10. Демонстрация работы Рисунок 11. Входные и выходные данные Код программы представлен в листинге 1. Листинг 1 – Код программы using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace protect_inf_LR1 { public partial class Form1 : Form { private const int sizeOfBlock = 128; //в DES размер блока 64 бит, но поскольку в unicode символ в два раза длинее, то увеличим блок тоже в два раза private const int sizeOfChar = 16; //размер одного символа (in Unicode 16 bit) private const int shiftKey = 2; //сдвиг ключа private const int quantityOfRounds = 16; //количество раундов string[] Blocks; //сами блоки в двоичном формате public Form1() { InitializeComponent(); } //зашифровать private void buttonEncrypt_Click(object sender, EventArgs e) { if (textBoxEncodeKeyWord.Text.Length > 0) { string s = ""; string key = textBoxEncodeKeyWord.Text; StreamReader sr = new StreamReader("in.txt"); while (!sr.EndOfStream) { s += sr.ReadLine(); } sr.Close(); s = StringToRightLength(s); CutStringIntoBlocks(s); key = CorrectKeyWord(key, s.Length / (2 * Blocks.Length)); textBoxEncodeKeyWord.Text = key; key = StringToBinaryFormat(key); for (int j = 0; j < quantityOfRounds; j++) { for (int i = 0; i < Blocks.Length; i++) Blocks[i] = EncodeDES_One_Round(Blocks[i], key); key = KeyToNextRound(key); } key = KeyToPrevRound(key); textBoxDecodeKeyWord.Text = StringFromBinaryToNormalFormat(key); string result = ""; for (int i = 0; i < Blocks.Length; i++) result += Blocks[i]; StreamWriter sw = new StreamWriter("out1.txt"); sw.WriteLine(StringFromBinaryToNormalFormat(result)); sw.Close(); Process.Start("out1.txt"); } else MessageBox.Show("Введите ключевое слово!"); } //расшифровать private void buttonDecipher_Click(object sender, EventArgs e) { if (textBoxDecodeKeyWord.Text.Length > 0) { string s = ""; string key = StringToBinaryFormat(textBoxDecodeKeyWord.Text); StreamReader sr = new StreamReader("out1.txt"); while (!sr.EndOfStream) { s += sr.ReadLine(); } sr.Close(); s = StringToBinaryFormat(s); CutBinaryStringIntoBlocks(s); for (int j = 0; j < quantityOfRounds; j++) { for (int i = 0; i < Blocks.Length; i++) Blocks[i] = DecodeDES_One_Round(Blocks[i], key); key = KeyToPrevRound(key); } key = KeyToNextRound(key); textBoxEncodeKeyWord.Text = StringFromBinaryToNormalFormat(key); string result = ""; for (int i = 0; i < Blocks.Length; i++) result += Blocks[i]; StreamWriter sw = new StreamWriter("out2.txt"); sw.WriteLine(StringFromBinaryToNormalFormat(result)); sw.Close(); Process.Start("out2.txt"); } else MessageBox.Show("Введите ключевое слово!"); } //доводим строку до размера, чтобы делилась на sizeOfBlock private string StringToRightLength(string input) { while (((input.Length * sizeOfChar) % sizeOfBlock) != 0) input += "#"; return input; } //разбиение обычной строки на блоки private void CutStringIntoBlocks(string input) { Blocks = new string[(input.Length * sizeOfChar) / sizeOfBlock]; int lengthOfBlock = input.Length / Blocks.Length; for (int i = 0; i < Blocks.Length; i++) { Blocks[i] = input.Substring(i * lengthOfBlock, lengthOfBlock); Blocks[i] = StringToBinaryFormat(Blocks[i]); } } //разбиение двоичной строки на блоки private void CutBinaryStringIntoBlocks(string input) { Blocks = new string[input.Length / sizeOfBlock]; int lengthOfBlock = input.Length / Blocks.Length; for (int i = 0; i < Blocks.Length; i++) Blocks[i] = input.Substring(i * lengthOfBlock, lengthOfBlock); } //перевод строки в двоичный формат private string StringToBinaryFormat(string input) { string output = ""; for (int i = 0; i < input.Length; i++) { string char_binary = Convert.ToString(input[i], 2); while (char_binary.Length < sizeOfChar) char_binary = "0" + char_binary; output += char_binary; } return output; } //доводим длину ключа до нужной private string CorrectKeyWord(string input, int lengthKey) { if (input.Length > lengthKey) input = input.Substring(0, lengthKey); else while (input.Length < lengthKey) input = "0" + input; return input; } //шифрование DES один раунд private string EncodeDES_One_Round(string input, string key) { string L = input.Substring(0, input.Length / 2); string R = input.Substring(input.Length / 2, input.Length / 2); return (R + XOR(L, f(R, key))); } //расшифровка DES один раунд private string DecodeDES_One_Round(string input, string key) { string L = input.Substring(0, input.Length / 2); string R = input.Substring(input.Length / 2, input.Length / 2); return (XOR(f(L, key), R) + L); } //XOR двух строк с двоичными данными private string XOR(string s1, string s2) { string result = ""; for (int i = 0; i < s1.Length; i++) { bool a = Convert.ToBoolean(Convert.ToInt32(s1[i].ToString())); bool b = Convert.ToBoolean(Convert.ToInt32(s2[i].ToString())); if (a ^ b) result += "1"; else result += "0"; } return result; } //шифрующая функция f. в данном случае это XOR private string f(string s1, string s2) { return XOR(s1, s2); } //вычисление ключа для следующего раунда шифрования. циклический сдвиг >> 2 private string KeyToNextRound(string key) { for (int i = 0; i < shiftKey; i++) { key = key[key.Length - 1] + key; key = key.Remove(key.Length - 1); } return key; } //вычисление ключа для следующего раунда расшифровки. циклический сдвиг << 2 private string KeyToPrevRound(string key) { for (int i = 0; i < shiftKey; i++) { key = key + key[0]; key = key.Remove(0, 1); } return key; } //переводим строку с двоичными данными в символьный формат private string StringFromBinaryToNormalFormat(string input) { string output = ""; while (input.Length > 0) { string char_binary = input.Substring(0, sizeOfChar); input = input.Remove(0, sizeOfChar); int a = 0; int degree = char_binary.Length - 1; foreach (char c in char_binary) a += Convert.ToInt32(c.ToString()) * (int)Math.Pow(2, degree--); output += ((char)a).ToString(); } return output; } private void textBoxDecodeKeyWord_TextChanged(object sender, EventArgs e) { } } } ЗаключениеВ курсовой работе были рассмотрены несколько различных методов шифрования. Каждый из рассмотренных методов реализует собственный способ криптографической защиты информации и имеет собственные достоинства и недостатки, но их общей важнейшей характеристикой является стойкость. Под этим понимается минимальный объем зашифрованного текста, статистическим анализом которого можно вскрыть исходный текст. Таким образом, по стойкости шифра можно определить предельно допустимый объем информации, зашифрованной при использовании одного ключа. При выборе криптографического алгоритма для использования в конкретной разработке его стойкость является одним из определяющих факторов. Все современные криптосистемы спроектированы таким образом, чтобы не было пути вскрыть их более эффективным способом, чем полным перебором по всему ключевому пространству, т.е. по всем возможным значениям ключа. Ясно, что стойкость таких шифров определяется размером используемого в них ключа. Приведу оценки стойкости рассмотренных выше методов шифрования. Моноалфавитная подстановка является наименее стойким шифром, так как при ее использовании сохраняются все статистические закономерности исходного текста. Уже при длине в 20–30 символов указанные закономерности проявляются в такой степени, что, как правило, позволяет вскрыть исходный текст. Поэтому такое шифрование считается пригодным только для закрывания паролей, коротких сигнальных сообщений и отдельных знаков. Стойкость простой полиалфавитной подстановки (из подобных систем была рассмотрена подстановка по таблице Вижинера) оценивается значением 20n, где n – число различных алфавитов используемых для замены. При использовании таблицы Вижинера число различных алфавитов определяется числом букв в ключевом слове. Усложнение полиалфавитной подстановки существенно повышает ее стойкость. Стойкость гаммирования однозначно определяется длинной периода гаммы. В настоящее время реальным становится использование бесконечной гаммы, при использовании которой теоретически стойкость зашифрованного текста также будет бесконечной. Можно отметить, что для надежного закрытия больших массивов информации наиболее пригодны гаммирование и усложненные перестановки и подстановки. При использовании комбинированных методов шифрования стойкость шифра равна произведению стойкостей отдельных методов. Поэтому комбинированное шифрование является наиболее надежным способом криптографического закрытия. Именно такой метод был положен в основу работы всех известных в настоящее время шифрующих аппаратов. Алгоритм DES был утвержден еще долее 20 лет назад, однако за это время компьютеры сделали немыслимый скачок в скорости вычислений, и сейчас не так уж трудно сломать этот алгоритм путем полного перебора всех возможных вариантов ключей (а в DES используется всего 8-байтный), что недавно казалось совершенно невозможным. ГОСТ 28147–89 был разработан еще спецслужбами Советского Союза, и он моложе DES всего на 10 лет; при разработке в него был заложен такой запас прочности, что данный ГОСТ является актуальным до сих пор. Рассмотренные значения стойкости шифров являются потенциальными величинами. Они могут быть реализованы при строгом соблюдении правил использования криптографических средств защиты. Основными из этих правил являются: сохранение в тайне ключей, исключения дублирования (т.е. повторное шифрование одного и того же отрывка текста с использованием тех же ключей) и достаточно частая смена ключей. Список использованных источников1. Ю.В. Романец, П.А. Тимофеев, В.Ф. Шаньгин Защита информации в компьютерных системах и сетях: Радио и связь: Москва, 1999. – 328 с. 2. Брюс Шнайер, Прикладная криптография: БХВ-Питер: Санкт-Петербург, 2004. – 718 с. 3. Петров А.А. Компьютерная безопасность. Криптографические методы защиты. ДМК Москва, 2000 г. 4. «Методы и средства защиты информации» (курс лекций). Авторские права: Беляев А.В. (http://www.citforum.ru/internet/infsecure/index.shtml) 5. Криптография (http://www.citforum.ru/internet/securities/crypto.shtml) |