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);
  }
}
Strumenti personali