- Criptare dati attraverso un algoritmo simmetrico -
 
COSA SERVE PER QUESTO TUTORIAL
Download | Chiedi sul FORUM | Glossario conoscenza dell'HTML - un web server che supporti la tecnologia ASP .NET
Come crittogafare e decrittografare dati con DES in Asp.Net

CIFRATURA
Crittografare con DES.

Criptare dati è un'esigenza abbastanza comune, anche su web. Il Framowork .Net mette a disposizione lo spazio di nomi System.Security.Cryptography a questo proposito; in questo articolo ci occuperemo in particolare degli algoritmi simmetrici, ovvero di quelli che derivano dalla classe System.Security.Cryptography.SymmetricAlgorithm. Nell'esempio proposto viene utilizzato DES (ritenuto uno degli algoritmi più sicuri attualmente in circolazione) ma si tenga presente che ogni qual volta nel codice appare DES è possibile sostituirlo con classi derivanti da SymmetricAlgorithm (come Rijndael, TripleDes).
Scendiamo nel dettaglio del codice. Per prima cosa (dopo le varie intestazioni) è necessario creare le due chiavi ("password") che verranno utilizzate per la criptazione, esse possono essere generate casualmente, o ottenute da un stringa di testo (ad esempio inserita dall'utente), ma questo non sarà oggetto di discussione: nel nostro caso abbiamo deciso di specificarle direttamente come array di byte. Questi due chiavi sono l'initialization vector (IV) e la chiave vera e propria (Key):


<%@ Page Language="VB" debug="true" %>
<%@ import Namespace="System.Security.Cryptography" %>
<%@ import Namespace="System.Text.Encoding" %>

<script language="VB" runat="server">
Sub Page_Load(ByVal sender As Object, e As System.EventArgs)
Dim bytIV As Byte() = {12, 89, 148, 62, 0, 78, 254, 129}
Response.Write("IV: { " & ByteArrayString(bytIV) & "}<br>")
Dim bytKey As Byte() = {122, 56, 201, 34, 100, 22, 200, 103}
Response.Write("Key: { " & ByteArrayString(bytKey) & "}<br>")

Si noti che ByteArrayString è una semplice funzione definita come segue per stampare la lista dei byte contenuti nell'array:


Function ByteArrayString(ByVal byt As Byte())
Dim C1 As Integer, str As String = ""
For C1 = 0 To byt.Length - 1
str = str & IIf(byt(C1) < 16, "0", "") & Hex(byt(C1)) & " "
Next C1
Return str
End Function

Di seguito richiamiamo Crypt e Decrypt (le due funzioni che come ovvio rispettivamente criptano una stringa e decriptano un array di byte) e stampiamo i risultati che forniscono.


Dim strInput As String
If Request("str") Is Nothing Then strInput = "ArcadiA Club" Else strInput = Request("str")
Response.Write("Testo originale: """ & strInput & """<br>")
'Criptiamo
Dim bytEncrypted As Byte() = Crypt(strInput, bytIV, bytKey)
Response.Write("Byte criptati: { " & ByteArrayString(bytEncrypted) & "}<br>")
'Decriptiamo
Dim strDecrypted As String = Decrypt(bytEncrypted, bytIV, bytKey)
Response.Write("Testo originale: """ & strDecrypted & """<br>")
End Sub

Vediamo ora in dettaglio le due funzioni chiave.


Function Crypt(ByVal str As String, ByVal bytIV As Byte(), ByVal bytKey As Byte()) As Byte()
Dim algDES As DES = DES.Create
Dim desEncryptor As ICryptoTransform = algDES.CreateEncryptor(bytIV, bytKey)

La funzione Crypt istanzia la classe System.Security.Cryptography.DES attraverso il metodo Create, e dall'oggetto creato si ottiene, attraverso CreateEncryptor (funzione a cui si passa le due chiavi generate), un ICryptoTransform che mette a disposizione i metodi per effettuare la criptazione.
Di seguito dichiariamo due array, il primo conterrà la stringa di input trasformata in una serie di byte secondo la codifica UTF8, mentre nel secondo vi saranno i byte criptati restituiti (il risultato) da TransformFinalBlock (funzione dell'oggetto ICryptoTransform che prende come parametro un array di byte di input, l'indice da cui partire e il numero di byte da criptare). Infine la funzione restituisce l'array contenente il risultato.


Dim bytInput() As Byte, bytOutput() As Byte
bytInput = UTF8.GetBytes(str)
bytOutput = desEncryptor.TransformFinalBlock(bytInput, 0, bytInput.Length)
Return bytOutput
End Function

La funzione Decrypt è esattamente la stessa cosa, se non per il fatto che non viene utilizzata la funzione algDES.CreateEncryptor ma algDES.CreateDecryptor e bytInput (l'array di input) viene passato direttamente alla funzione e non è dunque necessario effettuare la trasformazione da stringa ad array di byte; è però necessario che l'array di output venga restituito come stringa attraverso la codifica UTF8.


Function Decrypt(ByVal bytInput As Byte(), ByVal bytIV As Byte(), ByVal bytKey As Byte()) As String
Dim algDES As DES = DES.Create
Dim desDecryptor As ICryptoTransform = algDES.CreateDecryptor(bytIV, bytKey)
Dim bytOutput() As Byte
bytOutput = desDecryptor.TransformFinalBlock(bytInput, 0, bytInput.Length)
Return UTF8.GetString(bytOutput)
End Function

Chiudiamo infine lo script e mettiamo un semplice form che permette di specificare il testo da criptare e da decriptare.


</script>
<form action="des.aspx">
<input type="text" value="Testo da criptare" name="str">
<input type="submit" value="Cripta">
</form>

 

<< INDIETRO by VeNoM00