Cos'era e cos'è DESDES non è altro che l'acronimo di Data Encryption Standard.
E' un algoritmo crittografico simmetrico, viene usata quindi una sola chiave per crittografare e decrittografare, inventato da IBM negli anni 70.
La
http://www.nsa.gov/ ">NSA (National Security Agency) circa 30 anni fa indisse un concorso perchè aveva la necessità di avere un algoritmo di cifratura avanzato che permettesse di mettere al sicuro i dati.
IBM vinse la sfida e propose appunto il DES. Il DES è stato standardizzato nel 77 e fino ai giorni nostri è stato uno dei migliori sistemi per la protezione dei dati.
Durante questi anni però la sue prestazioni in termini di sicurezza sono state messe un po' in discussione visto che era possibile con attacchi di brute force violare il codice e scoprire i dati.
Il DES quindi era stato sviluppato ulteriormente e aveva portato alla creazione di un 3DES, una versione evoluta che criptava tre volte lo stesso blocco di dati con chiavi diverse. Questa soluzione anche più sicura della precedente richiedeva però più tempo di calcolo.
Questo algoritmo è durato fino a circa gli anni 1998 cioè fino a quando il NIST altra organizzazione americana ha indetto un concorso per la sostituzione del DES con un algoritmo più potente. Nacque così Rijndael che mando in pensione DES.
N.B. Per informazioni su Rijndael e come usare le classi del .NET Framework vedete il link all'articolo qui sotto.
Come funziona?Abbiamo già detto poco fa che appartiene alla famiglia degli algoritmi simmetrici.
Funziona a grandi linee facendo delle sostituzioni di caratteri e spostandoli. La dimensione di dati che elabora volta per volta, (in gergo il "blocco dati") è di 64 bit quindi 8 byte.
Con questo algoritmo 8 byte di dati in chiaro corrispondono esattamente a 8 byte in cifrato.
Anche la chiave è composta da 64 bit, ma solo 56 di questi sono utilizzati, i rimanenti bit sono utilizzati per controlli di parità.
EsempioAndremo a vedere quindi come crittografare e decrittografare un file usando questo algoritmo.
Abbiamo creato due funzioni EncodeFile e DecodeFile che prendono in ingresso due stringhe che corrispondono al percorso (path) del file da leggere e quello da scrivere cifrato.
Vi ricordo già da subito che per poter usare questo codice è necessario referenziare questi tre namespaces in questo modo:
using System.Security.Cryptography;
using System.Text;
using System.IO;
Funzione per la codifica:
private void EncodeFile(string source,string destination)
{
//Apertura del file sorgente in chiaro e destinazione cifrato
FileStream input=new FileStream(source,FileMode.Open);
FileStream output=new FileStream(destination,FileMode.Create);
int bytesread=0;
int totalbytes=0;
byte [] buffer=new Byte[1024];
DESCryptoServiceProvider s=new DESCryptoServiceProvider();
//Definizione della dimensione della chiave e del blocco dati
//Come scritto precedentemente sono di 64 bit entrambi
s.KeySize=64;
s.BlockSize=64;
s.Key=Encoding.ASCII.GetBytes("XalEfLLa");
s.IV=Encoding.ASCII.GetBytes("DplXwfdg");
CryptoStream cs=new CryptoStream(output,s.CreateEncryptor(),CryptoStreamMode.Write);
//Ciclo do..while per leggere tutto il contenuto del file
//e contemporanea scrittura su disco dei dati cifrati
do
{
bytesread = input.Read(buffer, 0, 1024);
cs.Write(buffer,0,bytesread);
totalbytes+=bytesread;
} while (totalbytes<input.Length);
//Chiusura files
cs.Close();
input.Close();
output.Close();
}
Funzione per la decodifica:
private void DecodeFile(string source, string destination)
{
FileStream input=new FileStream(source,FileMode.Open);
FileStream output=new FileStream(destination,FileMode.Create);
int bytesread=0;
int totalbytes=0;
byte [] buffer=new Byte[1024];
DESCryptoServiceProvider s=new DESCryptoServiceProvider();
s.KeySize=64;
s.BlockSize=64;
s.Key=Encoding.ASCII.GetBytes("XalEfLLa");
s.IV=Encoding.ASCII.GetBytes("DplXwfdg");
CryptoStream cs=new CryptoStream(output,s.CreateDecryptor(),CryptoStreamMode.Write);
do
{
bytesread=input.Read(buffer,0,1024);
cs.Write(buffer,0,bytesread);
totalbytes+=bytesread;
} while (totalbytes<input.Length);
cs.Close();
input.Close();
output.Close();
}
E' sufficiente poi richiamare le due funzioni all'interno di qualsiasi programma:
private void Button_Click(object sender, System.EventArgs e)
{
EncodeFile("C:\\alfa.txt","C:\\beta.txt");
DecodeFile("C:\\alfa.txt","C:\\beta.txt");
}
Ecco il risultato:
File in chiaro e file cifrato
ConclusioniCome vedete con poche semplici istruzioni riusciamo ad applicare un elevato livello di sicurezza ai nostri documenti e dati sensibili. Vi consiglio di leggere anche gli altri articoli relativi alla crittografia. Trovate i link e i riferimenti nel box qui sotto.
Ciao!