2011-02-09 7 views
5

Aunque esta es una tarea de la universidad (deberes), he llegado a la mejor solución que podía pensar. Logré la máxima puntuación con este código ya que coincide con la pregunta, sin embargo, me permitieron desarrollarlo en C# en lugar de todos los demás que usan Java, un desafío como "yeh, show what C# can do" ;-)Ajuste de rendimiento Permutaciones C# y código SHA1

La pregunta era:

Cree un programa para encontrar la contraseña de un hash SHA1 usando una técnica de fuerza bruta, suponiendo que las contraseñas tienen 6 caracteres de longitud y solo pueden contener minúsculas az y 0-9.

Creé una consulta LINQ y, después de tener las posibles combinaciones, debo ejecutarlas a través de SHA1 para obtener un hash y compararlo con el hash de contraseña proporcionado.

he creado este código:

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."; 
     } 

Ahora mi verdadero problema es que los que resuelve contraseñas fáciles rápidamente ("aaaaaa" es instantáneo) pero, obviamente, lleva más tiempo cuanto más la contraseña está lejos de "aaaaaa".

Espero que alguien pueda proporcionar algunos consejos sobre cómo aumentar el rendimiento.

+1

Reduce tu sobrecarga, eso es todo. Podrías crear una implementación SHA1 que utilizara 6 caracteres. Podría tratar de reducir la sobrecarga de GC, como por qué está usando Enumerable.Range? ¿Por qué no: 'de c1 en Characters'? Además, podría considerar intentar: 'select (" "+ c0 + c1 + c 2) + (" "+ c3 + c4 + c5)' en lugar de sus constructores de cadenas basadas en arreglos. Sin embargo, esto solo muestra, la fuerza bruta es lenta. –

+2

¿Cuenta "ejecutar en una caja realmente grande con muchos núcleos"? Diablos, ejecútelo en un clúster azul ... –

+0

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

Respuesta

2

Si está bastante contento con la implementación, entonces ejecutaría el código con un perfilador de rendimiento como YourKit o DotTrace. Puede consultar el punto de acceso directo en el código y consultar la sintonización desde allí. A veces es bueno hacer esto cuando estás usando código azucarado sintácticamente como LINQ, de esa manera puedes tener una idea de lo que realmente sucede debajo del capó ...

Cuestiones relacionadas