我正在尝试用 C 语言开发一个程序,该程序将“破解”UNIX 使用的 crypt(3) 加密。
我想最幼稚的方法就是暴力破解。我想我应该创建一个包含密码可以具有的所有符号的数组,然后获取它们的所有可能的排列并将它们存储在一个二维数组中(其中所有 1 个字符的密码都保存在第一行等)通过 for循环。有没有更好的方法来做到这一点?循环非常混乱。
假设只能使用 62 个不同的字符,则存储所有可能的 8 个字符密码需要 62^8=198 TB。
来回答你loop问题,这里有一些代码,使用给定集合的字符来循环给定 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”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)