Home Page Home Page Articoli La crittografia e la classe Rijndael

La crittografia e la classe Rijndael

Vediamo come utilizzare una delle tante classi messe a disposizione dal .NET Framework per la crittografia dei dati. In particolare la classe Rijndael implementa un algoritmo di crittografia molto forte diventato famoso negli ultimi anni.
Autore: David De Giacomi Livello:
Cosa significa "Crittografia"
Crittografia deriva da due parole greche "Kruptòs" che significa nascosto, e "graphia" ossia scrittura. La crittografia viene usata ormai da diversi secoli, e con il passare degli anni si è sempre più evoluta molto velocemente per varie esigenze.
E' stata utilizzata spesso in passato per trasmettere messaggi da regioni diverse durante i numerosi conflitti nella storia. Ma anche più recentemente nella seconda guerra mondiale è stata usata pesantemente.
I tedeschi durante la Guerra avevano inventato Enigma un algoritmo simmetrico per trasmettere in modalità protetta i propri messaggi.
Addirittura pare proprio che la sconfitta della Germania nella guerra fu causata dalla scoperta da parte degli Americani e degli Inglesi dei sistemi usati per scambiarsi segretamente dei messaggi.
Ogni qual volta un codice, un algoritmo veniva forzato e violato, un altro ben più potente lo sostituiva e così avanti fino ai giorni nostri, dove la crittografia viene spesso utilizzata per proteggere le transazioni on line e quindi i numeri delle nostre carte di credito.

.NET Framework e Crittografia
Una delle novità importanti riguardanti il .NET Framework è l'aggiunta di un intero namespace dedicato a questo argomento. Il nome del namespace è : System.Security.Cryptography.
Nello sviluppo del passato la mancanza di un valido supporto alla crittografia è sempre stato uno degli anelli deboli della catena. Ora il peggio sembra passato e anzi, il Framework ci mette a disposzione una serire di classi dedicate a quasi ogni tipo di algoritmo disponibile.
Elenco solo una parte dei vari algoritmi implementati, MD5, DES, 3DES, RSA, SHA1, algoritmi simmetrici e asimmetrici.

L'algoritmo Rijndael
Il http://www.nist.gov/ ">NIST (National Institute of Standards and Technology), è un organismo federale degli Stati Uniti fondato per permettere lo sviluppo e l'evoluzione della tecnologia, un miglioramento della produttività e della vita in genere.
Qualche anno fa il NIST ha lanciato un concorso per vedere se qualcuno riusciva a proporre un algoritmo per crittografare dati più potente di quello precedente, il DES.
Il DES è stato per molti anni l'algoritmo di riferimento dal 1977 al 1998. Ma in quella data il NIST è stato obbligato a cercare un nuovo algoritmo perchè il DES ormai soffriva di alcuni problemi e la sua violabilità diventava sempre più semplice grazie anche alla potenza di calcolo degli elaboratori.
Il concorso pubblico indetto dal NIST si chiamava A.E.S. Advanced Encryption Standard.
La lista degli algoritmi presentati era molto lunga, dopo una prima scrematura, rimasero solo 4 o 5 algoritmi, alla fine fu scelto quello il Rijndael.
Questo algoritmo è stato creato da Joan Daemen e Vincent Rijmen e fa parte della categoria degli algoritmi simmetrici.
Ciò significa che usa un'unica chiave, in questo caso privata, per crittografare e decrittografare al contrario di quelli asimmetrici che usano due chiavi (pubblica e privata).
Non andremo a spiegare nel dettaglio come funziona il Rijndael perchè è molto complicato ma se volete espandere le vostre conoscenze, potete fare riferimento a questo link: http://www.esat.kuleuven.ac.be/~rijmen/rijndael/ ">Rijndael Homepage

Esempio
Per non dilungarci inutilmente in altri discorsi, veniamo al sodo e presentiamo subito due blocchi di codice, due funzioni comode per effettuare le due operazioni più comuni Codifica e Decodifica.
Diciamo da subito che è necessario definire due chiavi che saranno usate dal nostro algoritmo per crittografare i dati:


private const string chiave= "AxTYQWCvGTFRbgLL" //16 byte
private const string iv = "QWExcfTyUxxLOafO"; //16 byte


La prima è la nostra chiave ufficiale, che dovrà conoscere solo il destinatario del nostro messaggio.
La seconda invece IV sta per Initialization Vector o Vettore di Inizializzazione.
Di solito per crittografare si usa la chiave ufficiale e il risultato della codifica dei byte precedenti.
Quando si inizia da una stringa è chiaro che prima dei primi 8 byte non c'è niente. Quindi il vettore di inizalizzazione serve proprio a questo, per fornire una base di partenza all'algoritmo.
Chiave e vettore di inizalizzazione hanno la stessa dimensione 16 byte.

Vi ricordo che alcune proprietà e metodi (come IV, Key, ecc.) della classe Rijndael vengono ereditati dalla classe Madre SymmetricAlgorithm così come altre classi di algortimi appartenenti agli algoritmi simmetrici.
Dentro la classe madre ci sono anche due metodi GenerateIV e GenerateKey per creare automaticamente ed in modo casuale le due chiavi enunciate poco fa.

Ecco qui la funzione per la codifica:


public string Encode(string S)
{
RijndaelManaged rjm = new RijndaelManaged();
rjm.KeySize = 128;
rjm.BlockSize = 128;
rjm.Key = ASCIIEncoding.ASCII.GetBytes(chiave);
rjm.IV = ASCIIEncoding.ASCII.GetBytes(iv);
Byte[] input = Encoding.UTF8.GetBytes(S);
Byte[] output = rjm.CreateEncryptor().TransformFinalBlock(input, 0,
input.Length);
return Convert.ToBase64String(output);
}


e quella per la decodifica:


public string Decode(string S)
{
RijndaelManaged rjm = new RijndaelManaged();
rjm.KeySize = 128;
rjm.BlockSize = 128;
rjm.Key = ASCIIEncoding.ASCII.GetBytes(chiave);
rjm.IV = ASCIIEncoding.ASCII.GetBytes(iv);
try
{
Byte[] input = Convert.FromBase64String(S);
Byte[] output = rjm.CreateDecryptor().TransformFinalBlock(input, 0,
input.Length);
return Encoding.UTF8.GetString(output);
}
catch
{
return S;
}
}


In queste due funzioni c'è molto poco da spiegare, sono abbastanza chiare.
C'è l'inizializzazione della classe RijndaelManaged, c'è la definizione della dimensione della chiave in bit cioè 128 ossia uguale a 16 byte, come abbiamo definito sopra.
Abbiamo la definizione del BlockSize cioè l'unità minima da crittografare anch'essa di 128 bit, vengono assegnate alle due proprietà Key e IV le due chiavi definite sopra convertite in un array di byte, viene convertita la stringa da crittografare in input in formato Base64 e viene chiamato il metodo TransformFinalBlock per Codificare o Decodificare, in base alla funzione chiamata, la nostra stringa data in input alla funzione.
Voto medio articolo: 4.5 Numero Voti: 10
David De Giacomi

David De Giacomi

MVP Program Logo Approda al mondo dell'informatica nell' Aprile del 1994. Un amico gli fa conoscere il Quick Basic del DOS. E' cosi che inizia la sua attività di sviluppatore. Prosegue il suo percorso con altri linguaggi (Visual Basic, Pascal, Java, ANSI C), fino ad arrivare a .NET. Per un certo periodo affianca all'attività ... Profilo completo

Articoli collegati

Utilizzare NUnit per testare codice .NET
Scopriamo in questo articolo come utilizzare il popolare framework Open Source NUnit per effettuare Unit Testing del codice .NET aumentandone la qualità e riducendo il numero di eventuali bugs.
Autore: Michela Zangarelli | Difficoltà:
SQL Injection, che cosa è e come difendersi
I malintenzionati sono sempre dietro l'angolo. Il SQL Injection è una delle pratiche più semplici da utilizzare per attaccare un'applicazione poco sicura e violarla o arrecare danni al database. Vediamo che cos'è e come garantire la sicurezza delle applicazioni in modo adeguato.
Autore: Alessandro Alpi | Difficoltà: | Commenti: 4
Visual Studio 2005 Team System
Scopriamo il nuovo IDE di sviluppo che copre interamente l'intero ciclo di vita del software integrando in un solo ambiente più prodotti e studiato apposta per i ruoli di Architect, Developer e Tester.
Autore: Marco Caruso | Difficoltà: | Voto:
Tutorial ADO.NET ed esempi pratici - Parte 2
Dopo aver fatto un po' di teoria su ADO.NET nella Parte 1 dell'articolo procediamo con un Tutorial pratico che ci condurrà alla creazione di un'applicazione basilare che consenta l'accesso e la modifica dei dati su un Database Access.
Autore: Stefano Passatordi | Difficoltà: | Commenti: 10
Introduzione ad ADO.NET - Parte 1
ADO.NET è uno dei componenti chiave del .NET Framework. Eredita il nome dal vecchio ADO ma è praticamente quasi tutto cambiato. Una nuova architettura, nuovi concetti, nuove funzionalità e nuovi oggetti. Vediamo quali sono e a cosa servono.
Autore: Stefano Passatordi | Difficoltà: | Commenti: 6
Colonne calcolate e parola "Child" con ADO.NET
Una cosa utile di ADO.NET e' la possibilita di aggiungere ad una colonna da codice il cui valore sia il risultato di operazioni sui dati dei record (o tra valori di altre colonne). Quando si utilizza un dataset con piu tabelle collegate mediante relazioni invece, usando la parola chiave "child" si possono avere delle informazioni riguardanti le tabelle figlio, direttamente nei record della tabella
Autore: Matteo Raumer | Difficoltà: | Voto:
Usare degli indicatori di progresso con Query SQL
Nell'articolo vediamo come sia possibile con un l'aiuto delle classi DataReader e Command di ADO.NET, mostrare un indicatore di progresso che indichi lo stato di avanzamento di una query SQL durante il fetching dei dati.
Autore: Matteo Raumer | Difficoltà: | Voto:
DES il famoso standard creato da IBM per la crittografia dei dati
In questo articolo dimostreremo come crittografare dei file usando il .NET Framework e in particolare la classe DESCryptoServiceProvider che implementa l'ormai noto algoritmo di cifratura inventato da IBM negli anni 70 chiamato DES (Data Encryption Standard)
Autore: David De Giacomi | Difficoltà: | Commenti: 2 | Voto:
Cosa sono e come funzionano le funzioni ricorsive?
Ecco tre esempi efficaci che vi spiegano come usare correttamente le funzioni ricorsive, per effettuare ricerche di file e cartelle all'interno del disco fisso, per ricostruire la struttura di un file XML oppure per svuotare determinati controlli in una Form.
Autore: Matteo Raumer | Difficoltà: | Commenti: 2
Costruire Console Applications con Visual Studio .NET
Spiegheremo in questo articolo i passi base fondamentali per costruire Console Applications utilizzando Visual Studio .NET.
Autore: David De Giacomi | Difficoltà: | Voto:
TextReader e TextWriter
Una panoramica su come utilizzare queste due classi che ci permettono di leggere e scrivere file di testo.
Autore: David De Giacomi | Difficoltà: | Commenti: 1 | Voto:
Giochiamo un po' con il registro di Windows!
Scopriamo uno degli elementi fondamentali del sistema operativo Windows e vediamo come è possibile accedervi tramite le classi offerte dal .NET Framework: Microsoft.Win32.Registry e Microsoft.Win32.RegistryKey
Autore: David De Giacomi | Difficoltà: | Commenti: 1 | Voto:
.NET Framework 1.1 Beta
Una prima panormaica sulle novità offerte dal Framework 1.1 che sarà integrato nella prossima versione di Visual Studio .NET 2003.
Autore: David De Giacomi | Difficoltà:
Cosa posso costruire con Visual Studio .NET ?
Un' introduzione sui vari tipi di progetto disponibili in Visual Studio dalle tipiche applicazioni Windows fino alle recenti applicazioni Web e agli innovativi Web Services.
Autore: David De Giacomi | Difficoltà: | Commenti: 1
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5