За века своего существования человечество придумало множество способов хранения тайны. В Древнем Риме, например, чтобы тайно передать письмо, брили голову рабу, писали на коже сообщение, а потом, дождавшись, когда волосы отрастут, отправляли его к адресату. Примерами старых алгоритмов также выступают: «шифр Цезаря», «шифр Виженера» и т.д. Но это старые и простые алгоритмы, со временем появлялись новые алгоритмы, которые стали сложнее и одновременно с этим эффективнее. Необходимость шифрования данных получила актуальность и в годы войны.
Во время Первой Мировой Войны криптография использовалась в ведении боевых действий. Лидерами в этой области были Россия и Франция, но свои наработки имели и другие страны, в том числе Англия и Германия. Возможно, самым известным случаем применения является телеграмма Циммермана. Она была перехвачена и расшифрована британским криптографическим отделом “Комната №40”. Текст этой телеграммы позволил США обосновать объявление войны Германии и вступить в боевые действия на стороне союзников. В годы Второй мировой войны, немцы использовали шифровальную машину «Энигма» для шифровки/дешифровки передаваемых сообщений между частями вермахта, что позволило обеспечить продвижение Германии на первых этапах войны, однако в противовес Энигме, вскоре появилась другая дешифровальная машина «Bombe», которая смогла расшифровать передаваемые сообщения и обеспечить тем самым победу союзников в войне с Германией.
В 21 веке развитие вычислительной техники достигло небывалых высот. Появились настольные компьютеры, планшеты, смартфоны и многие другие средства вычислительной техники, которые так плотно вошли в нашу жизнь, что стали её неотъемлемой частью. Они позволяют нам хранить огромные объемы данных и проводить невероятно большие вычисления за малый промежуток времени. Т.к. компьютеры являются средствами хранения аинформации и используются повсеместно, включая военные и государственные сферы, то возникла и потребность в хранение и передачи её, используя различные средства защиты, например, шифрование.
В наше время шифрование получило значительное развитие. Появилась наука называемая «Криптографией». Криптография - это наука, изучающая способы сокрытия данных и обеспечения их конфиденциальности. Это одна из старейших наук и ее история насчитывает четыре тысячелетия.
За это время алгоритмы шифрования тоже сильно усложнились. Они разделились на две большие группы: симметричные (XOR, AES, ГОСТ, Blowfish, CAST, DES) и асимметричные (RSA, El-Gamal). Отличия между ними заключаются в том, что симметричные алгоритмы шифрования используют один ключ для зашифровывания информации и для ее дешифрования, а асимметричные алгоритмы используют два ключа - один для зашифровывания, другой для дешифрования. Все эти алгоритмы требует затраты времени и вычислительных мощностей в зависимости от различных факторов: объема шифруемой информации и алгоритма шифрования.
В данной работе мной была поставлена задача разработать клиент- серверное приложение шифрования данных. Приложение должно представлять собой единую распределенную вычислительную систему. Пользователь должен иметь возможность выбрать файл для шифрования/расшифрования и выбрать один из предложенных алгоритмов для обработки данных.
В данной работе было разработано клиент-серверное приложение, представляющий собой простой кластер, для шифрования файлов. Клиент и сервер образуют единую распределенную вычислительную систему. Сервер имеет интуитивно понятный графический интерфейс, в котором пользователь может выбирать алгоритм для зашифрования/расшифрования. После чего можно наблюдать за ходом выполнения работы. Клиент может подключаться к серверу, принимать от него задачу и отправлять результат обратно серверу.
Клиентская часть разрабатывалась с использованием объектно ориентированного языка программирования C#. Язык удовлетворяет требованию многомодульное™. За счет наличия классов повысилась наглядность и читаемость кода. Также средства языка позволили относительно просто создавать процессы и нити.
Серверная часть разрабатывалась с использованием объектно ориентированного языка программирования C#, который также удовлетворяет требование многомодульное™. Код, написанный на C#, имеет высокую наглядность и читаемость. Язык позволил легко создать графический интерфейс и реагировать на действия пользователя с помощью WinForms.
Взаимодействие клиента и сервера реализовано по протоколу TCP/IP. Для реализации использовалась библиотека Winsock, которая позволила организовать обмен информации через сокеты.
В дальнейшем приложение можно улучшить, добавив новые алгоритмы шифрования, в частности симметричные. Можно реализовать службу на машине клиента, которая будет отслеживать запросы от сервера. Как только на сервере установили задачу, сервер будет отправлять запрос службе. Она, в свою очередь, будет запускать клиентов с заданными настройками. В качестве настроек может выступать максимальная загрузка ЦП. Это позволит запускать больше клиентов на одной машине, которые одновременно могу работать с несколькими серверными приложениями. Можно добавить для клиентского приложения очередь, которая будет содержать задачи для обработки. Длина этой очереди будет определяться в настройках для клиента. Также можно создать специальное приложение для отдельной ЭВМ. Оно будет выступать как связующий элемент между клиентским и серверным приложением. К нему будут подключены все доступные для работы клиенты. Сервер будет взаимодействовать не с клиентами, а с этим промежуточным звеном. За счет этого с пользователя снимается необходимость контроля над подключением клиентов. Он просто задает задачу, а сервер направляет подзадачи к промежуточной ЭВМ. Она в свою очередь распределяет задачи между имеющимися клиентами. Такая архитектура получается более гибкой и позволяет обслуживать одновременно несколько серверных приложений. В этом случаи удобно собирать статистику о работе клиентских машин с целью выявления потенциальных проблем и неполадок. Данная ЭВМ будет являться центральной частью, что делает её уязвимым местом. Поэтому необходимо либо организовать несколько таких узлов, работающих по определенному протоколу, либо использовать специальные средства для обеспечения надежности.
В ходе выполнения работы, были получены навыки разработки клиент серверного приложения. Улучшены навыки разработки в среде MS Visual Studio 2019. Получен дополнительный опыт и расширены знания по языку C#. Улучшены навыки работы с сокетами.
1. Троелсен, Э. Язык программирования С# 5.0 и платформа .NET 4.5 / Э. Троелсен; Пер. с англ. Ю.Н. Артеменко. — М.: Вильямс, 2016. — 1312 стр.
2. Страуструп Б. «Программирование. Принципы и практика с использованием C#». 2016 г., 1328 стр.
3. Харви и Пол Дейтелы «Как программировать на C#». 2006 г., 1454 стр.
4. Хейлсберг, А. Язык программирования C#. Классика Computers Science / А. Хейлсберг, М. Торгерсен, С. Вилтамут. — СПб.: Питер, 2016. — 784 c.
5. Билл Вагнер «Наиболее эффективное программирование на C#. 50 способов улучшения кода». 2017 г., 240 стр.
6. Ишкова Э. А. Самоучитель С#. Начала программирования; Наука и техника - М., 2013. - 496 c.
7. Албахари Джозеф , Албахари Бен C# 6.0. Справочник. Полное описание языка; Вильямс - М., 2016. - 623 c.