Criptare dati in modo reversibile
Non sto proponendo qualcosa di veramente originale perchè si tratta del classico algoritmo di criptazione in chiave privata.
L'algoritmo produce un nuovo dato che è praticamente inattaccabile...lo svantaggio è intrinseco nel fatto che l'algoritmo è...a chiave privata (quindi la chiave ve tenuta nascosta nel cassetto!)
Idea alla base: la chiave viene usata per effettuare un xor byte a byte con il dato. Il risultato viene quindi impaccato su una stringa in cui ogni byte è rappresentato dalla sua rappresentazione esadecimale.
Lo svantaggio è che in questo modo la stringa si raddoppia (un byte = 2 cifre exa) però possiamo trattare il dato criptato come stringa {0,1,...,9,A,...F}(senza preoccuparci di caratteri 'pericolosi').
Poichè la criptazione è tanto più robusta tanto più la chiave è lunga, nel caso di chiavi corte (meno di 32 caratteri) sostituisco la chiave con la versione md5 della chiave stessa
L'operazione xor ha i vantaggi
1) genera un dato di uscita simile a un rumore binario (altissima scorrelazione intersimbolica)
2) è semplice ed efficiente
3) soprattutto reversibile
Ok...queste le funzioni
codice:
str_crypt($data, $key);
- $data è la stringa da criptare
- $key la chiave
> Ritorna la stringa criptata
str_decrypt($cdata, $key);
- $cdata la stringa criptata
- $key la chiave (la stessa usata in str_crypt per produrre $cdata)
> Ritorna la stringa decriptata
Questo il codice...copiatelo e incollatevo nel file degli attrezzi!
ATTENZIONE : per la vostra salute non cercate di capire il codice 
CRIPTAZIONE
codice:
function str_crypt($data, $key)
{
if(strlen($key)<32) $key = md5($key);
$ld = strlen($data);
$lk = strlen($key);
for($i=0, $crdata=""; $i<$ld; $i++){
$crdata .= sprintf("%02X",(ord($data[$i]))^(ord($key[$i%$lk])));
}
return $crdata;
}
DECRIPTAZIONE
codice:
function str_decrypt($cdata, $key)
{
if(strlen($key)<32) $key = md5($key);
$ld = strlen($cdata);
$lk = strlen($key);
for($i=0, $data=""; $i<$ld; $i+=2){
$data .= chr((hexdec(substr($cdata, $i, 2)))^(ord($key[($i>>1)%$lk])));
}
return $data;
}
Ora un programmino di test (suppongo abbiate incluso il file con le funzioni o il codice fornito!)
codice:
<?php
$data = "Testo da criptare";
$key = "lamiapassword";
$cdata = str_crypt($data, $key);
$ddata = str_decrypt($cdata, $key);
// verifica!
echo "Testo da criptare : ".$data."
";
echo "Password : ".$key."
";
echo "Testo criptato : ".$cdata."
";
echo "Testo decriptato : ".$ddata."
"
?>
Dovreste vedere il seguente output
Notate che la stringa criptata è come dicevo il doppio di quella originale (però sono caratteri 'umani')
codice:
Testo da criptare : Testo da criptare
Password : lamiapassword
Testo criptato : 350112400B465D531857110A4412544355
Testo decriptato : Testo da criptare
Per i perfezionisti: si potrebbe modificare l'algoritmo per scrivere i dati senza la notazione esadecimale in modo da rendere efficiente la criptazione e quindi applicarla anche a file di grosse dimensioni.
Conclusione
Se dovete criptare password, email (soprattutto le email che troppo spesso sono in chiaro!) avete una soluzione semplice e pronta da usare!
Da jhammer solo pillole di qualità (e originali!)