我试图在使用UNIX将“裂纹”的隐窝(3)加密C到开发的程序。 最简单的方式做到这一点是暴力破解,我猜。我想我应该创建一个包含通过密码可以,然后让他们的所有可能的排列,并将它们存储在一个二维数组(其中所有的1名字符的密码得到所保存的第一行等中的)所有符号的数组循环。有没有更好的方式来做到这一点?这是与循环相当混乱。

有帮助吗?

解决方案

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

要anwser您的循环的问题,这里是一些代码回路在给定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);
}

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

想象其中当前字是“zzzc”的情况。反过来,每个条目被递增,检测其溢出,它被复位为0,并且下一个条目被认为是,直到最后一个条目,其不溢出,以得到“000D”。

其他提示

关于这一问题的评论者指出的 - 你没有必要的RAM,而你并不需要保存一切

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

实现完全覆盖的一种方法是通过置换的数量来迭代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))


许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top