Xor Hashing – Spiegazione ed implementazione

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:

10010
00101
----------
10111

Analizziamo quindi la conversione manuale della stringa “ciao” ed esaminiamo la sua implementazione Javascript qui esposta.

function xor_str(str)
{
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.

1100011
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:

function decrypt_str(str)
{
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:

Exclusive or

Xor swap alorithm

Binary converter