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.