2011-02-09 7 views
5

Sebbene si tratti di un incarico universitario (compiti a casa), ho trovato la soluzione migliore a cui potessi pensare. Raggiungerei il massimo dei voti con questo codice in quanto corrisponde alla domanda, tuttavia mi è stato permesso di svilupparlo in C# piuttosto che chiunque altro utilizzando Java, una sorta di "yeh, mostra cosa C# può fare" ;-)Ottimizzazione delle prestazioni C# permute e codice SHA1

La domanda era:

Creare un programma per trovare la password di un hash SHA1 utilizzando una tecnica di forza bruta, supponendo che le password siano lunghe 6 caratteri e che contengano solo lettere minuscole az e 0-9.

Ho creato una query LINQ e dopo aver ottenuto le combinazioni possibili, è necessario eseguirli tramite SHA1 per ottenere un hash e confrontarlo con l'hash della password fornito.

Ho creato questo codice:

public static string BruteForceHash(string hash) 
     { 

       var results = from c0 in Enumerable.Range(0, 36) 
           from c1 in Enumerable.Range(0, 36) 
           from c2 in Enumerable.Range(0, 36) 
           from c3 in Enumerable.Range(0, 36) 
           from c4 in Enumerable.Range(0, 36) 
           from c5 in Enumerable.Range(0, 36) 
           select new string(
            new[] 
           { 
            Characters[c0], 
            Characters[c1], 
            Characters[c2], 
            Characters[c3], 
            Characters[c4], 
            Characters[c5], 
           } 
           ); 

       string found = null; 
       Parallel.ForEach(results, (result, loopstate, a) => 
               { 
                string hashed = SHA1(result, Encoding.Default); 

                if (hashed == hash) 
                { 
                 found = result; 
                 loopstate.Break(); 
                } 
               }); 

       if (found != null) 
       { 
        return found; 
       } 

      return "Not found."; 
     } 

Ora il mio vero problema è che ha risolto facilmente le password in modo rapido ("aaaaaa" è istantanea) ma ovviamente richiede più l'ulteriore la password è lontano da "aaaaaa".

Spero che qualcuno possa fornire alcuni suggerimenti su come aumentare le prestazioni.

+1

Ridurre il sovraccarico, questo è tutto. Potresti realizzare un'implementazione SHA1 che utilizzava 6 caratteri. Potresti provare a ridurre il sovraccarico di GC, ad esempio perché utilizzi Enumerable.Range? Perché no: 'da c1 in Caratteri'? Inoltre, potresti provare a provare: 'select (" "+ c0 + c1 + c 2) + (" "+ c3 + c4 + c5)' invece dei costruttori di stringhe basati su array. Tuttavia, questo va solo a dimostrare, la forza bruta è lenta. –

+2

Conta "eseguirlo su una scatola veramente grande con un sacco di core"? Diamine, eseguilo su un cluster azzurro ... –

+0

@marc: LOL! :) .... –

risposta

2

Se sei abbastanza soddisfatto dell'implementazione, eseguirò il codice con un profiler delle prestazioni come YourKit o DotTrace, puoi guardare l'hot spot nel codice e guardare l'ottimizzazione da lì. A volte è bello farlo quando si utilizza codice sintatticamente zuccherato come LINQ, in questo modo si può avere un'idea di che cosa sta realmente succedendo anche sotto il cofano ...

Problemi correlati