我要创建一个分布式密码破解程序,在其中我将使用蛮力技术,因此我需要字符串的每种组合。
为了分发,Server
将为Client
提供一系列字符串,例如从"aaaa"
到"bxyz"
。我假设字符串长度为四。因此,我需要检查这两个界限之间的每个字符串。
我试图在C中生成这些字符串。我试图为此做逻辑,但是我失败了。我也在Google上搜索,但没有任何好处。任何想法?
编辑
对不起兄弟,我要编辑
我想在范围内组合字符串,让我们假设在aaaa
和aazz
之间是像aaaa aaab aaac aaad ..... aazx aazy aazz
这样的字符串。我的字符空间只是上下左右的英文字母,大约是52个字符。我想检查4个字符的每个组合。但是Server将在其客户端之间分配字符串范围。我的问题是,如果一个客户端的范围在aaaa
和aazz
之间,那么我将如何在这些界限之间生成字符串。
最佳答案
如果您的字符串仅包含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 = 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
之类的功能开始一个过程,给出begin
,end
和字符chars
的向量。关于c - 产生字串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14006879/