Обёртка над Вконтакте для зашифрованной переписки с людьми.
Название проекта SecretChat выбрано по аналогии с секретными чатами в Telegram, чтобы пользователи могли зашифрованными сообщениями, даже если Telegram будет заблокирован
Авторы: Щетников Павел, Ханова Анна
Мы сделали приложение-обёртку над мессенджером, позволяющее шифровать и обмениваться дешифровать сообщениями. На данный момент реализована обёртка над Вконтакте, сообщения шифруются с помощью one-time pad (OTP) шифрования, используется простой консольный интерфейс. В разработке находится графический интерфейс.
Точки расширения:
-
Основная точка расширения — различные мессенджеры, различные шифрования. Архитектура уровня Domain написана так, чтобы добавить новое шифрование или новый мессенджер было как можно проще.
-
Можно создавать различные классы диалогов со сколь угодно подробным содержанием сообщений. От просто текстовых до содержащих Attachment, стикер, emoji.
-
Возможно, к защите проекта будет готова точка расширения, позволяющая создавать различные стили графического интерфейса.
Павел занимался получением информации об объектах с помощью VkApi, а также реализацией интерфейса, позволяющего легко добавлять другие мессенджеры. Анна работал над реализацией шифрования, консольным интерфейсом и тестированием.
В основе абстракции лежат интерфейсы IConnecter и IDialog. IConnecter является фабрикой IDialog. Его задача установить соединение и создать диалог, в котором будут находиться указанные пользователи. IDialog имеет методы getMessages — получить непрочитанные ранее сообщения из этого диалога, sendMessage — отправить сообщение. Эти методы не должны поддерживать никаких шифрований. Чтобы добавить новый мессенджер — нужно написать реализацию этих интерфейсов. Если для удобного получения информации от мессенджера подразумевается работа с API, нужно реализовать интерфейс IApiRequests. А чтобы получать больше информации о сообщениях, например, имя отправителя, нужно реализовать интерфейс IUserManager. Однако если мы не хотим добавить новый мессенджер, а сделать другую реализацию работы с Vk, то можно будет переиспользовать значительную часть логики более низких уровней.
Нужно реализовать абстрактный класс MessageStream, в него надо передать потоки, через которые пользователь будет взаимодействовать с приложением, а также методы ReadMessage и WriteMessage, эти методы будут читать/писать сообщения потоки и декодировать/кодировать, в соответствии с шифрованием. Если для шифрования используется ключ, нужно реализовать интерфейс IKeyReader, он знает как получить ключ, возвращает следующие count байт ключа.
-
В Infrastructure реализованы вспомогательные классы, например, KeyReader, который используется для получения ключа.
-
Логика приложения собрана в Domain.
-
Логика работы с мессенджером находится в Domain.InteractionWithSomeMessanger Здесь есть классы и интерфейсы различного уровня абстракции, от подходящего любому мессенджеру с диалогами и залогиниванием до собственно реализации работы с VK. Самый низкий уровень абстракции — это классы AbstractInteractionWithMessanger Далее по иерархии наследования идёт AbstractVkInteraction, данные интерфейсы предполагают, что будут взаимодействовать именно с Vk. Ну и на последнем уровне абстракции — собственно CustomVkInteraction или какие-то другие классы, позволяющие обмениваться сообщениями в мессенджере.
-
Логика шифрования находится в Domain.MessageEncryption здесь есть абстрактный класс MessageStream и его реализация с шифром Вернама OneTimePasCryptoStream
-
В Application находится класс, соединяющий работу классов в Domain.InteractionWithSomeMessanger и в Domain.MessageEncryption, а также простое взаимодействие с консольным интерфейсом. Консольный интерфейс был слишком прост, чтобы выделять под него отдельный класс (возможно, к защите проекта это изменится).
Интерфейс IConnecter является фабрикой, поэтому IDialog собирается внутри него при помощи конвенций. Остальное — явным конфигурированием. Синглтонами сделаны класс работы с API, класс взаимодействия с пользователем. Также синглтоном является класс VKUsersManager, поскольку его логика всегда одинаковая.
Тестами пока покрыта логика, шифрующая сообщения. Проверяется корректность работы с длинными текстами, с кириллицей, пробелами, переводами строк и знаками препинания. Проверяется корректность работы с некоторыми алфавитами такими как японский, китайский упрощённый, арабский. Для тестирования использовалась библиотека NUnit. Логика уровня приложения оказалась очень простой, поэтому тестами мы её решили не покрывать.