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
Questo il codice...copiatelo e incollatevo nel file degli attrezzi!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
ATTENZIONE : per la vostra salute non cercate di capire il codice
CRIPTAZIONE
DECRIPTAZIONEcodice: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; }
Ora un programmino di test (suppongo abbiate incluso il file con le funzioni o il codice fornito!)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; }
Dovreste vedere il seguente outputcodice:<?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." " ?>
Notate che la stringa criptata è come dicevo il doppio di quella originale (però sono caratteri 'umani')
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.codice:Testo da criptare : Testo da criptare Password : lamiapassword Testo criptato : 350112400B465D531857110A4412544355 Testo decriptato : Testo da criptare
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!)
![]()


Rispondi quotando