ТЕОРЕТИЧЕСКИЕ МАТЕРИАЛЫ
См. C# 7.0. Справочник. Полное описание языка | Албахари Бен, Албахари Джозеф:
- Глава 16. Взаимодействие с сетью
- Глава 21. Безопасность
ПРАКТИЧЕСКИЕ ЗАДАНИЯ
Работа 1. Протестировать приложение Multi-Client/Server GUI Application, описать какие ошибки возникают в ходе работы с приложением и устранить найденные ошибки.
Работа 2. Разработать клиент-серверные консольные приложения с использованием языка программирования C#, обеспечивающие защищенную передачу данных от клиента к серверу. При этом
– в качестве алгоритма шифрования следует выбрать AES;
– открытые данные должны вводиться пользователем в консоли клиентского приложения и передаваться серверу в зашифрованном виде;
– принятые закрытые данные и результат их расшифрования сервером должны отображаться в консоли серверного приложения.
Для выполнения задания рекомендуется ознакомиться с примерами исходных кодов серверного и клиентского приложений на базе алгоритма шифрования DES:
Сервер:
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;namespace Server
{
static class Program
{
static void Main(string[] args)
{
byte[] bytesRecv = new byte[4096];
TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001);
listener.Start();
Socket tc = listener.AcceptSocket();//Получение
tc.Receive(bytesRecv);
string msg = Encoding.Unicode.GetString(bytesRecv);
Console.WriteLine(msg.Remove(msg.IndexOf('\0')).Decrypt());//Отправка
tc.Send(Encoding.Unicode.GetBytes(Crypt("Secret message from server.")));tc.Close();
}private static byte[] key = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };
private static byte[] iv = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };public static string Crypt(this string text)
{
SymmetricAlgorithm algorithm = DES.Create();
ICryptoTransform transform = algorithm.CreateEncryptor(key, iv);
byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
return Encoding.Unicode.GetString(outputBuffer);
}public static string Decrypt(this string text)
{
SymmetricAlgorithm algorithm = DES.Create();
ICryptoTransform transform = algorithm.CreateDecryptor(key, iv);
byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
return Encoding.Unicode.GetString(outputBuffer);
}
}
}
Клиент:
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;namespace Client
{
static class Program
{
static void Main(string[] args)
{
byte[] bytesRecv = new byte[4096];
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect("127.0.0.1", 5001);//Отправка
client.Send(Encoding.Unicode.GetBytes(Crypt("Secret message from client.")));//Получение
client.Receive(bytesRecv);
string msg = Encoding.Unicode.GetString(bytesRecv);
Console.WriteLine(msg.Remove(msg.IndexOf('\0')).Decrypt());client.Close();
}private static byte[] key = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };
private static byte[] iv = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };public static string Crypt(this string text)
{
SymmetricAlgorithm algorithm = DES.Create();
ICryptoTransform transform = algorithm.CreateEncryptor(key, iv);
byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
return Encoding.Unicode.GetString(outputBuffer);
}public static string Decrypt(this string text)
{
SymmetricAlgorithm algorithm = DES.Create();
ICryptoTransform transform = algorithm.CreateDecryptor(key, iv);
byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
return Encoding.Unicode.GetString(outputBuffer);
}
}
}
Работа 3.
Развить решение первого задания, обеспечив передачу данных между клиентом и сервером по защищенному каналу с использованием криптографического алгоритма AES.
Работа 4.
Разработать многопоточную программу выявления пароля пользователя user-x@mail.ru сайта http://www.bookland.com, применив атаку методом «грубой силы», для определения списка товаров в корзине пользователя.
При этом имеются следующие ограничения на пароль:
− длина пароля – не более 5 символов;
− множество символов пароля составляют строчные буквы английского алфавита и цифры.
Для выполнения работы рекомендуется руководствоваться указаниями из источников:
− C# 7.0. Справочник. Полное описание языка | Албахари Бен, Албахари Джозеф Глава 16. Взаимодействие с сетью
− [+] Аутентификация на основе форм на языке программирования C#