2011-01-21 16 views
13

Quiero saber el tiempo matemático requerido para descifrar hashes basados ​​en diferentes conjuntos de caracteres.¿Cuántos hashes SHA256 puede computar una computadora moderna?

Por ejemplo, utilizando solo letras de 7 caracteres alfabéticos US-ASCII, sabemos que hay 26 posibles secuencias que podrían utilizarse. Saber cuántos de estos podría generar una computadora cada minuto me daría una idea de cuánto tiempo llevaría generar todos los hash posibles y descifrar un determinado hash de 7 caracteres (cumpleaños, aparte de).

Por ejemplo, si se toma el número anterior, si un quad core moderno pudiera generar 1 millón de hashes por minuto, tomaría 8031810176/1000000/60 = 133.86 horas para encontrar todos los valores hash posibles en ese rango.

Además, ¿cómo funcionan los nuevos chips Sandy Bridge Intel con AES nativo en esto?

Respuesta

10

Escribí esta prueba en C usando la implementación de OpenSSL SHA256.

#include <stdio.h> 
#include <string.h> 
#include "openssl/sha.h" 

// http://stackoverflow.com/questions/4764608/generate-all-strings-under-length-n-in-c/4764686#4764686 
int inc(char *str) { 
    if (!str[0]) return 0; 

    if (str[0] == 'z') { 
     str[0] = 'a'; 
     return inc(str + sizeof(char)); 
    } 

    str[0]++; 
    return 1; 
} 

unsigned char buffer[65]; 
char* hashstring(char *str, int len) { 
    char hash[SHA256_DIGEST_LENGTH]; // the openssl hash 
    SHA256_CTX sha256; 
    int i; // counter 

    SHA256_Init(&sha256); 
    SHA256_Update(&sha256, str, len); 
    SHA256_Final(hash, &sha256); 

    for (i = 0; i < SHA256_DIGEST_LENGTH; i++) { 
     sprintf(buffer + (i * 2), "%02x", hash[i]); // convert openssl hash to mortal human string 
    } 

    return buffer; 
} 

int main(int argc, char *argv[]) { 
    int N = 4; // max length string 
    char str[N+1]; // the string holder 
    int i; // counter 

    unsigned int tot = 0; // number of hashes calculated 

    for (i = 0; i < N; i++) str[i] = 'a'; 
    str[N] = 0; 

    do { 
     hashstring(str, N); 
     tot++; 
    } while(inc(str)); 

    printf("%d\n", tot); 
} 

Compilar:

gcc -lcrypto -O3 -o test test.c 

Y los resultados (lo sé, no soy muy creativo con nombres de computadora):

[email protected]:~/c/sha256$ time ./test 
11881376 

real 3m2.431s 
user 3m2.335s 
sys 0m0.008s 

Así que eso es 11881376/182.4 = 65139 hashes por segundo. Luego es 26^7/101821/3600 = 34 horas para calcular todos los hash. Tenga en cuenta que todo esto se hizo en una CPU Q6600 de cuatro núcleos en una aplicación de un único subproceso y se excluyó la escritura de los hashes en el archivo.

EDITAR

Woops, yo estaba calculando todos los valores hash de cadenas con N caracteres y por debajo de. Corregido y actualizado de datos.

+0

por lo tanto, haga girar 4 de sus programas y puede generar alrededor de 400k hashes/seg. – nos

+0

Estaba generando las cadenas incorrectas, pero ahora está bien. También aparentemente tuve suerte de una vez (nota, esta es una PC, muchas otras cosas también). – orlp

+0

Gracias, tengo el Q8200, así que esto es muy aplicable a mí mismo. Me pregunto qué tan rápido podría moverse una nueva CPU de Sandy Bridge. – Xeoncross

8

Recuerde que una GPU puede hacer hash 50x - 100x más rápido que una CPU. Es más difícil de programar, pero más eficiente. Consulte www.bitcointalk.com para conocer los números. Sé que hago 622 millones de SHA-256 por segundo en una Radeon HD5830.

+1

"Si vas a hacer algo, hazlo bien" - GPU – Xeoncross

Cuestiones relacionadas