Задание на программу:
Необходимо разработать программное решение, которое представляет из себя клиент-серверное приложение с возможностью обмена сообщениями в зашифрованном виде, используя RSA-шифрование.
Описание программы:
Разработанный сетевой чат представляет из себя клиент-серверное приложение, в котором:
- Клиент: WPF/MVVM - приложение на языке C# с элементом RSA-шифрования;
- Сервер: консольное приложение на .NET Framework;RSA шифрование реализовано вручную.
Для шифрования символа выбирается его номер из таблицы текущей кодировки (UTF-8/ASCII) в приложении.
Содержание отчёта (10 страниц):
1 Постановка задачи |
2 Исходные данные |
2.1 Клиент |
2.2 Сервер |
3 Особые ситуации |
3.1 Ограничения на использования программы (уникальность данных) |
3.2 Процесс обмена ключевой информацией |
3.3 Инсталяция программы (нет необходимости) |
3.4 Запуск программы |
4 Математические методы и алгоритмы решения задач |
5 Форматы представления данных |
6 Структура проекта |
7 Результаты работы программы |
8 Исходный текст программы |
Содержание архива:
- папка с исходным проектом в Visual Studio 2019 (подойдёт Visual Studio 2012 и выше);
- папка только с исполняемыми файлами для удобства;
- отчёт по программе.
Дополнительно:
- Чтобы запустить сервер не на стандартных настройках, необходимо запустить сервер через командную строку и передать в качестве параметров IP и порт:
- Для демонстрации в университете можно просто узнать IPv4 компьютера (Сетевые подключения -> Ethernet -> Сведения), на котором будет запущен сервер и запустить его с этим IP, а в приложениях-клиентах указать IP и порт выбранный ранее.
Фрагмент программного кода:
using System; using System.Collections.Generic; using System.Numerics; using System.Text; namespace Encrypted { public class RSA { /// Проверка готовности ключей и шифрование public string[] Encrypt(string text, long publicE, long publicN) { if (!_isReady) throw new ArgumentException("Method Initialize not called"); return Encode(text, publicE, publicN); } /// Проверка наличия установленных ключей и дешифрирование public string Decrypt(string[] data) { if (!_isReady) throw new ArgumentException("Method Initialize not called"); return Decode(data, local_D, n); } /// Шифрование методом RSA private string[] Encode(string text, long e, long n) { var data = new List<string>(); BigInteger num; foreach (var ch in text) { int index = ch; num = BigInteger.ModPow(index, e, n); data.Add(num.ToString()); } return data.ToArray(); } /// Дешифрирование методом RSA private string Decode(string[] data, long d, long n) { var strBuilder = new StringBuilder(); BigInteger num; foreach (var item in data) { var val = new BigInteger(Convert.ToInt64(item)); num = BigInteger.ModPow(val, d, n); strBuilder.Append((char)num); } return strBuilder.ToString(); } /// Получить свой приватный ключ private long GetPrivatePartKey(long fi, long e) { long d = e + 1; while (true) { if ((d * e) % fi == 1) break; d++; } return d; } /// Получить свой публичный ключ для обмена private long GetPublicPartKey(long fi) { long e = fi - 1; while (true) { if (PrimeNumberGenerator.IsPrime(e) && e < fi && BigInteger.GreatestCommonDivisor(new BigInteger(e), new BigInteger(fi)) == BigInteger.One) break; e--; } return e; } } }
kostyaLem