检查从aaa..a到zzz..z的每个“单词”

时间:2013-09-26 02:15:24

标签: c multithreading loops crypt

我的程序应该是一个暴力密码破解者(学校作业)。 输入参数如下..

./crack threads keysize target

程序需要检查密钥长度的密码,还需要检查较短的密码。 我不确定如何写一些只会一次改变一个字母的东西,然后继续这样做.. (keysize max将变为8)

实施例..

keysize = 5,所以循环(我认为)需要修改等于“aaaaa”到“aaaab”到“aaaac”的东西,将每个结果与盐(前两个)一起放入crypt_r() target )的字符,直到找到匹配项。

我正在使用crypt_r,因为下一步是添加多线程。

不确定是否真的需要其他任何东西来解释这个问题。很高兴澄清。

2 个答案:

答案 0 :(得分:2)

我们来看看。有10 ^ n个可能的n位十进制数。所以有26 ^ 8个可能的8个字符的密码只使用字母a-z。这可以达到208,827,064,576。

您可以使用简单的64位计数器跟踪数字,然后将数字转换为基数为26的表示。类似的东西:

long max = 208827064576;
longlong counter = 0;

while (counter < max)
{
    char password[9];
    GetPassword(counter, password);
    // do whatever you want with the password
    ++counter;
}

void GetPassword(longlong count, char* pass)
{
    int i;
    int rem;
    if (count == 0)
    {
        pass[0] = 'a';
        pass[1] = '\0';
        return;
    }
    i = 0;
    do
    {
        int rem = count % 26;
        pass[i] = 'a' + rem;
        ++i;
        count /= 26;
    } while (count > 0)
}

通过使用counter变量的互锁增量,您可以轻松地将其用于多个线程。或者您可以拆分搜索空间,以便一个线程从0开始,一个线程从26 ^ 7开始(这将是baaaaaaa)等。

2000亿是一个相当大的数字。十亿秒可以达到接近32年的水平。即使你可以每秒检查几千个(不太可能),你也需要花一些时间进行详尽的搜索。

答案 1 :(得分:1)

此代码将循环显示所有密码,不超过给定的长度且只包含az的字母:

#include <stdio.h>
int main(void) {
    char password[9] = {0};
    int keysize = 5;
    for (;;) {
        // get next password value
        // we do it by adding 1 in 26-al system
        int level = 0; // current level, starts at 0
        while (level < keysize) {
            if (password[level] == 0) {
                password[level] = 'a';
                break;
            }
            if (password[level] >= 'a' && password[level] < 'z') {
                password[level]++;
                break;
            }
            if (password[level] == 'z') {
                password[level] = 'a';
                level++;
            }
        }
        if (level >= keysize)
            break; // we have checked all passwords!
        // check if password matches:
        //printf("Checking password: '%s'\n", password);
        if (check_password(password)) {
            printf("Hooray! Password found: %s\n", password);
            break;
        }
    }
    return 0;
}

如果您将aphabet限制为abc并设置keysize = 4,则会检查以下密码:

  

abc aa ba ca ab bb cb ac bc cc aaa baa caa aba bba cba aca bca cca aab bab cab abb bbb cbb acb bcb ccb aac bac cac abc bbc cbc acc bcc ccc aaaa baaa caaa aba bbaa cbaa acaa bcaa ccaa aaba巴巴caba abba bbba cbba acba bcba ccba aca baca ccaca abca bbca cbca acca bcca ccca aaab baab caab abab bbab cbab acab bcab ccab abb babb cabb abbb bbbb cbbb acbb bbbb ccbb abb bacb cacb abcb bbcb cbcb accb bccb cccb aaac baac caac abac bbac cbac acac bcac ccac aabc babc cabc abbc bbbc cbbc acbc bcbc ccbc aacc bacc cacc abcc bbcc cbcc accc bccc cccc

请在 IdeOne DEMO 上查看此示例。