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

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

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

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

Добавлен: 12.01.2024

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

Скачиваний: 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;

}

}

}

Вывод

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