SSL is very complex, por lo que querrá utilizar una biblioteca.
Hay varias opciones, tales como Keyczar, Botan, cryptlib, etc. Todas y cada una de esas bibliotecas (o las bibliotecas sugeridos por otros, como Boost.Asio o OpenSSL) tendrán código de ejemplo para esto.
Respondiendo a la segunda pregunta (¿cómo integrar una biblioteca en el código existente sin causar demasiado dolor): que va a depender de su código actual. Si ya tiene funciones simples que llaman a los métodos Winsock o socket para enviar/recibir int
s, strings
, etc., solo necesita volver a escribir las agallas de esas funciones. Y, por supuesto, cambie el código que establece el socket para comenzar.
Por otro lado, si está llamando directamente a las funciones de Winsock/socket entonces probablemente quiera escribir funciones que tengan una semántica similar pero envíen los datos encriptados, y reemplace sus llamadas de Winsock con esas funciones.
Sin embargo, es posible que desee considerar cambiar a algo como Google Protocol Buffers o Apache Thrift (a.k. a Facebook Thrift). La documentación de Buffers de Protocolo de Google dice: "Antes de los búferes de protocolo, había un formato para solicitudes y respuestas que utilizaban orquestación/desasignación de solicitudes y respuestas, y que admitía varias versiones del protocolo. Esto dio como resultado un código muy desagradable. ... "
Actualmente se encuentra en la fase de concentración/desasignación de manos. Puede funcionar, y de hecho, un proyecto en el que trabajo utiliza este método. Pero es mucho mejor dejar eso en una biblioteca; especialmente una biblioteca que ya ha pensado en actualizar el software en el futuro.
Si sigue esta ruta, configurará sus conexiones de red con una biblioteca SSL y luego transferirá sus datos Thrift/Protocol Buffer a través de esas conexiones. Eso es. Implica una refacturación extensa, pero terminarás con menos código para mantener. Cuando introdujimos Buffers de Protocolo en la base de código de ese proyecto que mencioné, pudimos deshacernos de aproximadamente 300 líneas de código de clasificación/demarshalling.
Hola, Max, Gracias por los detalles adicionales. (Quizás mi pregunta original no estaba redactada con claridad). Su respuesta agrega la información que me da. Tengo un proceso bastante feo, codificado a mano y basado en un socket en el código que hace una especie de "handshake" con el servidor, y específicamente configura el túnel del puerto UDP. El resto del código de red se abstrae en las funciones auxiliares de tipo "SendXMLViaTCPAndWaitForResponse()". Solo morder la bala no debería ser tan difícil, debería implicar poca recodificación más allá de los efectos de ayuda. Gracias de nuevo por clavar esto. –