-1

我正在创建一个分布式密码破解器,我将在其中使用蛮力技术,所以我需要字符串的每个组合。

为了分发,Server将给出Client一系列字符串,例如 from "aaaa"to "bxyz"。我假设字符串长度为四。所以我需要检查这两个界限之间的每个字符串。

我正在尝试在 C 中生成这些字符串。我正在尝试为此制定逻辑,但我失败了;我也在谷歌上搜索过,但没有任何好处。任何的想法?

编辑

对不起兄弟,我想编辑它

我想要一个范围内的字符串组合,让我们假设介于aaaa和之间aazz的字符串就像aaaa aaab aaac aaad ..... aazx aazy aazz.. 我的字符空间只是大小写的英文字母,就像 52 个字符。我想检查 4 个字符的每个组合。但服务器将在其客户端之间分配字符串范围。我的问题是,如果一个客户的范围介于两者之间aaaaaazz那么我将如何在这些范围之间生成字符串。

4

2 回答 2

3

如果您的字符串只能理解 ASCII 表,则上限为 256 个字符或 2^8 个字符。

由于您的字符串长度为 4 个字符,因此您将有2^8 * 2^8 * 2^8 * 2^8组合或2^8^4 = 2^32组合。

只需拆分数字范围并在每台机器中开始组合。

您可能对此感兴趣:计算第 N 个排列步骤?

编辑

考虑到您的编辑,您的组合空间将是52^4 = 7.311.616组合。

然后,您只需要为每台机器划分这些“任务”以进行计算,因此,7.311.616 / n = r具有r每台机器计算的排列数量——最后一台机器可以计算r + (7.311.616 % n)组合。

由于您知道要在每台机器中构建的组合数量,因此您必须在每台机器中执行以下操作:

function check_permutations(begin, end, chars) {

    for (i = begin; i < end; i++) {

        nth_perm = nth_permutation(chars, i);
        check_permutation(nth_perm); // your function of verification

    }

}

该功能nth_permutation()不难推导,我很确定您可以在我发布的链接中获得它。

在此之后,您只需使用诸如 的函数启动一个过程check_permutations,给出beginend和 字符向量chars

于 2012-12-22T22:01:47.150 回答
0

您可以生成包含所有排列的树。例如,就像在这个伪代码中一样:

strings(root,len)
    for(c = 'a' to 'z')
        root->next[c] = c
        strings(&root->next[c], len - 1)

由 调用strings(root, 4)

之后,您可以遍历树以获取所有排列。

于 2012-12-22T22:05:00.200 回答