ТЕОРЕТИЧЕСКИЕ МАТЕРИАЛЫ

См. 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.
1) Разработать программу с применением класса HttpClient для аутентификации на форуме http://landwatersun.ru по логину/паролю – user/user.
2) Разработать многопоточную программу выявления пароля пользователя user-x полным перебором. При этом имеются следующие ограничения на пароль:
− длина пароля – не более 5 символов;
− множество символов пароля составляют буквы английского алфавита и цифры.
3) Разработать программу определения E-mail пользователя user-x посредством запроса к соответствующему полю профиля пользователя.
Для выполнения заданий рекомендуется руководствоваться указаниями из источников:
C# 7.0. Справочник. Полное описание языка (Д. Албахари, Б. Албахари) Глава 16. Взаимодействие с сетью
[+] Аутентификация на основе форм на языке программирования C#