Chat Client Server Crittografata

di il
3 risposte

Chat Client Server Crittografata

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.

3 Risposte

  • Re: Chat Client Server Crittografata

    C'e un errore concettuale iniziale, che fa si che la tua chat NON POSSA ESSERE sicura

    In altre parole: NON FUNZIONA

    Il problema e' il seguente: se C1 e C2 devono parlare tra di loro

    1) si scambiano la chiave OPPURE
    2) inviano la chiave al server S (cosi' C2 NON DEVE CONOSCERE la chiave usata da C1 e viceverca, COSA DA NON TRASCURARE)

    C1 manda M ad S cifrato con la chiave K1, il server lo decifra e lo cifra con la chiave K2 di C2, quindi manda il messaggio M (cifrato) a C2.

    OPPURE

    C1 manda M a C2 cifrandolo con la chiave K2. C2 risponde a C1 usando la chiave K1

    Gia', ma questo vuol dire che le chiavi K1 e K2 devono essere INVIATE IN CHIARO alla controparte (S o C1/C2).

    Non le puoi inviare cifrate perche' ancora non sai la chiave da usare

    Il che vuol dire che chiunque si metta in mezzo, puo' ricuperare le chiavi e decifrare tutti i messaggi

    E USARE una chiave PREDEFINITA per cifarre le chiavi K1 e K2 da inviare a C1/C2 oppure ad S e' come NON USARLA PROPRIO!
    Risulta banale decifrare un messaggio cifrato conoscendo la chiave

    Devi studiarti come funziona la CRITTOGRAFIA IN CHIAVE PUBBLICA, alla base di questo tipo di problemi.

    Un OTTIMO libro e' Applied Cryptography di Bruce Schneier

    Considerati linciato, visto che non hai fatto un'opportuna ricerca su Internet !!!
  • Re: Chat Client Server Crittografata

    migliorabile ha scritto:


    C'e un errore concettuale iniziale, che fa si che la tua chat NON POSSA ESSERE sicura

    In altre parole: NON FUNZIONA

    Il problema e' il seguente: se C1 e C2 devono parlare tra di loro

    1) si scambiano la chiave OPPURE
    2) inviano la chiave al server S (cosi' C2 NON DEVE CONOSCERE la chiave usata da C1 e viceverca, COSA DA NON TRASCURARE)

    C1 manda M ad S cifrato con la chiave K1, il server lo decifra e lo cifra con la chiave K2 di C2, quindi manda il messaggio M (cifrato) a C2.

    OPPURE

    C1 manda M a C2 cifrandolo con la chiave K2. C2 risponde a C1 usando la chiave K1

    Gia', ma questo vuol dire che le chiavi K1 e K2 devono essere INVIATE IN CHIARO alla controparte (S o C1/C2).

    Non le puoi inviare cifrate perche' ancora non sai la chiave da usare

    Il che vuol dire che chiunque si metta in mezzo, puo' ricuperare le chiavi e decifrare tutti i messaggi

    E USARE una chiave PREDEFINITA per cifarre le chiavi K1 e K2 da inviare a C1/C2 oppure ad S e' come NON USARLA PROPRIO!
    Risulta banale decifrare un messaggio cifrato conoscendo la chiave

    Devi studiarti come funziona la CRITTOGRAFIA IN CHIAVE PUBBLICA, alla base di questo tipo di problemi.

    Un OTTIMO libro e' Applied Cryptography di Bruce Schneier

    Considerati linciato, visto che non hai fatto un'opportuna ricerca su Internet !!!
    Grazie per l'ampia spiegazione e per i consigli, tuttavia, io volevo farla molto più semplice, in quanto questa chat verrebbe utilizzata soltanto da me ed un mio amico, e avevo in mente di scambiarci la chiave a voce. Considerando ciò, è fattibile? Il mio ragionamento iniziale tenendo in considerazione questo è giusto o sbaglio?
  • Re: Chat Client Server Crittografata

    Cosa ne pensate di quello che ho scritto come risposta?
Devi accedere o registrarti per scrivere nel forum
3 risposte