l'md5 non è una "codifica" o una "decodifica" nel senso che intendi tu: sono formule matematiche, per altro ormai facilmente attaccabili, che ricevendo in ingresso una serie di dati ricavano 128 bit di dati (di solito rappresentati con caratteri esadecimali sotto forma di 32 caratteri che vanno da 0 a 9 e da A a F o rappresentati con 16 byte)

Non c'è possibilità di invertire l'operazione, matematicamente parlando, anche se, comunque, sfruttando le collisioni (ovvero per quali dati è possibile ottenere lo stesso hash) e la potenza dei moderni calcolatori è possibile trovare i dati originali in pochi giorni (o pochi minuti con i giusti software ).

Qui maggiori informazioni
http://it.wikipedia.org/wiki/Hash
http://it.wikipedia.org/wiki/MD5

Ad oggi, per gli hash conviene utilizzare degli algorittimi basati su SHA-2 o implementazioni simili, che permettono di generare hash da 256 bit a salire promettendo non solo maggiore tempo di elaborazione per trovare corrispondenze ma anche riducendo il rischio di collisioni

Anche se, secondo me, HMAC-SHA2 è una soluzione ancora più efficiente perché permette non solo di generare degli hash ma di utilizzare una chiave per aumentare la complessità delle operazioni per risalire all'originale: non è possibile distinguere un algoritmo basato su un HMAC-SHA2 o uno SHA2 perché l'output finale è identico, in compenso l'HMAC-SHA2 effettua un doppio hash utilizzando una chiave per variare il valore finale cosi da non dare nemmeno una corrispondenza diretta con le collisioni

Qui maggiori informazioni
http://it.wikipedia.org/wiki/HMAC