Ho ultimamente avuto la necessità di esplorare varie tecniche di hashing delle stringhe.
Lo Xor Hashing è una tecnica semplice ma efficace per la criptazione delle stringhe.
L’operatore Xor, anche detto exlusive or, restituisce TRUE se uno dei due valori (bit) è TRUE ma non entrambi.
Ad esempio:
00101
----------
10111
Analizziamo quindi la conversione manuale della stringa “ciao” ed esaminiamo la sua implementazione Javascript qui esposta.
{
var to_enc = str; //ciao
var xor_key=6; //è possibile cambiare con altri numeri
var the_res="";//la stringa in output
for(i=0;i<to_enc.length;++i)
{
the_res+=String.fromCharCode(xor_key^to_enc.charCodeAt(i));
}
return the_res;
}
0×01 – La funzione prende in input la stringa “ciao”
0×02 – Viene assegnato la chiave di paragone per lo xor
0×03 – Viene inizializzata la stringa in output
0×04 – Il for cicla le lettere delle strighe e compie le seguenti operazioni.
xor_key^to_enc.charCodeAt(i)
La funzione charCodeAt , la quale restituisce il valore unicode di un carattere, prende la prima posizione della stringa (c) e restituisce il suo valore unicode (99) il quale valore binario è 1100011.
il valore binario di 6 è invece 110 ovvero 0000110.
Viene eseguito quindi lo xor.
0000110
--------
1100101
Il risultato binario 1100101 corrisponde al carattere unicode 101
0×05 – Viene tradotto il valore unicode in stringa, ovvero “e” ed accodato alla variabile to_res in output.
La procedura viene ripetuta anche per le lettere i,a,o.
Il risultato è quindi: eogi
Non mi soffermerò a spiegare l’algoritmo inverso in quanto adesso dovrebbe essere abbastanza chiaro.
Eccolo qui:
{
var to_dec=str;
output = "";
var xor_key=6;
for(i=0;i<to_dec.lenght: i++) {
output+=String.fromCharCode(xor_key^to_dec.charCodeAt(i));
}
return output;
}
Alcuni link interessanti per approfondire:
Xor Hashing – Spiegazione ed implementazione 