Несколько вопросов по сетевому программированию в C++?
Здравствуйте. Имеется несколько вопросов по сетевому программированию в C++.
1. Криптография данных.
Для передачи пакетов данных используется TCP. Перед отправкой данных планируется шифровать передаваемые данные. Какой наиболее надежный алгоритм шифрования по ключу посоветуете в C++? Шифрование будет end-to-end между каждым сервером, при установке соединения между серверами они получают рандомный ключ для дешифровки данных ДЛЯ ТЕКУЩЕГО соединения.
2. Как посоветуете оптимизировать работу?
Сами сервера работают с TCP (сырые сокеты). Какой подход лучше использовать для обработки данных, поступающих с сервера А на сервер Б?
Например, пришла информация с сервера А на сервер Б с какой-то платёжной операцией. С данными поработали, отослать ответ необходимо именно тому человеку, который эту информацию сообщил, но очереди для этого не сильно подойдут — желательно использовать по процессу/потоку для каждого соединения. Что лучше? Или, вернее, КАК реализовать?
Знаю, вопросы могут показаться глупыми, но прошу не кидать тапками, а дать наставление и направить на путь истинный.
1. Алгоритмов шифрования в современном мире довольно внушительное количество. Вряд ли среди них можно выделить "самый надежный". Выбор алгоритма зависит от того, от кого вы прячете данные. Например, если вы не хотите, чтобы наши спецслужбы читали ваш трафик, тогда наверное не стоит использовать алгоритмы ГОСТ, или же наоборот, не хотите, чтобы АНБ видело данные - то не стоит использовать AES. Можно взять алгоритмы от "независимых" экспертов - например Blowfish от Б. Шнайера. Ну и не стоит забывать про длину ключа. Куда более интересный вопрос - а как вы будете передавать ключ?
2. Сами сервера работают с TCP (сырые сокеты). Это, простите, как? "С данными поработали, отослать ответ необходимо именно тому человеку, который эту информацию сообщил, но очереди для этого не сильно подойдут — желательно использовать по процессу/потоку для каждого соединения." Все зависит от ваших ресурсов и нагрузки на сервера.
1. Используйте openssl, там уже все придумано за вас. Если делаете финансовое ПО для работы в РФ, то видимо потребуется ГОСТовое шифрование. Такие варианты openssl то же есть, с сертификацией и прочими плюшками, конечно не бесплатно.
2.Тут трудно что-то сказать не зная специфики задач, которые вы будете решать.
В общем случае, поток на соединение - если соединений относительно не много; иначе - асинхронный ввод/вывод. Но могут быть и другие факторы, влияющие на выбор архитектуры.
В асинхронном варианте сам ввод/вывод можно делать в одном потоке, а для обработки держать пул потоков обработчиков. Задания от потока ввода/вывода к обработчикам передавать через очередь, результаты аналогично.