• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Info [C#]La classe MD5

System32

Utente Stellare
Autore del topic
2 Gennaio 2010
15.556
112
Miglior risposta
0
Mi sono stancato di fare sempre le stesse cose, ragione per cui ho deciso di cercare qualcosa su google che riguardasse la crittografica e mi è capitata davanti la classe MD5. Per chi non lo sapesse, l'MD5 è un algoritmo che presa in input una stringa ne restituisce in output un'altra. Qual è dunque l'"efficienza" ( diciamo così ) di questo algoritmo ? L'efficienza di questo algoritmo è che la stringa che verrà generata in output non sarà mai e poi mai simile ad un'altra. Essendo l'MD5 un algoritmo che genera stringhe a 128bit è chiaramente comprensibile come le combinazioni siano infinite ( come al solito : diciamo così ) e quindi una stringa non avrà mai gli stessi caratteri di un'altra. In questa discussione cercherò di spiegarvi come lavora più o meno l'MD5 in C#, ragion per cui aprite una bella finestra bianca del compilatore Visual Studio o Visual C#. Il progetto che andremo a creare sarà una ConsoleApplication ( applicazione console ). Ho ritenuto opportuno farlo in una console poichè sarebbe inutile farlo in una WindowsForm, avrei dovuto inserire solo un bottone e una textBox, quindi è meglio un'applicazione console. Gli using che andremo ad importare sono i seguenti :

  • using System;
  • using System.Security.Cryptography;
  • using System.Text;

Il primo servirà per evitare di scrivere ogni volta System.Console etc..

Il secondo servirà per utilizzare la classe MD5 che riguarda la crittografia.

E infine il terzo servirà per l'encoding dei caratteri.
La prima cosa da fare è quella di creare il metodo per prendere l'MD5 di una stringa e successivamente verificare la stringa ottenuta con quella di partenza, se dovesse risultare uguale allora l'MD5 di quella stringa è corretto, altrimenti è quello di un'altra stringa. Quindi andiamo a creare il verificaMD5 in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Avremo così creato il metodo chiamato verificaMD5 che come argomenti accetta una stringa testo.

NB : Quando andrete a scrivere solo questo che fin ora abbiamo scritto nel compilatore, esso genererà un errore sottolienando in rosso verificaMD5, questo perchè la funzione si aspetta che venga restituito un valore, ma questo lo vedremo più avanti.

L'errore che verrà generato è il seguente : Errore 1 'MD5Class.Program.getMD5Hash(string)': non tutti i percorsi del codice restituiscono un valore C:\Users\User\Desktop\MD5Class\MD5Class\Program.cs 9 23 MD5Class


Adesso necessitiamo della classe MD5, che servirà per creare l'istanza dell'oggetto MD5CryptoServiceProvider, in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Adesso dal momento che una lunga stringa di caratteri deve essere necessariamente trattata come una successione di byte, dovremo dichiarare una variabile di tipo byte[] ( cioè un array di byte ) che conterrà l'MD5 encodato, prendendone dunque i byte, in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Dove ComputeHash servirà a prendere l'hash encodato della variabile testo ( ovvero della stringa dalla quale ricavarne l'MD5 ). Adesso però questa successione di byte che abbiamo prelevato dalla futura stringa dalla quale prendere l'MD5 deve essere contenuto in una variabile, questa variabile sarà di tipo StringBuilder ( classe ). Creiamo quindi una variabile con la classe StringBuilder, in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Adesso dobbiamo controllare ogni singolo carattere e restituire la stringa con lo StringBuilder. Per fare ciò c'è bisogno di un for, in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Adesso restituiamo il risultato ottenuto in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

NB: Prima di restituire il valore ottenuto, sbuilder conteneva dati numerici, noi con il return li abbiamo "trasformati" in stringa.

Il primo metodo è stato creato​

Adesso dobbiamo creare il metodo per verificare se l'hash ottenuto coincide con quello della stringa dalla quale abbiamo preso l'hash, quindi :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

NB: Il metodo verifyMD5 è di tipo bool ( variabile che indica una condizione vera o falsa ) in modo che se restituisce true allora l'hash corrisponde a quello della stringa, altrimenti se restituisce false l'hash appartiene ad un'altra stringa.

Altra cosa : come avete potuto notare, questo metodo accetta come argomenti due stringhe, perchè ? Perchè le stringhe da comparare sono 2 :

  • La prima è l'hash ottenuto
  • La seconda è la stringa da comparare

Adesso dobbiamo creare una stringa che contenga l'hash da verificare, in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Adesso per comparare 2 stringhe abbiamo bisogno di uno StringComparer ( classe ), dichiariamolo in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

NB: StringComparer.OrdinalIgnoreCase ( notare la parte evidenziata in grassetto ) considera i caratteri da comparare ( mettere a confronto ) come se fossero in maiuscolo.

Adesso mettiamo a confronto il valore ottenuto con quello della stringa da cui prendere l'MD5, in questo modo :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

In questo modo se la messa a confronto tra le due stringhe restituisce true l'hash è lo stesso, altrimenti se restituisce false l'hash appartiene ad un'altra stringa ( quindi è diverso ).

Il secondo metodo è stato creato​

Adesso andiamo nel main() e dichiariamo una stringa che conterrà o una singola parola o una frase :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Adesso creiamo un'altra stringa che però conterrà l'hash della stringa precedente :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Adesso mettiamo a confronto le due stringhe :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Il programma è finito​

Spero sia stato chiaro, se dovessi aver sbagliato qualcosa non lapidatemi, ho scritto solo ciò che ho capito.

Alla prossima.
 
Ultima modifica:
Riferimento: [C#]La classe MD5

Ottimo. Scritto in modo semplice e comprensibile.
Consiglio di usare colori più scuri.
E la decriptazione non la fai? :emoji_smiley: