Risponderò alla tua domanda in due parti:
The communication channel should be encrypted with RSA. How can I do that?
RSA è davvero lento per crittografare interi messaggi. Il solito modo è di crittografare il messaggio con un codice simmetrico come AES, quindi cifrare la chiave simmetrica usando la chiave pubblica RSA del destinatario.
Detto questo, ci sono molti di piccoli dettagli da correggere, quindi ti consiglio di usare un'implementazione precostruita. Infatti, usa solo SSL / TLS, casi d'uso come il tuo sono esattamente ciò per cui sono fatti. OpenSSL
nell'implementazione TLS più comune, è facile da usare e si prenderà cura di tutta la crittografia per te. Cercare su google come "introduzione alla programmazione openssl" dovrebbe iniziare.
EDIT: come sottolineato da @Volker nei commenti, molti comuni client di messaggistica istantanea come Pidgin e Kopete utilizzano la libreria Off -the-Record Messaging che è un protocollo di crittografia specificamente progettato per gli instant messenger. OTR utilizza PGP come sistema di crittografia sottostante. C'è una libreria OTR per C disponibile qui e un Libreria Java qui .
Ora per la seconda parte della tua domanda:
Generate keypairs on every client and when a client tries to communicate, ask for public key? It is this safe?
Lascia che l'handshake SSL / TLS si occupi di tutto questo. Utilizza un protocollo di scambio di chiavi chiamato Diffie-Hellman che risolve abbastanza bene il problema dello scambio di chiavi .
Una cosa a cui vuoi pensare è se hai bisogno di un'autenticazione strong, cioè se sei preoccupato o meno delle persone che si impersonano con altri utenti. In tal caso, dovrai inserire le chiavi pubbliche di tutti in certificati che legano ciascuna chiave pubblica a una persona specifica. Questa è una configurazione molto più complicata che richiederà una sorta di Public Key Infrastructure - o dovrai configurare un < a href="https://en.wikipedia.org/wiki/Certificate_authority"> Autorità di certificazione server (puoi farlo con OpenSSL
), o avere un sistema web-of-trust come fa PGP. Se decidi di seguire questa strada, puoi trovare informazioni su Google, su questo scambio o puoi pubblicare nuove domande sull'impostazione di un'infrastruttura PKI per la tua rete di chat.