domenica 3 febbraio 2008

Giocando con le combinazioni

Ho realizzato un piccolo esempio di generazione e composizione stringa a partire da caratteri e simboli presenti nella codifica ASCII dalla posizione 32 (spazio) alla 126 ~ (tilde) compresi.

Si può scegliere il numero di caratteri da calcolare e scegliere la composizione.

Le combinazioni ottenute sono facilmente calcolabili pari al numero di caratteri composizione elevato al numero di caratteri scelti, nel nosro caso con tutti i caratteri (numeri, simboli, maiuscoli, minuscoli) con solo 3 caratteri si arriva alla bellezza di 857375 combinazioni!

Questo mi fa venire in mente la scena di WarGames con il computer che tentava di indovinare la password per lanciare i missili, a parte la fandonia di dire che un particolare carattere della password era corretto (un baco che affliggeva il primo netbios) calcolare l'intera combinazione di 10 caratteri (CPE1704TKS) usando solo caratteri maiuscoli e numeri comporta la bella cifra di 3,65615844006298E+15 un numero veramente spropositato di tentativi impossibile per i computers del 1983 anche avendo a disposizione un Univac.

La funzione ricorsiva di calcolo stringhe 

void Combinazioni(string valore, int posizione)
{
      int x = posizione;
      if (x >= valore.Length)
             return;
       char c = valore.Substring(posizione,1).ToCharArray()[0];
       int k = caratteriAmmessi.IndexOf(c);
       if (k < 0)
             k = 0;

       for (int i = k; i < caratteriAmmessi.Length; i++)
       {

             // trasformazione della stringa in array di bytes
             byte[] b = System.Text.Encoding.ASCII.GetBytes(valore);
             // sostituzione del carattere posizionato
             b[x] = (byte) caratteriAmmessi.Substring(i,1).ToCharArray()[0];
             string txt = System.Text.Encoding.ASCII.GetString(b);

             if (txt != valore)
             {
                   sb.Append(txt);
                   sb.Append(Environment.NewLine);
              }

                // richiamo della funzione ricorsiva
             Combinazioni(txt,x + 1);

         }
}

Esempio in C#

Powerered with Window Live Write

Nessun commento: