Home Page Home Page Articoli DES il famoso standard creato da IBM per la crittografia dei dati

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 Livello:
Cos'era e cos'è DES
DES 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à.

Esempio
Andremo 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
File in chiaro e file cifrato


Conclusioni
Come 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!
Voto medio articolo: 4.3 Numero Voti: 14

File allegati


92_cryptodes.zip (8 Kbyte)
David De Giacomi

David De Giacomi

Unico e irripetibile 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:
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 | Difficoltà:
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5