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