在开发密码破解程序是,一定会遇到的问题就是密码字典的实现方式。目录了解到的方法有两种。
一种是预先存好的密码字典文件,在暴力破解时,随着位数的增加,必然会需要有多个大小以G计算的字典文件。文件太大,还不能打开。数量过多,占用大量电脑存储空间。
另一种方式,程序中用如下方式实现, for password in itertools.product(chars, repeat=length):随着破解位数,字符类型的增加,会需要占用大量的内存。最终必然会达到极限,造成系统崩溃。还有一个缺陷就是,程序流程被固定死,一旦循环过程中途停止,就还需要再从头开始了,效率低下。
下面的代码思路,是按照进位制的思想,对密码生成过程进行了简化。将密码字符集合总数看做是进制数,对当前正在使用的密码数组序号按新进制进行加一运算。最后按序号列表去密码字符集合提取最终生成的密码。这样,程序占用空间不大,也不需要存储字典文件。程序可以中途停止,记录当前序号,就可以下次运行时,找到断点再继续运行。
代码如下
import array as arr def gen_code(pass_data,repeat_num): max_num = len(pass_data) #进制数 cur_index_ar = arr.array('i', []) #当前数字编号数组 max_index_ar = arr.array('i', []) #最大数字编号数组 cur_index_ch_ar = arr.array('u', []) #当前真实密码数组 for i in range(repeat_num): cur_index_ar.append(0) max_index_ar.append(max_num-1) #最大值数组 cur_index_ch_ar.append(pass_data[ cur_index_ar[0]]) #当前密码 cur_passwd_str = ''.join(cur_index_ch_ar) #总数记录 total_count = 0 while (max_index_ar!= cur_index_ar ): for i in range(repeat_num): if (cur_index_ar[repeat_num-i-1] == max_num-1): #应该进位了,归零 cur_index_ar[repeat_num-i-1] = 0 else: #不需要进位,只加一 cur_index_ar[repeat_num - i-1] += 1 # 没有进位,退出循环 break total_count += 1 for i in range(repeat_num): cur_index_ch_ar [i] =pass_data[cur_index_ar[i]] print((cur_index_ar)) cur_passwd_str = ''.join(cur_index_ch_ar) #密码生成,可以在这里加入破解函数 print(cur_passwd_str) #打印总数,用来检查 print("count = {}".format(total_count)) if __name__ == '__main__': #密码来源,以纯数字为例 pass_data = "0123456789" #密码长度,可以修改 repeat_num =4 gen_code(pass_data,repeat_num)
希望能对大家再做密码破解程序,有一定帮助。