ROB BOWDEN:我是抢夺和 让我们开裂。 所以请记住,从PSET规范 我们要需要使用 crypt函数。 对于该男子页面,我们有两个 哈希定义_xopensource。 不要担心,为什么 我们需要做的。 哈希包括unistd.h中。 所以一旦出的方式,让 得到的实际方案。 我们需要做的第一件事是确保 用户输入一个有效的加密 在命令行中的密码。 请记住,该方案应该 运行像点斜线裂缝, 然后加密的字符串。 所以,我们在这里检查,以确保 ARGC如果我们想 继续与程序。 如果argc是不是两个,这意味着 用户没有输入加密 在命令行中的密码,或者他们 进入不仅仅是加密 在命令行中的密码,其中 情况下,我们不知道做什么用的 命令行参数。 因此,如果ARGC是两个,我们可以继续进行。 而在这里,我们要申报 一个可变的加密。 只是将原来的别名 argv1使整个 程序,我们不必叫它argv1, 然后你必须要考虑 关于这实际上意味着。 所以最后,我们想要验证 的加密的密码的用户 进入实际上已经 加密的密码。 每地穴的手册页, 加密后的密码必须是13 字符长。 在这里,注意到我们哈希定义 加密长度为13。 所以我们要做的仅仅是确保 字符串长度的加密 密码是13。 而且,如果它不是,我们希望 退出程序。 所以一旦出的方式,我们可以 现在实际上是试图找到什么 加密后的密码了 密码。 在这里,我们要抢盐 从加密的密码。 记住,每手册页 前两个字符加密 字符串,喜欢这里 - 50ZPJ等等 - 前两个字符给 我们所使用的盐 在隐窝功能。 而在这里,我们看到,盐公顷。 所以,我们要复制前两个 字符,盐长度哈希 定义为两个。 我们要复制前两个字符 到这个数组,盐。 请注意,我们需要盐长度加上 一,因为我们仍然需要一个空 终结者结束时,我们的盐。 然后我们要宣布这个数组, 客人,尺寸最大长度加 1,最大长度为哈希定义 八,因为最大的密码 是8个字符长。 我们要使用这个迭代 在所有可能的字符串,可以 有效的密码。 因此,如果有效的密码中的字符 只是一个,B,和c,然后 我们会遍历A,B,C, AA,BA,CA,依此类推,直到 我们能看到CCCCCCCC - 8个C。 如果我们没有向下有效 密码,然后我们需要说 加密后的字符串是不 有效的开始。 所以,现在,我们达到这个而1环。 请注意,这意味着它的 一个无限循环。 注意有没有break语句 里面的这个无限循环。 只有return语句。 所以,我们从来没有真正期望 退出循环。 我们只希望退出程序。 我已经添加print语句 这个循环的顶部刚刚打印出来 我们目前的猜测 密码是什么。 现在,这个循环做? 它遍历所有可能的字符串 这可能是有效的密码。 我们要做的第一件事是 我们目前的猜测是什么 密码是。 我们将采取的盐,我们抓住 加密后的字符串,我们很 要加密的猜测。 这将给我们一个加密的猜测, 我们要比较 加密后的字符串,用户 在命令行中输入。 如果它们是相同的,在这种情况下, 字符串比较将返回0,如果 它们是相同的,那么猜 生成的加密的密码 字符串,在这种情况下,我们可以打印 作为我们的密码和回报。 但是,如果他们不一样的,那 意味着我们的猜测是不正确的。 我们想要遍历 下一个有效的猜测。 所以,这就是这一段时间 循环正在尝试做的。 这将重申我们的猜测 到下一个有效的猜测。 请注意,当我们说一个 我们的猜测有特定字符 达到的最大象​​征,在这里 哈希定义为一个波浪线,因为 这是最大的ASCII值字符 用户可以输入上面的 键盘,当字符到达 最大的象征,那么,我们要发送 它备份的最小的符号,这 是一个空间,又是最低的ASCII码 价值符号让用户能够 从键盘输入。 因此,我们要集 的最小的符号。 然后,我们会去 到下一个字符。 那么,如何是我们的猜测 要重复? 好吧,如果有效的字符是A,B, 和c,那么我们就开始用, 它会遍历到B,它会 遍历到c。 c是我们最大的象征,因此,我们将设置 C回,最低的象征。 然后我们会遍历索引 到下一个字符。 因此,如果最初的猜测是c时,下一个 字符将是空 终止符。 这里,请注意,如果该字符 我们现在要 增量是空终止, 然后我们将它设置为 最小的象征。 因此,如果猜测是C,那么,我们的 新的猜测将是一个。 而且,如果我们原来的猜测 CCCC,那么我们的新猜测 将是AAAAA。 因此,每当我们达到最大的字符串 给定长度,那么我们 要实现的最小字符串 下一个的长度,这将 只是所有字符 最低的象征。 现在,这个检查在这里干什么? 好吧,如果指数从第八 字符至9个字符 - 所以我们加8个C的 我们之前的猜测 - 那么指数将会把重点放在 最后空终结我们的猜测 数组,它并不意味着实际上 用在我们的密码。 因此,如果我们集中在这最后的空 终结者,那么我们还没有找到一个 有效使用的密码,只是八 字符,表示不存在 有效的加密的密码 给定的字符串。 我们必须要打印,称 我们无法找到一个有效的 密码,然后返回。 所以这个while循环迭代 在所有可能的字符串。 如果发现任何加密 预期加密的字符串,它会 返回该密码。 它并没有发现任何东西,然后 它将返回,印刷 是不是能找到什么。 现在,请注意,在所有迭代 可能的字符串可能会 需要一段时间。 让我们真正看到如何 长期需要。 让我们破解。 嗯,哎呀呀 - 说未定义 参考地穴。 所以请记住,对于p设置规范, 地穴的man页面,我们 需要链接隐窝。 现在,默认的命令 不知道你 要使用该功能。 因此,让我们复制这个客户端命令 只需添加到年底 连接地穴。 现在,它编译。 因此,让我们在一个给定的运行破解 加密后的字符串 - 所以撒的。 所以这是相当快的。 请注意,这13结束。 那么,凯撒的加密密码 恰好是13。 因此,让我们尝试其他密码。 让我们赫塞豪恩的加密 密码和尝试开裂,。 因此,我们注意到已经达到 三个字符。 我们遍历所有可能 三个字符的字符串。 这意味着我们已经完成 遍历所有可能的一个 两个字符串。 现在,它看起来像这样去 在我们到达之前,需要一段时间的 四个字符的字符串。 这可能需要一两分钟。 它没有采取一两分钟。 我们四个字符的字符串。 但是现在,我们需要遍历所有 可能四个字符的字符串,这 也许可能需要10分钟。 然后,当我们到达5个字符 字符串,我们需要遍历所有 的那些,这可能 采取了几个小时。 我们需要遍历所有可能的 六个字符的字符串,这 可能需要几天等等。 因此,它可能需要很长的一个潜在的 遍历所有可能 八字符和字符串较少。 因此,注意到,这不一定是 非常有效的算法寻找 输入密码。 你可能会认为 是更好的方法。 例如,密码ZYX!32AB 可能不是一个很常见的密码, 而密码12345 可能很多较为常见。 所以试图找到一个密码的方法之一 更快速的只是看 是比较常见的密码。 因此,例如,我们可以尝试读单词 从一本字典,并尝试所有 这些话作为我们的密码猜测。 现在,也许一个密码 是不是很简单。 用户也许有点聪明 并尝试附加一个数字 一个字的结尾。 所以,也许他们的密码为password1。 所以,你可以尝试遍历所有单词 字典中的一个 追加到它的结束。 后话,说不定这样做,你会 追加两到它的结束。 或者,也许用户甚至试图 更聪明,他们希望自己的 密码是“黑客”,但他们 要更换电子商务的所有实例 三分球。 所以,你可以做到这一点。 遍历所有单词在字典 但替换的字符 这些数字看起来像数字。 所以这种方式,你可能会赶上什至更多 密码是很常见的。 但最终,只有这样,你可以 捕获所有密码暴力破解 迫使遍历所有 可能的字符串。 所以在最后,你需要遍历 从一个字符的所有字符串 八个字符,这可能需要 很长一段时间,但你需要做到这一点。 我叫罗布鲍登。 这是破解。