这个问题可能相对简单,但我得到了两个文本文件。一个文本文件包含所有通过python中的crypt.crypt加密的加密密码。另一个列表包含了超过400k+标准的字典单词。
任务是给定3个不同的函数,它们将字符串从正常情况转换为所有不同的大写排列,将字母转换为数字(如果它看起来类似,例如G -> 6,B -> 8),并颠倒字符串。问题是,给定密码文件中的10 - 20个加密密码,在python中获得运行速度最快的解决方案来对单词文件中的字典单词运行这些函数的最有效方法是什么?给定所有这些单词,当以任何方式转换时,都将加密为密码文件中的密码。
下面的函数检查加密后的给定字符串是否与传入的加密密码相同:
def check_pass(plaintext,encrypted):
crypted_pass = crypt.crypt(plaintext,encrypted)
if crypted_pass == encrypted:
return True
else:
return False提前谢谢。
发布于 2010-05-24 05:01:23
在不了解底层散列算法的细节和该算法可能存在的弱点的情况下,您所能做的就是运行一个暴力攻击,尝试对密码列表中的单词进行所有可能的转换。
加速这种暴力攻击的唯一方法是获得更强大的硬件,并拆分任务并并行运行破解程序。
发布于 2010-05-24 08:37:16
在我的慢速笔记本电脑上,crypt.crypt大约需要20微秒:
$ python -mtimeit -s'import crypt' 'crypt.crypt("foobar", "zappa")'
10000 loops, best of 3: 21.8 usec per loop因此,暴力方法(实际上是唯一明智的方法)是“有点”可行的。通过应用您的转换函数,您将获得(大致估计)每个字典单词大约100个转换单词(主要来自大小写变化),因此,整个字典中大约有4000万个转换单词。每个20微秒,大约需要800秒,可以称之为15分钟,因为尝试破解其中一个实际上并不对应于任何变体的密码的努力;预计时间约为一半,破解确实对应的密码。
因此,如果你有10个密码要破解,而且它们都与转换后的字典单词相对应,那么你应该在一两个小时内就可以破解了。这样可以吗?因为除了将这个令人难堪的并行问题分布在尽可能多的节点和核心上之外,您还能做什么(哦,首先使用一台速度更快的机器--这可能会为您带来大约两倍的收益)。
没有可以添加的深度优化技巧,因此一般逻辑将是一个三重嵌套循环:一级循环遍历加密的密码,一级循环遍历字典中的单词,一级循环遍历每个字典单词的变体。关于如何嵌套东西没有太大的区别(除了变体上的循环必须在单词上的循环内,为了简单起见)。我建议将“给我这个单词的所有变体”封装为一个生成器(为了简单起见,而不是为了速度),或者以其他方式最小化函数调用的数量(例如,没有理由使用该check_pass函数,因为内联代码同样清晰,并且会更快)。
https://stackoverflow.com/questions/2893391
复制相似问题