Файл: Лабораторная работа 1 Тема Алгоритм rsa Выполнили Молчанов А. Д. Пивоваров К. Д. Бакерина Е. И. Принял Хабаров А. Р.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2024

Просмотров: 120

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНОБРНАУКИ РОССИИФедеральное государственное бюджетное образовательное учреждениевысшего образования«Тверской государственный технический университет»(ТвГТУ)Кафедра ЭВМДисциплина «Методы и средства защиты информации»Лабораторная работа №1Тема: «Алгоритм RSA»Выполнили: Молчанов А.Д.Пивоваров К.Д.Бакерина Е.И. Принял: Хабаров А. Р.____________________Тверь, 2022

Оглавление


Цель работы 1

Теоретическая часть 1

Ход работы 3

Результат работы программы 3

Вывод 3
Цель работыРазработать программу, имитирующую шифрование и расшифрование по алгоритму RSA.Задачи

  1. Составить алгоритм программы, включающий в себя

  • алгоритм определения простоты числа;

  • алгоритм определения взаимной простоты двух чисел;

  • алгоритм возведения числа в степень по модулю.

  1. Написать программу по алгоритму;

  2. Получить результаты работы программы.
Теоретическая частьАлгоритм RSA (Rivest, Shamir и Adleman) основан на использовании двух ключей – открытого (публичного) и закрытого (секретного). Его криптостойкость основывается на сложности разложения на множители больших чисел, а именно - на исключительной трудности задачи определить секретный ключ на основании открытого, так как для этого потребуется решить задачу о существовании делителей целого числа. Наиболее криптостойкие системы используют 1024-битовые и большие числа.Суть алгоритма RSA:

  • Выбираются два очень больших простых числа p и q.

  • Рассчитывается .

  • Выбирается большое случайное число d, взаимно простое
    .

  • Определяется число , для которого выполняется условие .

  • В результате генерируются ключи: открытый и закрытый . Чтобы зашифровать данные необходимо:

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

  • Зашифровать текст как последовательность чисел по формуле .

  • Расшифровка с помощью секретного ключа по формуле .

Ход работыРисунок 1. Алгоритм проверки на простоту методом перебора делителей Рисунок 2. Алгоритм Евклида для нахождения НОД для определения взаимной простоты двух чиселРисунок 3. Алгоритм возведения в степень по модулю методом понижения порядкаРезультат работы программыРисунок 1. Запуск программыРисунок 2. Ввод текста, который нужно зашифроватьРисунок 3. Ввод простых чиселРисунок 11. Зашифрованная фразаРисунок 12. Расшифровка полученных значений в текстИсходный кодusing System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.Windows.Forms;using System.Numerics;namespace Laba1{public partial class Form1 : Form{char[] characters = new char[] {'#', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж','З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П','Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш','Щ', 'Ь', 'Ы', 'Ъ', 'Э', 'Ю', 'Я', ' ', '1','2', '3', '4', '5', '6', '7', '8', '9', '0' };public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Process.Start("in.txt");}//зашифроватьprivate void buttonEncode_Click(object sender, EventArgs e){if ((textBox_p.Text.Length > 0) && (textBox_q.Text.Length > 0)){long p = Convert.ToInt64(textBox_p.Text);long q = Convert.ToInt64(textBox_q.Text);if (ProstoeChislo(p) && ProstoeChislo(q)){string s = "";StreamReader sr = new StreamReader("in.txt");while (!sr.EndOfStream){s += sr.ReadLine();}sr.Close();s = s.ToUpper();long n = p * q;long m = (p - 1) * (q - 1);long d = Calculate_d(m);long e_ = Calculate_e(d, m);List result = RSA_Encode(s, e_, n);
StreamWriter sw = new StreamWriter("out1.txt");

foreach (string item in result)

sw.WriteLine(item);

sw.Close();
textBox_d.Text = d.ToString();

textBox_n.Text = n.ToString();
Process.Start("out1.txt");

}

else

MessageBox.Show("p или q - не простые числа!");

}

else

MessageBox.Show("Введите p и q!");

}

//расшифровать

private void buttonDecode_Click(object sender, EventArgs e)

{

if ((textBox_d.Text.Length > 0) && (textBox_n.Text.Length > 0))

{

long d = Convert.ToInt64(textBox_d.Text);

long n = Convert.ToInt64(textBox_n.Text);
List input = new List();
StreamReader sr = new StreamReader("out1.txt");
while (!sr.EndOfStream)

{

input.Add(sr.ReadLine());

}
sr.Close();
string result = RSA_Decode(input, d, n);
StreamWriter sw = new StreamWriter("out2.txt");

sw.WriteLine(result.ToLower());

sw.Close();
Process.Start("out2.txt");

}

else

MessageBox.Show("Введите секретный ключ!");

}

//проверка: простое ли число?

private bool ProstoeChislo(long n)

{

if (n < 2)

return false;
if (n == 2)

return true;
for (long i = 2; i < n; i++)

if (n % i == 0)

return false;
return true;

}

//зашифровать

private List RSA_Encode(string s, long e, long n)

{

List result = new List();
BigInteger chislo;
for (int i = 0; i < s.Length; i++)

{

int index = Array.IndexOf(characters, s[i]);
chislo = new BigInteger(index) + (i * characters.Length);

chislo = BigInteger.Pow(chislo, (int)e);
BigInteger n_ = new BigInteger((int)n);
chislo = chislo % n_;
result.Add(chislo.ToString());

}

return result;

}

//расшифровать

private string RSA_Decode(List input, long d, long n)

{

string result = "";
BigInteger chislo;
int i = 0;

foreach (string item in input)

{

chislo = new BigInteger(Convert.ToDouble(item));

chislo = BigInteger.Pow(chislo, (int)d);
BigInteger n_ = new BigInteger((int)n);
chislo = chislo % n_;
int index = Convert.ToInt32(chislo.ToString()) - (i * characters.Length);
result += characters[index].ToString();
i++;

}
return result;

}

//вычисление параметра d. d должен быть взаимно простым с m = (p - 1) * (q - 1)

private long Calculate_d(long m)

{

long d = m - 1;
for (long i = 2; i <= m; i++)

if ((m % i == 0) && (d % i == 0)) //если имеют общие делители

{

d--;

i = 1;

}

return d;

}

//вычисление параметра e

private long Calculate_e(long d, long m)

{

long e = d+1;

while (true)

{

if ((e * d) % m == 1)

break;

else

e++;

}

return e;

}

}

}

Вывод

Построена блок-схема алгоритма работы программы. Написан исходный код и показана работа программы.