高效编写密码破解算法的方法(Python)
这个问题可能看起来比较简单,但我手上有两个文本文件。一个文件里存的是用Python的crypt.crypt加密的所有密码,另一个文件里有超过40万个普通的字典单词。
任务是给我三个不同的函数,这些函数可以把字符串从正常形式转换成各种大小写的组合,能把字母转换成数字(如果它们看起来像,比如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
谢谢大家的帮助。
2 个回答
在我这台慢慢的笔记本电脑上,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
函数,因为内联代码同样清晰,而且会快一点点)。
如果你不知道具体的哈希算法和它可能存在的弱点,那么你能做的就是用暴力破解的方法,尝试你密码列表中所有可能的单词组合。
加快这种暴力破解的唯一方法就是使用更强大的硬件,并把任务分开,让多个破解程序同时运行。