МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Институт Кафедра Кибернетики Оптимизации систем управления Шифр 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; using System.Text; 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 textToByte = Encoding.Default.GetBytes(text); var encryption = ""; for (i = 0; i < textToByte.Length; i++) { encryption += powmod(textToByte[i], E, N); encryption += ' '; } return encryption; } public string Decryption(string text) { int i; var words = text.Split(' '); var decText = new byte[words.Length - 1]; for (i = 0; i < words.Length - 1; i++) { var s = Convert.ToByte(powmod(Convert.ToInt32(words[i]), D, N)); decText[i] = s; } return Encoding.Default.GetString(decText); } 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