Реализация протоколов распределения и согласования ключей

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Криптография
  • 39 39 страниц
  • 0 + 0 источников
  • Добавлена 28.05.2018
1 000 руб.
  • Содержание
  • Часть работы
  • Список литературы
  • Вопросы/Ответы
Оглавление
Цель работы 3
Глава I. Теоретическая часть 4
1.1. Протокол Диффи-Хеллмана 4
1.2. Протокол MTI 4
1.3. Протокол STS 5
Глава II. Разработка протоколов 7
2.1. Создание класса протокола Диффи-Хеллмана 7
2.2. Создание класса протокола MTI 9
2.3. Создание класса протокола STS 12
Глава III. Тестирование приложения 16
3.1. Тестирование протокола Диффи-Хеллмана 16
3.2. Тестирование протокола MTI 19
3.3. Тестирование протокола STS 22
Заключение 26
Приложение 27
Класс протокола Диффи-Хеллмана: 27
Класс протокола MTI: 29
Класс протокола STS: 32
Класс для криптографических преобразований Crypt: 36
Класс тестирования Test: 39









Фрагмент для ознакомления

Aes_Decrypt(Cyp, key, iv);if (b_hash == Crypt.Md5_Hash(this.Ka.ToString())){returnb_hash; }elsereturn "!Не верная подпись"; } ///

Алиса делает цифровую подпись по ключу, шифрует ее и отправляет бобуpublic void Step_6_Alice_Hash_And_Encrypt(out byte[] Cyp, out byte[] IV) {string Sig = Crypt.Md5_Hash(this.Ka.ToString());byte[] key = Crypt.Get_Key(this.Ka); byte[] iv = Crypt.Get_IV_2(this.Ka); //генерируем другой вектор, чтобы сообщение не повторялосьbyte[] cyp = Crypt.Aes_Encrypt(Sig, key, iv); Cyp = cyp;IV = iv; } /// Боб дешифрует подпись, проверяет, если подписи равны то протокол прошел успешноpublic string Step_7_Bob_Decrypt(byte[] Cyp, byte[] iv) {byte[] key = Crypt.Get_Key(this.Kb);string a_hash = Crypt.Aes_Decrypt(Cyp, key, iv);if (a_hash == Crypt.Md5_Hash(this.Kb.ToString())) {return a_hash; }else return "!Не верная подпись";} }Класс для криптографических преобразований Crypt:public class Crypt {public static byte[] Aes_Encrypt(string plainText, byte[] Key, byte[] IV) {if (plainText == null || plainText.Length <= 0)throw new ArgumentNullException("plainText");if (Key == null || Key.Length <= 0)throw new ArgumentNullException("Key");if (IV == null || IV.Length <= 0)throw new ArgumentNullException("IV");byte[] encrypted;using (RijndaelManaged rijAlg = new RijndaelManaged()) { rijAlg.Key = Key; rijAlg.IV = IV; ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);using (MemoryStream msEncrypt = new MemoryStream()) {using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) {swEncrypt.Write(plainText); }encrypted = msEncrypt.ToArray(); } } }return encrypted; }public static string Aes_Decrypt(byte[] cipherText, byte[] Key, byte[] IV) {if (cipherText == null || cipherText.Length <= 0)throw new ArgumentNullException("cipherText");if (Key == null || Key.Length <= 0)throw new ArgumentNullException("Key");if (IV == null || IV.Length <= 0)throw new ArgumentNullException("IV");string plaintext = null;using (RijndaelManaged rijAlg = new RijndaelManaged()) { rijAlg.Key = Key; rijAlg.IV = IV;using (MemoryStream ms = new MemoryStream()) { CryptoStream cs = new CryptoStream(ms, rijAlg.CreateDecryptor(), CryptoStreamMode.Write);cs.Write(cipherText, 0, cipherText.Length);cs.Close();plaintext = Encoding.Default.GetString(ms.ToArray());ms.Close(); } }return plaintext; }public static string Md5_Hash(string some_Str) {byte[] hash = Encoding.ASCII.GetBytes(some_Str); MD5 md5 = new MD5CryptoServiceProvider();byte[] hashenc = md5.ComputeHash(hash);string result = "";foreach (var b in hashenc) {result += b.ToString("x2"); }return result; }public static byte[] Get_Key(BigInteger Key) {return Encoding.Default.GetBytes(Crypt.Md5_Hash(Key.ToString())); }public static byte[] Get_IV(BigInteger Key) { Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(Crypt.Md5_Hash(Key.ToString()), new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });return pdb.GetBytes(16); }public static byte[] Get_IV_2(BigInteger Key) { Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(Crypt.Md5_Hash(Key.ToString()), new byte[] { 0x45, 0x71, 0x62, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });return pdb.GetBytes(16); }Класстестирования Test:public static void DefHol(RichTextBox OutAlice, RichTextBox OutBob, RichTextBox Eva, RichTextBox Res) { OutAlice.Text = ""; OutBob.Text = ""; Eva.Text = ""; Res.Text = ""; Protocol_DeffiHolman alica = new Protocol_DeffiHolman(103, 109); //Алиса создает экземпляр класса Protocol_DeffiHolman bob = new Protocol_DeffiHolman(103, 109); //Боб создает экземпляр класса BigInteger Ac = alica.Step_1_Alica_Calc_A(); OutAlice.Text += "* 1 Этап Алиса создает сообщение A = " + Ac.ToString() + " .и отправляет Бобу \n";Eva.Text += "Ева прослушивает сообщение и получает А = " + Ac.ToString() + "\n";OutBob.Text += "* 1 Этап Боб получает А = " + Ac.ToString() + "\n";BigInteger Bc = bob.Step_1_Bob_Calc_B(); OutBob.Text += " *1 Этап Боб создает сообщение B = " + Bc.ToString() + " .и отправляет Алисе \n";Eva.Text += "* Ева прослушивает сообщение и получает B = " + Bc.ToString() + "\n";OutAlice.Text += "* 1 Этап Алиса получает B = " + Bc.ToString() + "\n";alica.Step_2_Alica_Calc_Ka(Bc); OutAlice.Text += "* 2 Этап Алиса на основании своего числа а и полученного по сети B вычисляет: Ka = " + alica.Ka.ToString() + "\n";bob.Step_2_Bob_Calc_Kb(Ac); OutBob.Text += "*2 Этап Боб на основании своего числа b и полученного по сети A вычисляет: Kb = " + bob.Kb.ToString() + "\n";if (alica.Ka == bob.Kb) { Res.Text += "Протокол прошел успешно K = " + alica.Ka.ToString() + " = " + bob.Kb.ToString() + "\n"; }else { Res.Text += "Ошибка! ключи не равны K = " + alica.Ka.ToString() + " = " + bob.Kb.ToString() + "\n"; } }public static void MTI(RichTextBox OutAlice, RichTextBox OutBob, RichTextBox Eva, RichTextBox Res) { OutAlice.Text = ""; OutBob.Text = ""; Eva.Text = ""; Res.Text = ""; Protocol_MTI Alica = new Protocol_MTI(103, 109, 5, 3); Protocol_MTI Bob = new Protocol_MTI(103, 109, 5, 3); Res.Text += "g = " + Alica.g.ToString() + "\n"; Res.Text += "p = " + Alica.p.ToString() + "\n"; Res.Text += "a = " + Alica.a.ToString() + "\n"; Res.Text += "b = " + Bob.b.ToString() + "\n"; Res.Text += "Алиса и Боб обладают долговременной парой ключей, состоящей из секретного ключа расшифрования SK и открытого ключа шифрования PK: \n";Res.Text += "SKa = " + Alica.SKa.ToString() + "\n"; Res.Text += "SKb = " + Bob.SKb.ToString() + "\n"; Res.Text += "PKa = " + Alica.PKa.ToString() + "\n"; Res.Text += "PKb = " + Bob.PKb.ToString() + "\n"; BigInteger Amti = Alica.Step_1_Alica_Calc_A(); OutAlice.Text += "*1 Этап Алиса генерирует случайное число X = " + Alica.x.ToString() + " Создает сообщение A = " + Amti.ToString() + " и отправляет Бобу, а так же свой открытый ключ = " + Alica.PKa.ToString() + "\n"; Eva.Text += "*Ева прослушивает сообщение и получает A = " + Amti.ToString() + " и открытый ключ Pka = " + Alica.PKa.ToString() + "\n";BigInteger Bmti = Bob.Step_1_Bob_Calc_B(); OutBob.Text += "*1 Этап Боб генерирует случайное число Y = " + Bob.y.ToString() + " Создает сообщение B = " + Bmti.ToString() + " и отправляет Алисе, а так же свой открытый ключ = " + Bob.PKb.ToString() +"\n"; Eva.Text += "*Ева прослушивает сообщение и получает B = " + Bmti.ToString() + " и открытый ключ Pkb = " + Bob.PKb.ToString() + "\n";OutAlice.Text += "*1 Этап Алиса получает B = " + Bmti.ToString() + " и открытый ключ Pkb = " + Bob.PKb.ToString() + "\n";OutBob.Text += "*1 Этап Боб получает A = " + Amti.ToString() + " и открытый ключ Pka = " + Alica.PKa.ToString() + "\n";Alica.Step_2_Alice_Calc_Ka(Bmti, Bob.PKb); OutAlice.Text += "*2 Этап Алиса c помощью открытых данных высчитывает Ka = " + Alica.Ka.ToString() + "\n"; Bob.Step_2_Bob_Calc_Kb(Amti, Alica.PKa); OutBob.Text += "*2 Этап Боб c помощью своих открытых данных высчитывает Kb = " + Bob.Kb.ToString() + "\n";if (Alica.Ka == Bob.Kb) { Res.Text += "Протокол прошел успешно K = " + Alica.Ka.ToString() + " = " + Bob.Kb.ToString() + "\n"; }else { Res.Text += "Ошибка! ключи не равны K = " + Alica.Ka.ToString() + " = " + Bob.Kb.ToString() + "\n"; } }public static void STS(RichTextBox OutAlice, RichTextBox OutBob, RichTextBox Eva, RichTextBox Res) { OutAlice.Text = ""; OutBob.Text = ""; Eva.Text = ""; Res.Text = ""; Protocol_STS Alica = new Protocol_STS(103, 109); Protocol_STS Bob = new Protocol_STS(103, 109); Res.Text += "*1 ... *10 - последовательность действий" + "\n";Res.Text += "g = " + Alica.g.ToString() + "\n"; Res.Text += "p = " + Alica.p.ToString() + "\n"; BigInteger Am = Alica.Step_1_Alica_CreateMessage_Send(); OutAlice.Text += "*1 Алиса генерирует число X = " + Alica.x.ToString() + " и создает сообщение Ma = " + Am.ToString() + " и отправляет Бобу\n"; Eva.Text += "*2 Ева прослушивает сообщение и получает Ma = " + Am.ToString() + "\n";Bob.Step_2_Bob_GetKey(Am);//переменные отправляются Алисеbyte[] bob_iv; //Вектор инициализации для AESbyte[] bob_cyp; //Зашифрованное сообщениеBigIntegerBm; //BmBob.Step_3_Bob_Hash_And_Encrypt(out bob_cyp, out bob_iv, out Bm); OutBob.Text += "*3 Боб генерирует число Y = " + Bob.y.ToString() + "\nСоздает Mb = " + Bm.ToString() + "\nСоздает сеансовый ключ = " + Bob.Kb + "\nСоздает подпись на ключе и шифрует Ek = " + Convert.ToBase64String(bob_cyp) + "\nи отправляет Алисе c Mb" + "\n"; Eva.Text += "*4 Ева прослушивает сообщение и получает Mb = " + Bm.ToString() + " Ek = " + Convert.ToBase64String(bob_cyp) + "\n"; Alica.Step_4_Alice_GetKey(Bm); OutAlice.Text += "*5 Алиса таким же образом получает сенсовый ключ Ka = " + Alica.Ka.ToString() + "\n";string bob_h = Alica.Step_5_Alice_Decrypt(bob_cyp, bob_iv); OutAlice.Text += "*6 Алиса с помощью Ka рассшифровывает подпись = " + bob_h + "\n";if (bob_h == Crypt.Md5_Hash(Alica.Ka.ToString())){OutAlice.Text += "*7 Варификация прошла успешно \n"; }else {OutAlice.Text += "*Ошибка! Подпись не верна \n";}byte[] alice_iv;byte[] alice_cyp; Alica.Step_6_Alice_Hash_And_Encrypt(out alice_cyp, out alice_iv); OutAlice.Text += "*8 Алиса создает подпись и шифрует подпись Ek = " + Convert.ToBase64String(alice_cyp) + " Отправляет Бобу" + "\n"; Eva.Text += "*9 Ева прослушивает сообщение и получает Ek = " + Convert.ToBase64String(alice_cyp) + "\n"; //ConsoleOut.Text += "Подпись Алисы = " + + "\n"; OutBob.Text += "*10 Боб расшифровывает сообщение алисы и проверяет подпись" + "\n";string alice_h = Bob.Step_7_Bob_Decrypt(alice_cyp, alice_iv);if (alice_h == bob_h){Res.Text += "*Протокол прошел успешно подписи верны : " + alice_h + " = " + bob_h + "\n"; }else {Res.Text += "*Ошибка! Подпись не верна : " + alice_h + " != " + bob_h + "\n"; } } }

0

Вопрос-ответ:

Что такое протокол Диффи-Хеллмана?

Протокол Диффи-Хеллмана - это криптографический протокол, который позволяет двум сторонам безопасно согласовать общий секретный ключ по открытому каналу связи.

Как работает протокол MTI?

Протокол MTI (Menezes-Qu-Vanstone) - это протокол распределения ключей, основанный на математических проблемах криптографической безопасности. Он использует алгебраические кривые для обмена ключами и защиты от атак посредника.

Что такое протокол STS?

Протокол STS (Simple Two-Party Synchronous) - это протокол распределения ключей, который обеспечивает безопасный обмен ключевой информацией между двумя сторонами. Он основан на коммуникативных алгоритмах и шифровании.

Как создать класс протокола Диффи-Хеллмана?

Для создания класса протокола Диффи-Хеллмана нужно определить методы для генерации секретных ключей, шифрования и дешифрования сообщений, а также для обмена публичными ключами и вычисления общего секретного ключа.

Как происходит тестирование протокола STS?

Тестирование протокола STS включает проверку его корректности и безопасности. Для этого проводятся тесты на обмен ключами, шифрование сообщений и вычисление общего секретного ключа. Также проверяются возможные атаки и уязвимости протокола.

Для чего нужны протоколы распределения и согласования ключей?

Протоколы распределения и согласования ключей используются для обеспечения конфиденциальности и безопасности передачи данных в сети. Они позволяют двум или более сторонам выработать общий секретный ключ без его передачи по открытому каналу связи. Это позволяет защитить данные от несанкционированного доступа и обеспечить безопасность коммуникации.

Как работает протокол Диффи-Хеллмана?

Протокол Диффи-Хеллмана использует сложность задачи вычисления дискретного логарифма для создания общего секретного ключа между двумя сторонами. Обе стороны выбирают случайное число и вычисляют определенную математическую функцию от этого числа. Затем они обмениваются результатами вычислений и, с помощью своего секретного числа и полученного числа от другой стороны, вычисляют общий секретный ключ.

Что такое протокол MTI и как он работает?

Протокол MTI (Menezes-Qu-Vanstone Implicit Certificate Scheme) — это протокол распределения ключа, который использует алгоритм эллиптической кривой для выработки общего секретного ключа. Он основан на сложности задачи дискретного логарифма и обеспечивает высокую степень безопасности. Протокол MTI позволяет двум сторонам вычислить общий секретный ключ, используя открытый ключ другой стороны и свой личный секретный ключ.

Как работает протокол STS и для чего он используется?

Протокол STS (Station-to-Station Protocol) — это протокол согласования ключей, который обеспечивает аутентификацию и защиту данных между двумя сторонами. Он позволяет сторонам убедиться в том, что они общаются с правильным собеседником и создает общий секретный ключ для шифрования и дешифрования данных. Протокол STS использует криптографические функции для аутентификации и генерации общего секретного ключа.

Какие классы протоколов реализованы в данной работе?

В данной работе реализованы три класса протоколов: протокол Диффи-Хеллмана, протокол MTI и протокол STS. Каждый из этих классов отвечает за реализацию соответствующего протокола и содержит необходимые методы и функции для работы с ключами и обменом данными между сторонами.

Какие протоколы используются для распределения и согласования ключей?

В статье рассматриваются протоколы Диффи-Хеллмана, MTI и STS.