Лабороторная работа №5x

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт
Кафедра
Кибернетики
Оптимизации систем управления
Шифр RSA
Отчёт по лабораторной работе №5
по дисциплине " Информационная безопасность и защита информации в
сетях ЭВМ"
Вариант 3
Выполнил:
студент гр. 8ВМ23
Проверил:
ассистент
____________
(подпись)
____________
(дата)
М.А. Грицина
____________
Ф.А. Тузовский
(подпись)
____________
(дата)
Томск – 2012
Задание
Составьте программное обеспечение, реализующее алгоритм RSA.
Исходные данные должны передаваться через файлы: файл с открытым
ключом, закрытым ключом и шифруемая информация. Для созданного
программного обеспечения проведите тестирование не менее чем на 10
различных наборах данных.
Теория
RSA относится к так называемым асимметричным алгоритмам, у
которых ключ шифрования не совпадает с ключом дешифровки. Один из
ключей доступен всем и называется открытым ключом, другой хранится
только у его хозяина и неизвестен никому другому. С помощью одного
ключа можно производить операции только в одну сторону. Если сообщение
зашифровано с помощью одного ключа, то расшифровать его можно только с
помощью другого. Имея один из ключей невозможно (очень сложно) найти
другой ключ, если разрядность ключа высока.
Алгоритм 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 = 𝑎𝑒 (mod n)
Дешифровка: a = 𝑏 𝑑 (mod n)
Следует также отметить, что ключи e и d равноправны, т.е. сообщение
можно шифровать как ключом e, так и ключом d, при этом расшифровка
должна быть произведена с помощью другого ключа.
Ход работы
Алгоритм реализован в виде клиент-серверного приложения (рис. 1 и
2). Сервер-приложение генерирует открытый и закрытый ключ. Клиент
получает открытый ключ, с помощью которого зашифровывает исходное
сообщение и передает шифрограмму на сервер. Сервер, используя свой
секретный ключ, расшифровывает сообщение от клиента.
Передача информации осуществляется при помощи сокетов.
Рис.1. Внешний вид клиент-приложения
Рис.2. Внешний вид серверприложения
Листинг класса RSA
using System;
namespace Lab5Client
{
public class RSA
{
private readonly Random _rnd;
public long P { get; private set; }
public long Q { get; private set; }
3
public long N { get; set; }
public long FN { get; private set; }
public long D { get; private set; }
public long E { get; set; }
public RSA()
{
_rnd = new Random();
}
public void generatePQ()
{
P = Prime32();
Q = Prime32();
N = P * Q;
FN = (P - 1) * (Q - 1);
}
public void generateED()
{
Int64 x, y;
D = _rnd.Next(100000);
while (gcd(D, FN, out x, out y) != 1)
{
D = _rnd.Next(100000);
}
E = (x % FN + FN) % FN;
}
public string Encryption(string text)
{
int i;
var buffer = new Int64[text.Length];
string text2 = "";
for (i = 0; i < text.Length; i++)
{
buffer[i] = powmod(Convert.ToInt32(text[i]), E, N);
text2 += buffer[i];
text2 += ' ';
}
return text2;
}
public string Decryption(string text)
{
int i;
string[] words = text.Split(' ');
string text2 = "";
for (i = 0; i < words.Length - 1; i++)
{
char s = Convert.ToChar(powmod(Convert.ToInt32(words[i]), D, N));
text2 += s;
}
return text2;
}
4
public Int64 gcd(Int64 a, Int64 b, out Int64 x, out Int64 y)
{
if (a == 0)
{
x = 0;
y = 1;
return b;
}
Int64 x1, y1;
Int64 d = gcd(b % a, a, out x1, out y1);
x = y1 - (b / a) * x1;
y = x1;
return d;
}
public Int64 Prime32()
{
var pr = (Int64)_rnd.Next(100, 1000) * 2 + 1;
var isprime = false;
while (!isprime)
{
isprime = true;
var ub = (Int64)Math.Sqrt(pr);
int i;
for (i = 3; i <= ub; i += 2)
{
if ((pr % i) == 0)
{
isprime = false;
break;
}
}
if (!isprime)
{
pr += 2;
}
}
return pr;
}
public Int64 powmod(int a1, Int64 b, Int64 p)
{
Int64 res = 1;
Int64 a = a1;
while (b > 0)
if (b % 2 == 1)
{
res = (res * a) % p;
--b;
}
else
{
a = (a * a) % p;
b >>= 1;
}
return res % p;
}
}
}
5
Выводы: в ходе проделанной работы был изучен алгоритм RSA и
реализован в виде клиент-серверного приложения. В учебных целях
производилась работа с небольшими числами (32 разряда), однако в качестве
надежной системы шифрования можно рассматривать только RSA-ключи
длиной 1024 бита и более.
6
Download