Volevo realizzare una chat client server, molto semplice, ma allo stesso tempo molto sicura.
Pensavo di crittografare utilizzando AES-256bit.
Io l'ho pensata così, ditemi se sbaglio ovviamente, i vari client inseriscono in una textbox "sicura" le password (che devono essere uguali ovunque) e nelle funzioni di invio, 
criptano i messaggi che inserisco in un altra textbox normale, utilizzando quella chiave e li inviano al server; la funzione di ricezione decripta sempre utilizzando sempre la stessa chiave. 
Il server invece non dovrebbe fare nulla a livello di crittografia.
Ho provato, ma non so se non funziona a causa della logica o a livello di codice.
Vi linko il template dal quale ho preso la chat così potete vedere il codice completo (base senza crittografia). 
http://www.geekpedia.com/tutorial239_Csharp-Chat-Part-1---Building-the-Chat-Client.html
Invece ecco come ho modificato le due funzioni di invio e ricezione nel client: 
Funzione di invio
// invia il messaggio scritto al server
        private void SendMessage()
        {
            if (txtMessage.Lines.Length >= 1)
            {
                byte[] passwordBytes = GetPasswordBytes();
                encrypted_message = AES.Encrypt(txtMessage.Text, passwordBytes);
                swSender.WriteLine(encrypted_message);
                swSender.Flush();
                txtMessage.Lines = null;
            }
            txtMessage.Text = "";
        }
Funzioni di Ricezione
private void ReceiveMessages()
        {
            // Receive the response from the server
            srReceiver = new StreamReader(tcpServer.GetStream());
            // If the first character of the response is 1, connection was successful
            string ConResponse = srReceiver.ReadLine();
            // If the first character is a 1, connection was successful
            if (ConResponse[0] == '1')
            {
                // Update the form to tell it we are now connected
                this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[] { "Connessione avvenuta con successo!" });
            }
            else // If the first character is not a 1 (probably a 0), the connection was unsuccessful
            {
                string Reason = "Non connesso: ";
                // Extract the reason out of the response message. The reason starts at the 3rd character
                Reason += ConResponse.Substring(2, ConResponse.Length - 2);
                // Update the form with the reason why we couldn't connect
                this.Invoke(new CloseConnectionCallback(this.CloseConnection), new object[] { Reason });
                // Exit the method
                return;
            }
            // While we are successfully connected, read incoming lines from the server
            while (Connected == true)
            {
                    try
                    {
                        // Show the messages decrypted in the log TextBox
                        this.Invoke(new UpdateLogCallback(this.MessageUpdateLog), new object[] { srReceiver.ReadLine() });
                        
                    }
                    catch
                    {
                        try
                        {
                        this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[] { srReceiver.ReadLine() });
                        }
                        catch { }
                    }
            }
        }
        // This method is called from a different thread in order to update the log TextBox
        private void UpdateLog(string strMessage)
        {
            txtLog.AppendText(strMessage + "\r\n");
        }
        
        //Decittografia dei messaggi in arrivo dagli altri client
        private void MessageUpdateLog(string strMessage_de)
        {
            byte[] passwordBytes = GetPasswordBytes();
            strMessage_de = AES.Decrypt(strMessage_de, passwordBytes);
            // Append text also scrolls the TextBox to the bottom each time
            txtLog.AppendText(strMessage_de + "\r\n");
        }
Vi ringrazio in anticipo.
P.s Oregon, per favore, se ho scritto troppe castronerie, non linciarmi.
Edit:
Riguardo le chiavi avevo già in mente di scambiarcele a voce.