Cifratura a shift di caratteri ASCII
Da Hacknowledge.
Esamineremo qui quella che probabilmente è la più semplice, e più antica, fra le tecniche di cifratura. Sappiamo che ogni carattere su una macchina è visto, a seconda del linguaggio che si usa, come un'entità a 8 bit (ASCII) o a 16 bit (Unicode), e quindi è riconducibile a un numero. In virtù di ciò è possibile generare una cifratura molto semplice (e rudimentale) semplicemente usando una chiave numerica arbitraria e andandola a sommare ad ogni carattere all'interno di una stringa (che altro non è, anch'esso, che un'entità numerica ai fini del calcolatore). Esempio pratico in C di una funzione che fa qualcosa di simile:
char* shift (char *str, int key) { int i; int len=strlen(str); for (i=0; i<len; i++) str[i] += key; return str; }
o in Perl:
sub Shift { $str=shift; $key=int(shift); $crypt=""; for ($i=0; $i<length($str); $i++) { $tmp=chr(ord(substr($str,$i,1))+$key); $crypt .= $tmp; } return $crypt; }
Semplicemente prendo una stringa, di cui ottengo la lunghezza, e una chiave intera, quindi ad ogni carattere all'interno della stringa vado a sommare la mia chiave numerica. Se prendo la stringa "ciao" e una chiave=3 il testo criptato corrispondente sarà quindi "fldr". Per decriptare basterà prendere la stringa cifrata e sottrarre ad ogni carattere la chiave numerica:
char* unshift (char *str, int key) { int i; int len=strlen(str); for (i=0; i<len; i++) str[i] -= key; return str; }
I limiti di quest'elementare sistema di cifratura sono presto detti. Con un byte posso generare un numero molto limitato di caratteri ASCII (2^8=256 caratteri), quindi qualsiasi chiave numerica mi permuterà i caratteri all'interno di questo range. Basta fare un elementare brute force in questo modo per vedere tutte le possibili combinazioni di caratteri generate:
void brute_shift (char *str) { int i; int key; int len=strlen(str); for (key=0; key<256; key++) { for (i=0; i<len; i++) str[i] -= key; printf ("Stringa generata con key=%d: %s\n",key,str); } }

