C# criptare e decriptare del testo con .Net 7

Articolo che introduce il lettore alla gestione della crittografia con la tecnologia .Net ed il linguaggio di programmazione C#.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come aggiungere una particolare funzionalità alle nostre applicazioni, che possono essere di tipo “Windows Application” o “Web application” per gestire informazioni sensibili e quindi renderli indecifrabili.
Tramite le classi per la codifica dei dati, vedremo come dato un determinato testo questo viene effettuata un’elaborazione da non renderlo più leggerle e successivamente come decifrare il codice per ritornare il testo originale.
Utilizzeremo il linguaggio di programmazione C# e l’ambiente di sviluppo Visual Studio 2022 Community con l’ultima versione del framework, che al momento in cui si sta scrivendo l’articolo è la versione 7.

Creazione del progetto


Si crea un nuovo progetto di tipo “App Windows Forms”, impostando nella finestra successiva un nome al progetto e quella successiva ancora la selezione del Framework versione 7.
Dopo aver creato il progetto occorre aggiungere i controlli per effettuare le prove, in particolare aggiungiamo tre label che identificano la descrizione dei campi sottostanti, tre caselle di testo, una avrà il compito di contenere il testo da trasformare, l’altra il risultato del testo criptato ed infine l’ultima casella la chiave di criptazione, il tutto come mostrato in figura 1

Figura 1 – i Controlli nella form

Figura 1 – i Controlli nella form

La prima casella di testo, avrà la proprietà “Name” impostata su “TxtTesto”, la casella situata al lato destra di questa, avrà la proprietà “Name” impostata su “TxtTestoCryptato” ed infine l’ultima casella di testo avrà la proprietà “Name” impostato su “TxtChiave” e la proprietà “Text” con il valore “abcfdf0123456789”. Infine aggiungiamo due controlli di tipo “Button”, uno con la proprietà “Name” impostata su “BtnCrypto” e la proprietà “Text” impostata su “Crypt” e l’altro pulsante con la proprietà “Name” impostato su “BtnDeCrypt” e la proprietà “Text” impostata su “De Crypt”.

Stesura del codice


Terminata la creazione della nostra form, non resta che scrivere il codice per convertire del testo in maniera che è criptato e quindi non rilevabile e lo stesso decriptare.
Passiamo in visualizzazione codice, e scriviamo le funzioni per rendere il un testo generico criptato, ossia non riconoscibile, che poi successivamente potrà essere decodificato.
La funzione per rendere il testo non leggibile, utilizzerà una chiave (che può essere cambiata a proprio piacimento) impostata nella casella denominata “Chiave”, in base a quella chiave, tramite le classi “AES” e “Cryptstream” trasformeremo il testo in modo che non sia più leggibile.
Di seguito si riporta il frammento di codice delle suddette operazioni, nella funzione che sarà richiamata nell’evento click di un pulsante.

C#
public static string Encrypt(string Testo, string Chiave)
       {
           byte[] initializationVector = Encoding.ASCII.GetBytes(Chiave);
           using (Aes aes = Aes.Create())
           {
               aes.Key = Encoding.UTF8.GetBytes(Chiave);
               aes.IV = initializationVector;
               var symmetricEncryptor = aes.CreateEncryptor(aes.Key, aes.IV);
               using (var memoryStream = new MemoryStream())
               {
                   using (var StreamCrypto = new CryptoStream(memoryStream as Stream, symmetricEncryptor, CryptoStreamMode.Write))
                   {
                       using (var StreamWriter = new StreamWriter(StreamCrypto as Stream))
                       {
                           StreamWriter.Write(Testo);
                       }
                       return Convert.ToBase64String(memoryStream.ToArray());
                   }
               }
           }
       }

Torniamo in visualizzazione grafica facciamo doppio click sul primo pulsante, quello denominato “BtnCrypt” in modo da passare in visualizzazione codice nell’evento click del pulsante.
In questo evento richiameremo la funzione appena scritta.
Di seguito il frammento di codice delle suddette operazioni

C#
 private void BtnCrypt_Click(object sender, EventArgs e)
       {
           TxtTestoCryptato.Text = Encrypt(TxtTesto.Text, TxtChiave.Text);
       }

Rimaniamo in visualizzazione codice, e scriviamo il codice per decifrare il testo criptato, utilizzando la stessa chiave che troviamo nella casella di testo.
Con le medesime classi di crittografia utilizzate in precedenza, effettueremo la codifica del testo, la differenza sostanziale nel metodo precedente riguarda il parametro passato alla classe “CryptoStream”, che in questo caso è di tipo “Read” mentre nel precedente metodo era di tipo “Write”.
Di seguito il frammento di codice del metodo per decodificare il testo criptato.

C#
public static string Decrypt(string TestoCryptato, string Chiave)
       {
           byte[] initializationVector = Encoding.ASCII.GetBytes(Chiave);
           byte[] ByterArrayTesto = Convert.FromBase64String(TestoCryptato);
           using (Aes aes = Aes.Create())
           {
               aes.Key = Encoding.UTF8.GetBytes(Chiave);
               aes.IV = initializationVector;
               var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
               using (var memoryStream = new MemoryStream(ByterArrayTesto))
               {
                   using (var StreamCrypto = new CryptoStream(memoryStream as Stream, decryptor, CryptoStreamMode.Read))
                   {
                       using (var StreamReader = new StreamReader(StreamCrypto as Stream))
                       {
                           return StreamReader.ReadToEnd();
                       }
                   }
               }
           }
       }

Ora passiamo in visualizzazione grafica e facciamo click sul pulsante quello con il nome “BtnDeCrypt” in modo da passare in visualizzazione codice nell’evento click del pulsante.
Nell’evento dobbiamo richiamare il metodo appena creato.
Di seguito il frammento di codice delle suddette operazioni

C#
private void BtnDeCrypt_Click(object sender, EventArgs e)
       {
            TxtTesto.Text = " Convertito: " + Decrypt(TxtTestoCryptato.Text, TxtChiave.Text); 
       }

Terminata la stesura del codice non resta che eseguire il progetto, per effettuare le dovute prove. Inseriamo il testo nella prima casella, in modo da convertirla, lasciando la chiave così com’è impostata.

Conclusioni


L’articolo ha voluto fornire al lettore le basi e soprattutto avvicinarlo all’ambito della creazione del software con aspetti della sicurezza informatica, permettendo di rendere alcune informazioni illeggibili e quindi più sicure e soprattutto a norma di salvaguardia dei dati.
Le classi messe a disposizione del Framework, permettono di creare applicazioni anche di una certa complessità ma soprattutto aspetti di sicurezza molto imponenti da rende la vulnerabilità o l’accessibilità complicati a chi ne vuole accedere.