生成字符串

时间:2012-12-22 21:53:47

标签: c distributed-computing brute-force

我是在创建一个分布式密码破解程序,我将使用强力技术,所以我需要每个字符串组合。

为了分发,Server会为Client提供一系列字符串,例如从"aaaa""bxyz"。我假设字符串长度为4。所以我需要检查这两个边界之间的每个字符串。

我正在尝试用C语言生成这些字符串。我试图为此制作逻辑但是我失败了;我也在谷歌搜索但没有任何好处。有什么想法吗?

修改

对不起兄弟们,我想编辑它

我想要在一个范围内组合字符串,让我们假设aaaaaazz之间的字符串是aaaa aaab aaac aaad ..... aazx aazy aazz ..我的字符空间只是上下英文字母就像52个字符。我想检查4个字符的每个组合。但是Server会在其客户端之间分配字符串范围。我的问题是,如果一个客户端获得aaaaaazz之间的范围,那么我将如何在这些边界之间生成字符串。

2 个答案:

答案 0 :(得分:3)

如果您的字符串只能理解ASCII表,那么您将拥有256个字符或2 ^ 8个字符作为上限。

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

只需分割数字范围并在每台机器中启动组合。

您可能对此感兴趣:Calculating Nth permutation step?

修改

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

然后,您只需要为每台机器划分这些“任务”进行计算,因此,7.311.616 / n = rr作为每台机器计算的排列量 - 最后一台机器可能计算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的字符。

答案 1 :(得分:0)

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

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

strings(root, 4)调用。

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