Потребность хранить в тайне какую-либо информацию была у человека с давних времен. Т.е. информацию, которая, попав в руки недоброжелателей, потенциально может навредить или использоваться с корыстным умыслом. Например, если говорить о государственном уровне, то это сведения, составляющие государственную тайну, которые не должны попасть в руки третьих лиц, а значит необходимо хранить, передавать и уничтожать их, используя специальные средства. В прошлом, для хранения и передачи такой информации, использовалось шифрование. Примерами старых алгоритмов шифрования выступают: «шифр Цезаря», «шифр Виженера» и т.д. Но это старые и простые алгоритмы, со временем появлялись новые алгоритмы, которые стали сложнее и одновременно с этим эффективнее.
В настоящие время развитие вычислительной техники достигло небывалых высот. Сервера, настольные компьютеры, планшеты, смартфоны и многие другие средства вычислительной техники так плотно вошли в нашу жизнь, что стали её неотъемлемой частью. Они позволяют нам хранить огромные объемы данных и проводить невероятно большие вычисления за малый промежуток времени. Т.к. компьютеры являются средствами хранения информации и используются повсеместно, включая военные и государственные сферы, то возникает необходимость хранить и передавать её, используя различные средства защиты, например, шифрование.
Шифрование сегодня получило значительное развитие. Оно переросло в целую науку называемую «Криптографией». Криптография - это наука об обеспечении конфиденциальности (невозможности прочтения информации посторонним), целостности данных (невозможности незаметного изменения информации), аутентификации (проверки подлинности авторства или иных свойств объекта), а также невозможности отказа от авторства.
Алгоритмы шифрования за это время тоже сильно усложнились. Они стали делиться на две большие группы: симметричные (AES, ГОСТ, Blowfish, CAST, DES) и асимметричные (RSA, El-Gamal). Симметричные алгоритмы шифрования используют один ключ для зашифровывания информации и для ее расшифровывания, а асимметричные алгоритмы используют два ключа - один для зашифровывания, другой для расшифровывания. Все эти алгоритмы требует затраты времени и вычислительных мощностей в зависимости от различных факторов: объема шифруемой информации и алгоритма
шифрования.
В данной работе поставлена задача разработать клиент-серверное приложение шифрования файлов. Приложение должно представлять собой простой кластер, образующий единую распределенную вычислительную систему. Пользователь должен иметь возможность выбрать файл для зашифрования/расшифрования и выбрать один из предложенных алгоритмов для обработки. После чего процедура зашифрования/расшифрования
выполняется параллельно на нескольких клиентах. Распределение заданий по клиентам выполняет сервер. Также сервер собирает результаты работы в конечный файл. Таким образом, достигается распараллеливание процесса зашифрования/расшифрования. Это позволяет сократить общее время
обработки и снизить затраты на вычислительные ресурсы.
В данной работе было разработано клиент-серверное приложение, представляющий собой простой кластер, для шифрования файлов. Клиент и сервер образуют единую распределенную вычислительную систему. Сервер имеет интуитивно понятный графический интерфейс, в котором пользователь может указать файл для зашифрования/расшифрования. Для этого выбирается один из предложенных алгоритмов. После чего можно наблюдать за ходом выполнения работы. Клиент может подключаться к серверу, принимать от него задачу, выполнять параллельную обработку и отправлять результат обратно серверу.
Клиентская часть разрабатывалась с использованием объектноориентированного языка программирования C++. Язык удовлетворяет требованию многомодульности. За счет наличия классов повысилась наглядность и читаемость кода. Также средства языка позволили относительно просто создавать процессы и нити.
Серверная часть разрабатывалась с использованием объектноориентированного языка программирования C#, который также удовлетворяет требование многомодульности. Код, написанный на C#, имеет высокую наглядность и читаемость. Язык позволил легко создать графический интерфейс и реагировать на действия пользователя с помощью WinForms.
Взаимодействие клиента и сервера реализовано по протоколу TCP/IP. Для реализации использовалась библиотека Winsock, которая позволила организовать обмен информации через сокеты.
В дальнейшем приложение можно улучшить, добавив новые алгоритмы шифрования, в частности ассиметричные. Можно реализовать службу на машине клиента, которая будет отслеживать запросы от сервера. Как только на сервере установили задачу, сервер будет отправлять запрос службе. Она, в свою очередь, будет запускать клиентов с заданными настройками. В качестве настроек может выступать максимальная загрузка ЦП. Это позволит запускать
больше клиентов на одной машине, которые одновременно могу работать с несколькими серверными приложениями. Можно добавить для клиентского приложения очередь, которая будет содержать задачи для обработки. Длина этой очереди будет определяться в настройках для клиента. Также можно создать специальное приложение для отдельной ЭВМ. Оно будет выступать как связующий элемент между клиентским и серверным приложением. К нему будут подключены все доступные для работы клиенты. Сервер будет взаимодействовать не с клиентами, а с этим промежуточным звеном. За счет этого с пользователя снимается необходимость контроля над подключением клиентов. Он просто задает задачу, а сервер направляет подзадачи к промежуточной ЭВМ. Она в свою очередь распределяет задачи между имеющимися клиентами. Такая архитектура получается более гибкой и позволяет обслуживать одновременно несколько серверных приложений. В этом случаи удобно собирать статистику о работе клиентских машин с целью выявления потенциальных проблем и неполадок. Данная ЭВМ будет являться центральной частью, что делает её уязвимым местом. Поэтому необходимо либо организовать несколько таких узлов, работающих по определенному протоколу, либо использовать специальные средства для обеспечения надежности.
В ходе выполнения работы, были получены навыки разработки клиент- серверного приложения. Улучшены навыки разработки в среде MS Visual Studio 2015. Получен дополнительный опыт и расширены знания по языкам программирования C++ и C#. Улучшены навыки работы с сокетами.
MSDN https://msdn.microsoft.com/ru-ru
Страуструп Б. «Язык программирования C++». 2004 г., 369 стр.
Страуструп Б. «Программирование. Принципы и практика с использованием C++». 2016 г., 1328 стр.
Лафоре Р. «Объектно-ориентированное программирование в С++». 2004 г., 924 стр.
Харви и Пол Дейтелы «Как программировать на C++». 2006 г.,
1454 стр.
Джеффри Рихтер «CLR via C#. Программирование на платформе Microsoft.NET Framework 4.5 на языке C#». 2017 г., 896 стр.
Билл Вагнер «Наиболее эффективное программирование на C#. 50 способов улучшения кода». 2017 г., 240 стр.