У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 3 Тема работы- Асимметричный алгоритм шифрования RS Цель работы - Изучить принцип раб

Работа добавлена на сайт samzan.net: 2016-06-09

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 10.4.2025

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

3

8.050103.5151.14.03

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

3

8.050103.5151.14.03

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

1

8.050103.5151.14.03

Студент:

Паламарчук.Ю

Викладач:

Устенко І.В.

Блочные составные шифры. Сеть Фейстеля

Літ.

Аркушів

8

НУК ім. Адм. Макарова

Лабораторная работа № 3

Тема работы: Асимметричный алгоритм шифрования RSA

Цель работы : Изучить принцип работы асимметричных алгоритмов шифрования на примере алгоритма RSA. Освоить методику создания комбинированных алгоритмов шифрования, которые совмещают достоинства методов симметричной и асимметричной криптографии.

Задание :

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

I. Реализовать приложение для шифрования, позволяющее:

1. Вычислять открытый и закрытый ключи для алгоритма RSA:

1) числа и генерируются программой или задаются из файла;

2) числа и должны быть больше, чем;

3) сгенерированные ключи сохраняются в файлы: открытый ключ ( ) – в один файл, закрытый ( ) – в другой.

2. Шифровать указанным в варианте симметричным алгоритмом открытый текст, а асимметричным – ключ симметричного алгоритма:

1) шифруемый текст должен храниться в одном файле, открытый ключ ( ) для алгоритма RSA – в другом;

2) ключ для симметричного алгоритма должен генерироваться случайным образом;

3) зашифрованный текст должен сохраняться в одном файле, а зашифрованный асимметричным алгоритмом ключ симметричного алгоритма – в другом;

4) в процессе шифрования предусмотреть возможность просмотра и изменения шифруемого текста в шестнадцатеричном и символьном виде;

5) программа должна уметь работать с текстом произвольной длины.

II. Реализовать приложение для дешифрования.

1. Зашифрованный текст должен храниться в одном файле, зашифрованный ключ симметричного алгоритма – в другом, а секретный ключ для алгоритма RSA – в третьем. 3

2. Приложение расшифровывает зашифрованный ключ с помощью алгоритма RSA, а затем с помощью симметричного алгоритма с ключом расшифровывает зашифрованный текст.

3. Расшифрованный текст должен сохраняться в файл.

4. В процессе дешифрования предусмотреть возможность просмотра и изменения зашифрованного текста в шестнадцатеричном и символьном виде.

5. Программа должна уметь работать с текстом произвольной длины.

III. С помощью реализованных приложений выполнить следующие задания.

1. Протестировать правильность работы разработанных приложений.

2. Сделать выводы о проделанной работе.

Теоритические сведения:

Алгоритм RSA состоит из следующих пунктов:

Выбрать простые числа p и q

Вычислить n = p * q

Вычислить m = (p - 1) * (q - 1)

Выбрать число d взаимно простое с m

Выбрать число e так, чтобы e * d = 1 (mod m)

Числа e и d являются ключами RSA. Шифруемые данные необходимо разбить на блоки - числа от 0 до n - 1. Шифрование и дешифровка данных производятся следующим образом:

Шифрование: b = a^(mod n)

Дешифровка: a = b^d (mod n)

Следует также отметить, что ключи e и d равноправны, т.е. сообщение можно шифровать как ключом e, так и ключом d, при этом расшифровка должна быть произведена с помощью другого ключа.

Пример:

 Рисунок 1  - Пример работы RSA

Симметричные алгоритмы и, в частности, DES – быстрые, поэтому ими удобно шифровать большие объѐмы информации. Однако для передачи ключа симметричного алгоритма требуется надѐжный канал передачи, который очень часто отсутствует. Таким образом, преимущества таких алгоритмов сводятся на нет. С другой стороны, асимметричные алгоритмы не требуют секретного канала для передачи ключа, но на практике криптосистемы с открытым ключом используются для шифрования не сообщений, а ключей. На это есть две основные причины:

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

2. Алгоритмы шифрования с открытым ключом уязвимы по отношению к криптоаналитическим атакам со знанием открытого текста. Пусть ( ), где обозначает шифртекст, – открытый текст, – функцию шифрования. Тогда, если принимает значения из некоторого конечного множества, состоящего из открытых текстов, криптоаналитику достаточно зашифровать все эти тексты, используя известный ему открытый ключ, и сравнить результаты с. Ключ таким способом ему вскрыть не удастся, однако открытый текст будет успешно определѐн.

Возможно следующее решение: сообщение шифруется симметричным алгоритмом, что позволяет выиграть в скорости, т.к. сообщение может быть сколь угодно большим, а ключ симметричного алгоритма (обычно маленький, для DES – 64 бита) шифруется асимметричным алгоритмом.

Хід роботи:

Текст програми представлено в додатку А.

Результати роботи програми:

Рисунок 2 – Открываем программу Асимметричный алгоритм шифрования RSA

Рисунок 3 – Выбираем путь файла шифруемого текста

Вводим p и q как указано в примере 7 и 17, получаем ключи Открытый (5, 119) и закритий (77,119) как показано на рисунке – 4.

Рисунок 4 – Ввод P и Q 

Шифруем текст нажимаем на кнопку «Шифровать» как показано на рисунке 5.

Рисунок 5 – Шифрование текст

Расшифруем файл как показано на рисунке 6, Дешифрование успешно! Получаем текст исходного файла

Рисунок 6 – Дешифрование текста

Висновок: В ході цієї лабораторної роботи було створено програму, яка шифрує за допомогою асимметричного алгоритму шифруванния RSA, та отримав навички шифрування даних за допомогою асимметричного алгоритму шифруванния RSA.

Додаток А. Код програми

Form1.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace RSA

{

   public partial class Form1 : Form

   {   

     

       string Resurs, func = "";

       public long P, Q, D, E, M, N = 0;

       public long[] Texthight;       

   

       public Form1()

       {

           InitializeComponent();

           #region FileDialog Settings

           openFileDialog1.DefaultExt = "txt";

           openFileDialog1.Filter = "Текстовые документы|*.txt";

           openFileDialog1.Title = "Открыть документ";

           openFileDialog1.Multiselect = false;

           #endregion

       }

       private void Form1_Load(object sender, EventArgs e)

       {

       }

       private void OpenDocument()       // Функция открытия документа

       {

           openFileDialog1.FileName = string.Empty;

           if (openFileDialog1.ShowDialog() == DialogResult.OK)

           {

               func = openFileDialog1.FileName;

               Encoding enc = Encoding.GetEncoding(1251);

               try

               {

                   // Чтение файла

                   StreamReader sr = new StreamReader(func, enc); //Открывает поток для чтения файла

                   textBox2.Text = sr.ReadToEnd(); // Считываем документ до конца

                   textBox2.SelectionStart = textBox2.TextLength;

                   sr.Close(); // Закрываем поток

               }

               catch (Exception exc) // Отлавливаем ошибку

               {

                   MessageBox.Show("Ошибка чтения файла.\n"

                       + exc.ToString(), "Error!",

                       MessageBoxButtons.OK,

                       MessageBoxIcon.Error);

               }

           }

       }

       private void button2_Click(object sender, EventArgs e)

       {

           OpenDocument();

           label5.Text = Convert.ToString(textBox2.TextLength);

           label4.Visible = true;

       }

       // Наибольший общий делитель

       private static long gcd(long x, long y)

       {

           long g;

           g = y;

           while (x > 0) // Пока не равен 0

           {

               g = x;

               x = y % x;

               y = g;

           }

           return g;

       }

       // Проверка на взаимопростоту

       private static long MutuallySimple(long m)

       {

           Random rd = new Random(DateTime.Now.Millisecond);

           int tmp_d;

           long d = 0, check;

           bool quit = false;

           while (quit == false)

           {

               tmp_d = rd.Next(2, 100);

               d = Convert.ToInt64(tmp_d);

               check = gcd(m, d);

               if (check == 1) // Если = 1 то простое число

               {

                   quit = true;

               }

           }

           return d;

       }

       // Расширенный алгоритм Евклида

       private static long ExtGCD(long x, long y)

       {

           long a, b, q, r, u1, u2;

           long t;

           a = Convert.ToInt64(x);

           b = Convert.ToInt64(y);

           u1 = 1;

           u2 = 0;

           while (b != 0)

           {

               q = a / b;

               r = a % b;

               a = b; b = r;

               t = u2;

               u2 = u1 - q * u2;

               u1 = t;

           }

           return u1;

       }

       private void button1_Click(object sender, EventArgs e)

       {

            if (PTextBox.Text.Length == 0 && QTextBox.Text.Length == 0 )

           {

               MessageBox.Show("Введите значение P и Q!");           

               return;

           } else if (PTextBox.Text.Length == 0)

           {

               MessageBox.Show("Введите значение P!");

               return;

           }

           else if (QTextBox.Text.Length == 0)

           {

               MessageBox.Show("Введите значение Q!");

               return;

           }

           P = Convert.ToUInt32(PTextBox.Text);

           Q = Convert.ToUInt32(QTextBox.Text);

           N = P * Q;

           M = (P-1) * (Q-1);

           D = MutuallySimple(M);

           long tmp_E;

           tmp_E = ExtGCD(D, M);

           if (tmp_E <= 0)

           {

               while (tmp_E < 0)

               {

                   D = MutuallySimple(M);

                   tmp_E = ExtGCD(D, M);

               }

           }

           E = Convert.ToInt64(tmp_E);

           p_label.Text = "p = " + Convert.ToString(P);

           q_label.Text = "q = " + Convert.ToString(Q);

           e_label.Text = "e = " + Convert.ToString(E);

           d_label.Text = "d = " + Convert.ToString(D);

           n_label.Text = "n = " + Convert.ToString(N);

           m_label.Text = "m = " + Convert.ToString(M);

           label9.Text = "Открытый : (" + Convert.ToString(E) + ", " + Convert.ToString(N) + ") ";

           label10.Text = "Закрытый : (" + Convert.ToString(D) + ", " + Convert.ToString(N) + ") ";

       }

       private void button5_Click(object sender, EventArgs e)

       {

           p_label.Text = "0";

           q_label.Text = "0";

           n_label.Text = "0";

           m_label.Text = "0";

           d_label.Text = "0";

           e_label.Text = "0";

       }

       public struct Key

       {

           public long index;

           public long N;

           public Key(long lIndex, long lN)

           {

               index = lIndex;

               N = lN;

           }

       }

       public static long[] Process(long[] src_text, Key oKey)

       {

           long[] ciphertext = new long[src_text.Length];

           int length = src_text.Length;

           for (int i = 0; i < length; i++)

           {

               ciphertext[i] = ModularExponantiation(src_text[i], oKey);

           }

           return ciphertext;

       }

       public static long ModularExponantiation(long num, Key oKey)

       {

           long C = 1;

           long E = 0;

           while (E++ < oKey.index)

           {

               C = (C * num) % oKey.N;

           }

           return C;

       }

       private void button3_Click(object sender, EventArgs e)

       {

           Shifraciya shif = new Shifraciya();

          

           if (textBox2.Text.Length == 0)

           {

               MessageBox.Show("Нет текста для шифрации");

               return;

           }

           ResultTextBox.ResetText();

           textBox1.ResetText();

           Key publicKey = new Key(E, N);

           Resurs = textBox2.Text;

           Texthight = shif.Encode(Resurs, publicKey);

           for (int i = 0; i < Texthight.Length - 1; i++)

           {

               textBox1.Text += Convert.ToString(Convert.ToChar(Texthight[i]));

               ResultTextBox.Text += Texthight[i];

               ResultTextBox.Text += " ";

           }

           label8.Text = Convert.ToString(ResultTextBox.TextLength);

       }

       private void button4_Click(object sender, EventArgs e)

       {

           DeShifraciya deShif = new DeShifraciya();

           if (ResultTextBox.Text.Length == 0)

           {

               MessageBox.Show("Нет текста для дешифрации");

               return;

           }

           //ResultTextBox.ResetText();

           Key privateKey = new Key(D, N);

           textBox3.Text = deShif.Decode(Texthight, privateKey);

           label8.Text = Convert.ToString(ResultTextBox.TextLength);

           if (textBox2.Text ==  textBox3.Text)

           {

               label1.Visible = true;

               label1.Text = "Дешифрование успешно!";

               label1.ForeColor = Color.Green;

           }

           else

           {

               label1.Visible = true;

               label1.Text = "Дешифрование неудачно!";

               label1.ForeColor = Color.Red;

           }

       }

       private void textBox2_TextChanged(object sender, EventArgs e)

       {

           label5.Text = Convert.ToString(textBox2.TextLength);

       }

   }

}

Shifraciya.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace RSA

{

   class Shifraciya : Form1

   {

       public long[] Encode(string sMessage, Key oKey)

       {

           long[] numericMessage = new long[sMessage.Length];

           int length = sMessage.Length;

           for (int i = 0; i < length; i++)

           {

               numericMessage[i] = (long)sMessage[i];

           }

           return Process(numericMessage, oKey);

       }

   }

}

Deshifraciya.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace RSA

{

   class DeShifraciya : Form1

   {

       public string Decode(long[] numericMessage, Key oKey)

       {

           long[] processedMessage = Process(numericMessage, oKey);

           StringBuilder message = new StringBuilder();

           int length = processedMessage.Length;

           for (int i = 0; i < length; i++)

           {

               message.Append((char)processedMessage[i]);

           }

           return message.ToString();

      }

   }

}




1. Спектральні наземні дослідження
2. Контрольная работа даётся в десяти вариантах
3. реферату- Стратегія і планування в системі міжнародного менеджментуРозділ- Менеджмент Стратегія і планува
4. Похищение человека а также изменена редакция ст
5. теорией ума и мозга котор предлагает чтобы эксплуатационный принцип мозга был целостным параллельным и а
6. Ответы на экзаменационные билеты по высшей математики
7.  Историческая справка История существования предприятий в условиях свободного рынка в России достаточ
8. впадину расположенную кнутри от
9. Введение в индийскую философию
10. Лабораторная работа 2 Работа в текстовом редакторе Word Задание 1 Создайте в текстовом редакторе Word