Пояснительная записка (1191325), страница 6
Текст из файла (страница 6)
Данный класс представляет собой структуру клиентского запроса, который по сети посылается серверу. Данный класс содержит два поля для хранения зашифрованных полиномов, которые отправляются на вычисления, также – поле, в котором содержится операция, которую необходимо выполнить над полиномами.
В разработанном приложении перед передачей объекта клиентского запроса на сервер, используется метод бинарной сериализации, чтобы представить этот объект, как массив байт. Для осуществления процесса сериализации используются встроенные классы, такие как: BinaryFormatter и MemoryStream. Сначала с помощью класса BinaryFormatter выбранный объект записывается в поток MemoryStream, а затем этот поток преобразуется в массив байт, который является выходными данными функции сериализации.
Класс «ConnectionSettingsComponent»
Данный класс предназначен для хранения настроек соединения с сервером защищенных вычислений. В поле ipAddress данного класса хранится IP адрес сервера защищенных вычислений в формате IPv4, а в поле port – порт сервера. Оба эти поля могут быть доступны из других классов с помощью свойств conectionAddress и connectionPort. Также в данном классе имеется поле, в котором записан статус текущего соединения с сервером.
При проектировании этого класса было принято решение использовать паттерн проектирования Singleton (Одиночка). Это связано с тем, что класс данный класс содержит в себе некоторую конфигурацию, которая может понадобится в некоторых классах приложения. При использовании паттерна Singleton создается всего один объект класса такого типа, что экономит память и позволяет удобно обращаться к настройкам соединения.
Объект данного класса хранится в поле instance с атрибутом static, а получить ссылку на объект данного класса из объектов другого класса можно с помощью метода getInstance, логика которого заключается в следующем: если еще не создано ни одного, объекта данного класса, то при вызове метода в поле instance создается объект и возвращается ссылка на него, в том случае, если объект уже создан, то сразу возвращается ссылка на него.
Функционал данного класса также позволяет проверить статус соединения с сервером, а также сохранить пользовательские настройки соединения с сервером. При сохранении настроек происходит проверка правильности заполненных полей.
Класс «ConnectionSettingsForm»
Следующий класс предназначен для обработки событий, возникающих при работе с формой сохранения настроек соединения с сервером.
Класс «CustomBinder»
Данный класс используется при десериализации объектов класса ClientRequest и ServerResponse. Клиентское и серверное приложение могут обмениваться сериализованными объектами данных классов. При сериализации, как было описано выше, используется класс BinaryFormatter. Особенность работы данного класса заключается в том, что при сериализации объекта он сохраняет полное имя типа вместе с полным именем сборки. В таком случае, нужно обеспечить, чтобы в приложении, где будет проходить десериализация передаваемого объекта, были доступны типы из сборки, где они были сериализованы.
Клиентское и серверное приложение являются разными сборками и, чтобы гарантировать успешную десериализацию объектов, необходимо вынести их в отдельную библиотеку, для подключения в проектах. Было решено отказаться от данного решения и использовать следующий вариант. При десериализации полученного объекта изменяется свойство Binder объекта класса BinaryFormatter, в которое записывается ссылка на объект класса CustomBinder. Данный класс является наследником класса SerializationBinder и позволяет переопределять имя сборки во время процесса десериализации объекта. Данное решение было применено на основании того, что и клиентское и серверное приложение разрабатывалось одним разработчиком и он обеспечивает наличие идентичных классов ClientRequest и ServerResponse в двух приложениях.
Класс «FHEComponent»
Класс «FHEComponent» является основным классом приложения, который реализует в себе логику алгоритма гомоморфного шифрования на гомоморфизме колец полиномов. По аналогии с классом ConnectionSettingsComponent данный класс реализован с использованием паттерна проектирования Singleton. Особенности реализации данного паттерна в приложении можно посмотреть в описании класса ConnectionSettingsComponent.
С помощью данного класса можно осуществлять следующие операции:
-
генерация шифрующего полинома (метод getPolynom с тремя параметрами – степень полинома, максимальный и минимальный коэффициенты полинома);
-
сопоставление полинома операнду (метод getPolynom с четырьмя параметрами – добавляется параметр, в котором передается операнд, которому нужно сопоставить полином);
-
шифрование полинома (метод – getEncryptedPolynom);
-
дешифрование полинома (метод – decryptPolynom).
Класс «LoggerComponent»
Данный класс предназначен для вывода сообщений различного типа в лог приложения. В классе «LoggerComponent» имеется поле, которое содержит ссылку на объект класса MainForm, с помощью которого возможно осуществить доступ к элементу лога приложения. Вывод сообщения осуществляется с помощью метода write, который, в качестве входных параметров, принимает текст сообщения и тип сообщения (INFO, SUCCESS, ERROR).
Класс «MainForm»
Следующий класс предназначен для обработки событий, возникающих при работе с главным окном приложения. Также в данном классе реализованы методы обновления статистики при запуске процесса вычислений. Каждый процесс вычислений выполняется в отдельном потоке, что позволяет работать с программой даже в процессе выполнения вычислений.
Класс «NetTransferComponent»
Данный класс предназначен для обмена данными между клиентом и сервером. Для взаимодействия на сетевом уровне используется пространство имен System.Net.Sockets. Данное пространство имен содержит не только низкоуровневые классы, как Socket, но и классы высокого уровня TcpClient и TcpListener, которые реализуют простые интерфейсы для взаимодействия через TCP [10].
В отличие от класса Socket, при использовании которого для отправки и получения данных применяется побайтовый подход, классы TcpClient и TcpListener придерживаются потоковой модели. В этих классах взаимодействие между клиентом и сервером основано на потоке с использованием класса NetworkStream.
За отправку запроса на выполнение вычислений отвечает метод sendRequest. В этом методе для начала создается объект класса TcpClient, при создании которого используется конструктор типа TcpClient (string hostname, int port). Использование данного конструктора позволяет соединиться с удаленным хостом, всего лишь создав объект класса TcpClient. После этого данные, которые необходимо отправить, сериализуются и с использованием потока NetworkStream отправляются на сервер. Затем поток прослушивается до того момента, пока не будет получен ответ от сервера, после этого соединение закрывается, а полученные данные отправляются на дешифровку.
Класс «Polynom»
Данный класс используется для хранения в программном виде такой математической структуры как полином. Коэффициенты полинома хранятся в массиве элементов типа BigInteger, что обеспечивает удобную работу с полиномами.
В качестве функциональных особенностей класса можно выделить реализацию алгоритмов умножения и сложения полиномов, а также метод, который позволяет получить строку с удобочитаемым представлением полинома (например, x^2+3x+15).
Класс «ServerResponse»
Данный класс предназначен для хранения структуры ответа от сервера. В данном классе есть три поля в которых содержится следующая информация:
-
результирующий полином, который был получен в результате процесса вычислений на сервере;
-
флаг ошибки, который сигнализирует о том, что в процессе вычислений на сервере произошла ошибка;
-
время, которое потребовалось для выполнения вычислений в миллисекундах.
Помимо этого, в классе содержатся методы для сериализации и десериализации объектов данного класса. Данные процедуры были описаны при рассмотрении классов ClientRequest и CustomBinder.
-
Серверное приложение
-
Описание программы
Приложение FHEncryptionServer представляет собой серверную часть клиент-серверного программного обеспечения для тестирования алгоритмов защищенных облачных вычислений с использованием гомоморфного шифрования. Данное приложение может выполнять следующие задачи:
-
прослушивать порты на наличие входящих запросов на выполнение вычислений;
-
проводить, запрошенные клиентом, вычисления и отправлять результат вычислений клиенту.
-
Описание классов приложения
Серверное приложение FHEncryptionServer разрабатывалось с архитектурой схожей с клиентским приложением. Данное приложение состоит из десяти классов. На рисунке 4.2 представлена диаграмма классов серверного приложения, которая также получена в результате применения метода обратного проектирования [1].
Рисунок 4.2 Диаграмма классов серверного приложения
В связи со схожей архитектурой серверного и клиентского приложений, большинство классов серверного обладает тем же назначением и функционалом, как и их аналоги в клиентском приложении. Поэтому далее будут рассмотрены только отличия в реализации определенных классов.
Первое отличие находится в реализации класса FHEComponent. Так как на сервере должны выполняться операции над зашифрованными данными, без их дешифрования, в данном классе реализован только один метод, который отвечает за выполнение операций, запрошенных клиентом, над зашифрованными данными (метод executeOpeartion).
Также существует различие и в сетевом взаимодействии, в отличие от клиента, который открывает соединение, когда необходимо выполнить вычисления, сервер постоянно прослушивает входящий порт, который можно задать в процессе изменения настроек, на наличие входящих запросов. Для этого используется класс TcpListener. Сетевые настройки сервера хранятся в полях класса ServerSettingsComponent.
В силу того, что приложения имеют разный пользовательский интерфейс, также различаются классы, отвечающие за обработку событий, возникающих при работе с окнами приложения такие как MainForm и ServerSettingsForm.
-
Руководство пользователя
Разработанный программный комплекс предназначен для выполнения защищенных облачных вычислений с использованием концепции гомоморфного шифрования. Программный комплекс представляет собой клиент-серверное приложение, состоящее из двух компонентов:
-
клиентское приложение (FHEncryption), функциональность которого заключается в шифровании исходящих данных и передаче их на сервер вычислений;
-
серверное приложение (FHEncryptionServer), функциональность которого заключается в получении зашифрованных данных и проведении запрашиваемой клиентом операции над зашифрованными данными.
-
Клиентское приложение
Клиентское приложение (FHEncryption) представляет собой форму, элементы которой разделены по функциональным возможностям (группам).
Форма приложения (рисунок 5.1) разделена на пять основных групп:
-
группа «Соединение с сервером»;
-
группа «Информация о приложении»;
-
группа «Лог приложения»;
-
группа «Выполнение операций»;
-
группа «Статистика».
Рисунок 5.1 Главная форма клиентского приложения
-
Группа элементов «Соединение с сервером»
Группа элементов интерфейса «Соединение с сервером» (рисунок 5.2) позволяет пользователю просматривать, а также редактировать параметры соединения с сервером вычислений.















