17

我想知道根据不同字符集破解哈希所需的数学时间。

例如,仅使用 7 个字母的 US-ASCII 字母字符,我们知道可以使用 26 7 个可能的序列。知道一台计算机每分钟可以生成多少个这样的信息,可以让我了解生成所有可能的散列并破解某个 7 个字符的散列(生日攻击除外)需要多长时间。

例如,以上面的数字为例,如果现代四核每分钟可以生成 100 万个散列,则需要8031810176 / 1000000 / 60 = 133.86数小时才能找到该范围内所有可能的散列。

此外,带有原生 AES 的新 Sandy Bridge 英特尔芯片如何发挥作用?

4

2 回答 2

13

我使用 OpenSSL SHA256 实现用 C 语言编写了这个测试。

#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 四核 CPU 上完成的,并且不包括将哈希写入文件。

编辑

糟糕,我正在计算具有 N 个字符及以下的字符串的所有哈希值。已更正并更新数据。

于 2011-01-22T00:50:08.640 回答
10

请记住,GPU 的散列速度比 CPU 快 50 到 100 倍。它更难编程,但更有效。有关数字,请参见 www.bitcointalk.com。我知道我在 Radeon HD5830 上每秒执行 6.22 亿次 SHA-256。

于 2012-03-04T03:02:10.887 回答