需要帮助加密的强力代码(3)

时间:2009-11-17 15:29:27

标签: c brute-force permutation crypt

我正在尝试用C开发一个程序,它将“破解”UNIX使用的crypt(3)加密。 最天真的方式就是强行推测我猜。我想我应该创建一个包含密码可以拥有的所有符号的数组,然后获取它们的所有可能的排列,并将它们存储在一个二维数组中(其中所有1个字符的密码都保存在第一行等)。循环。有没有更好的方法来做到这一点?循环非常混乱。

2 个答案:

答案 0 :(得分:3)

假设只能使用62个不同的字符,那么存储所有可能的8个字符的密码需要62 ^ 8 = 198太字节。

要回答你循环的问题,这里有一些代码可以使用给定集合的字符循环遍历给定len的所有可能密码:

int len = 3;
char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int nbletters = sizeof(letters)-1;

int main() {
    int i, entry[len];
    for(i=0 ; i<len ; i++) entry[i] = 0;
    do {
        for(i=0 ; i<len ; i++) putchar(letters[entry[i]]);
        putchar('\n');
        for(i=0 ; i<len && ++entry[i] == nbletters; i++) entry[i] = 0;
    } while(i<len);
}

主要部分是最后一个 for 循环。在大多数情况下,它只会递增第一个条目,并在那里停止,因为此条目尚未达到nbletters。如果条目达到nbletter,则意味着它必须返回到零,并且下一个条目的转向将增加。这确实是一个不寻常的循环条件:循环继续直到没有溢出。循环仅发生在最坏的情况下:当最后一个元素上有多个条目时。

想象一下当前单词是“zzzc”的情况。反过来,每个条目递增,检测到它的溢出,它被重置为0,并且考虑下一个条目,直到最后一个没有溢出的条目,给出“000d”。

答案 1 :(得分:0)

正如问题的评论者所指出的那样 - 你没有必要的内存,而且你不需要全部存储。

以排序顺序覆盖排列并不是最有效的密码破解方法,尽管它最终会有效。

实现完全覆盖的方法是通过排列数迭代0,并以字符集的大小为基础对值进行编码。这可以很容易地缩放到你的角色集的大小。

(伪代码,但你明白了)


passChars = '[all characters used in this attempt]'

permutationCount = 8^len(passChars) #crypt(3) only uses 8 chars

output = ''

for looper = 0 to permutationCount - 1
    localTemp = looper
    while localTemp > 0
        output += passchars[localTemp%len(passchars)] # % being modulus
        localTemp = floor(localTemp/len(passChars))