Сколько хешей SHA256 может вычислить современный компьютер? - PullRequest
15 голосов
/ 22 января 2011

Я хочу знать математическое время, необходимое для взлома хэшей на основе разных наборов символов.

Например, используя только 7 букв, US-ASCII алфавитных символов, мы знаем, что существует 26 7 возможных последовательностей, которые можно использовать. Знание того, сколько из них может генерироваться компьютером каждую минуту, дало бы мне представление о том, сколько времени потребуется, чтобы сгенерировать все возможные хеши и взломать определенный хэш из 7 символов ( атак на день рождения в сторону ).

Например, принимая вышеприведенное число, если современный четырехъядерный процессор может генерировать 1 миллион хешей каждую минуту, то для поиска всех возможных хешей в этом диапазоне потребуется 8031810176 / 1000000 / 60 = 133.86 часов.

Кроме того, как новые чипы Sandy Bridge Intel с собственным AES играют в этом?

Ответы [ 2 ]

11 голосов
/ 22 января 2011

Я написал этот тест на C, используя реализацию 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);
}

Компиляция:

gcc -lcrypto -O3 -o test test.c

И результаты (я знаю, я не очень изобретателен в отношении компьютерных имен):

nightcracker@nightcracker-pc:~/c/sha256$ time ./test
11881376

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

Так что 11881376 / 182.4 = 65139 хешей в секунду.Тогда 26^7/101821/3600 = 34 часов для вычисления всех хешей.Обратите внимание, что все это было сделано на четырехъядерном процессоре Q6600 в однопоточном приложении и исключало запись хэшей в файл.

EDIT

Woops,Я вычислял все хэши строк с N символами и ниже .Исправлено и данные обновлены.

8 голосов
/ 04 марта 2012

Помните, что графический процессор может хэшировать в 50-100 раз быстрее, чем центральный процессор.Его сложнее программировать, но эффективнее.Смотрите www.bitcointalk.com для номеров.Я знаю, что я делаю 622 миллиона SHA-256 в секунду на Radeon HD5830.

...