Задание Составьте программное обеспечение, реализующее алгоритм rsa. Исходные данные должны передаваться через файлы файл с открытым ключом, закрытым ключом и шифруемая информация.
Скачать 44.35 Kb.
|
Задание Составьте программное обеспечение, реализующее алгоритм 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). Сервер-приложение генерирует открытый и закрытый ключ. Клиент получает открытый ключ, с помощью которого зашифровывает исходное сообщение и передает шифрограмму на сервер. Сервер, используя свой секретный ключ, расшифровывает сообщение от клиента. Передача информации осуществляется при помощи сокетов. Листинг класса RSA using System; namespace Lab5Client { public class RSA { private readonly Random _rnd; public long P { get; private set; } public long Q { get; private set; } 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; } 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; } } } Выводы: в ходе проделанной работы был изучен алгоритм RSA и реализован в виде клиент-серверного приложения. В учебных целях производилась работа с небольшими числами (32 разряда), однако в качестве надежной системы шифрования можно рассматривать только RSA-ключи длиной 1024 бита и более. |