什么是写密码破解算法的有效方法(python)

问题描述:

这个问题可能相对简单,但我给了两个文本文件。一个文本文件包含通过python中的crypt.crypt加密的所有加密密码。另一个列表包含超过400k +的正常字典单词。什么是写密码破解算法的有效方法(python)

该赋值是给定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 

预先感谢。

+3

'return crypted_pa​​ss == encrypted' – SilentGhost 2010-05-23 20:56:01

+5

'返回加密== crypt.crypt(明文,加密)' – 2010-05-23 20:58:03

不知道底层散列算法的细节和算法的可能弱点,所有你可以做的就是运行一个强力攻击,试图在你的密码列表中的单词的所有可能的转换。

加速这种暴力攻击的唯一方法是获得更强大的硬件,并分裂任务并同时运行裂解器。

+0

作为一个轻微的空间优化,可能会成功地尝试单词未改变,然后再开始改变它们。人们倾向于使用真实的语言,并且使用包括数字等排列组合的可能性要小得多。当然,如果这是作业,YMMV。 ;) – 2010-05-23 21:06:55

+0

是啊@JosephMastey,但是这看起来像作业,在这种情况下,你的假设不会成立 – inspectorG4dget 2010-05-23 21:33:40

+0

@ inspectorG4dget当然可以,但假设这位教授提出了一个合理现实的数据集,只是为了让我对我感觉更好拥有CS学位。 – 2010-05-23 22:15: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个密码破解,而且它们都符合转换后的字典单词,你应该在一两个小时内完成。这可以吗?因为没有其他可以做的事情了,除非在你能掌握的尽可能多的节点和核心上分配这个不寻常的并行问题(哦,并且首先使用一台更快的机器 - 这可能会给你买到一两倍或左右)。

没有可以添加的深层次优化技巧,所以一般逻辑将是三重嵌套循环:一个级别循环遍历加密密码,一个遍历字典中的单词,一个遍历变体每个字典的单词。关于如何嵌套的东西没有太大的区别(为了简单起见,除了变体上的循环必须出现在单词的循环内)。我建议封装“给我这个词的所有变种”作为一个生成器(为了简单起见,不是为了速度),否则将函数调用次数最小化(例如,没有理由使用该函数,因为内联代码同样清晰,并且将在显微镜下更快)。