Responderé tu pregunta en dos partes:
El canal de comunicación debe estar cifrado con RSA. ¿Cómo puedo hacer eso?
RSA es realmente lento para cifrar mensajes completos. La forma habitual de hacerlo es cifrar el mensaje con un cifrado simétrico como AES, y luego cifrar la clave simétrica utilizando la clave pública RSA del destinatario.
Habiendo dicho eso, hay muchos de pequeños detalles para hacerlos bien, por lo que te aconsejo que uses una implementación precompilada. De hecho, solo use SSL / TLS, los casos de uso como el suyo son exactamente para lo que está hecho. OpenSSL
en la implementación TLS más común, es fácil de usar y se encargará de todo el cifrado por usted. Googlear algo como "introducción a la programación de openssl" debería ayudarte a comenzar.
EDITAR: Como @Volker señaló en los comentarios, muchos clientes comunes de mensajería instantánea como Pidgin y Kopete usan la biblioteca Off -el-registro de mensajes , que es un protocolo de cifrado diseñado específicamente para mensajeros instantáneos. OTR utiliza PGP como el sistema de cifrado subyacente. Hay una biblioteca OTR para C disponible aquí y una biblioteca Java aquí .
Ahora para la segunda parte de tu pregunta:
¿Genera pares de llaves en cada cliente y cuando un cliente intenta comunicarse, solicita una clave pública? ¿Es esto seguro?
Deja que el protocolo SSL / TLS se encargue de todo esto. Utiliza un protocolo de intercambio de claves llamado Diffie-Hellman que resuelve el problema del intercambio de claves bastante bien. .
Una cosa sobre la que querrá pensar es si necesita una autenticación sólida, es decir, si le preocupa o no que las personas se hagan pasar por otros usuarios. Si es así, deberá hacer que las claves públicas de todos se conviertan en certificados que vinculen cada clave pública a una persona específica. Esta es una configuración mucho más complicada que requerirá algún tipo de Infraestructura de clave pública , o bien tendrás que configurar un < a href="https://en.wikipedia.org/wiki/Certificate_authority"> Certificate Authority server (puede hacerlo con OpenSSL
), o tener un sistema de confianza como el PGP. Si decide seguir esta ruta, puede encontrar información en Google, en este intercambio, o puede publicar nuevas preguntas sobre la configuración de una PKI para su red de chat.