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!)