Python 创建黑客字典

黑客字典,其实就是一些常用的字符集合,往往包含了大量的刻意生成的字符串组合,用来暴力破解某些密码。我们可以用python,只书写几行代码,就可以迭代生成大量我们需要的字符串组合。

前提

黑客字典,其实就是一些常用的字符集合,往往包含了大量的刻意生成的字符串组合,用来暴力破解某些密码。我们可以用python,只书写几行代码,就可以迭代生成大量我们需要的字符串组合。

首先简单的介绍下用到的2个库:stringitertools

  • 介绍 string 模块中几个有用的全局变量:

    • string.letters: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
    • string.printable: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
    • string.lowercase: abcdefghijklmnopqrstuvwxyz
    • string.uppercase: ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • itertools 是python的循环器库。循环器是对象的容器,包含有多个对象。itertools.product() 的结果为笛卡尔积,相当于一个嵌套循环。itertools.chain()将多个循环器结合成单个循环器。更多关于 itertools

代码

# !/usr/bin/env python
# coding:utf-8

import sys
import string
import itertools

def get_strings():
    chars = string.printable[:10]
    strings = []
    for i in xrange(min, max + 1):
        strings.append((itertools.product(chars, repeat=i),))
    return itertools.chain(*strings)


def make_dict(file, list_str):
    f = open(file, 'a')
    for x in list_str:
        print x
        for y in x:
            f.write("".join(y))
            f.write('\n')
    f.close()
    print 'Done'


if __name__ == '__main__':
    if len(sys.argv) == 4:
        try:
            min = int(sys.argv[1])
            max = int(sys.argv[2])
        except:
            print "wrong"
            sys.exit(0)

        if min <= max:
            list_str = get_strings()
            file = str(sys.argv[3])
            make_dict(file, list_str)
            sys.exit(0)
    else:
        print "missing some argvs"

结果

这里我们的脚本文件为dict.py,后面的参数分别为密码的最小长度、密码的最大长度以及保存的字典文件名。上面的例子运行成功后会在脚本文件同级目录下生成一个dict.txt的字典文件,其中包含6位随机纯数字的所有组合。