需要蛮力代码帮助的crypt(3)
-
20-09-2019 - |
题
我试图在使用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))
不隶属于 StackOverflow