python3 生成密码字典

黑客破解密码通常会用到密码字典^[密码字典,是配合密码破译软件所使用的。密码字典里包括许多人们习惯性设置的密码,这样可以提高密码破译软件的密码破译成功率和命中率,缩短密码破译的时间。—— 密码字典],网上会看到各种各样的密码生成器,那么本文就一起用 python3 实现一个简单的密码生成器吧,就叫它 keykey 吧!

20181021154012962176683.png

本文实现的密码生成器,非常简单和暴力,其实就是穷举^[Python - 自导自演 密码字典暴力破解],哈哈哈!

知识点

  • itertools,是 python 内建库,提供了很多操作迭代对象的函数接口,本文生成密码主要用到的就是 product 方法。
  • argparse,这是用于解析命令参数的库,python 内建的,argparse 库的使用 介绍了基本使用方法,可以了解下。

实现

因为暴力生成密码是很简单的操作,所以只需跟着十里操作就明白怎么实现了。

准备工作

本文实现使用的都是 python3 内建库,所以不需要安装第三方库。

  1. 新建脚本文件keykeytouch keykey

  2. 赋予文件运行权限:chmod +x keykey

  3. 为脚本文件注明python解释器,文件中添加内容:

    #!/usr/bin/env python3
    
  4. 导入需要用到的库,文件中:

    import os
    import argparse
    import itertools
    

生成密码列表

下一步实现密码列表生成的方法 getkeyslist,文件中添加以下代码:

def getkeyslist(minlength, maxlength, choices='0123456789'):
    """生成 minlength ~ maxlength 位密码列表,并返回列表
    Args:
        minlength: 密码最小位数
        maxlength: 密码最大位数
        choices: 候选字符,密码使用的字符从候选字符中得到
    Returns:
        keyslist: 密码列表
    """
    if choices is None:
        choices = '0123456789'
    keyslist = []
    for i in range(minlength, maxlength + 1):
        keyiter = itertools.product(choices, repeat=i)
        keys = [''.join(c)+'\n' for c in keyiter]
        keyslist.append(keys)
    print(f'[+] 已生成 {minlength} ~ {maxlength} 位密码字典 [+]')
    return keyslist

其中:

  • itertools.product(choices, repeat=i) 生成一个迭代器,迭代器每次迭代会从 choices 中提取字符组成包含 i 个字符的 tuple ,每个 tuple 中的元素为单个字符,如下的样子,迭代器会枚举所有可能的 i 个字符组合。

    ('0', '1', '2', '3')
    
  • [''.join(c)+'\n' for c in keyiter] 会使用字符串的 join 方法将迭代生成的 tuple 中的字符练成字符串生成长度为 上述的 i 长度的密码。

  • for 循环是为了生成位数在 minlength ~ maxlength 之间左右可能的组合的密码。

保存密码列表

生成了密码列表还需要保存的,所以封装一个保存密码列表的函数:

def save_keys_dict(keyslist, outfile):
    """保存密码字典
    Args:
        keyslist: 密码列表
        outfile: 要保存的密码字典文件
    """
    if outfile is None:
        homepath = os.path.expanduser('~')
        outfile = os.path.join(homepath, 'Desktop/keys.txt')
    else:
        outfile = os.path.abspath(outfile)
    with open(outfile, 'w') as f:
        for keys in keyslist:
            f.writelines(keys)
    print(f'[+] 已保存密码字典到 {outfile} [+]')

这个没什么好说的,就是使用 with 语法实现安全的文件写入操作,将密码列表写入到指定文件中,为了防止指定文件为空,这里会使用 ~/Desktop/keys.txt

获取命令参数

使用 argparse 库解析命令参数,这里将相关操作封装到函数 getargs 中,最终返回参数信息:

def getargs():
    """获取命令参数
    """
    parser = argparse.ArgumentParser(description='用于生成指定长度和字符空间的密码字典')
    parser.add_argument('minlength', type=int, help='用于指定生成密码的最小位数')
    parser.add_argument('maxlength', type=int, help='用于指定生成密码的最大位数')
    parser.add_argument('-o', '--outfile', help='指定字典文件的保存路径')
    parser.add_argument('-c', '--choices', default='0123456789', help='指定字符串,密码中的字符从字符串中选择,默认为 "0123456789"')
    return parser.parse_args()

命令参数设计详情如下表:

参数 类型 描述
minlength int 用于指定生成密码的最小位数
maxlength int 用于指定生成密码的最大位数
-o, –outfile 文件路径 指定字典文件的保存路径
-c, –choices 字符串 指定字符串,密码中的字符从字符串中选择,默认为 “0123456789”

main实现

最终整合一下,实现 main:

if __name__ == '__main__':
    args = getargs()
    if args.minlength < args.maxlength:
        keyslist = getkeyslist(args.minlength, args.maxlength, args.choices)
    else:
        keyslist = getkeyslist(args.maxlength, args.minlength, args.choices)
    save_keys_dict(keyslist, args.outfile)

其中, if 是为了防止 minlengthminlength 大的情况。

完整代码参考:tools-with-script/keykey/keykey

使用

获取工具帮助信息

$  ./keykey -h
usage: keykey [-h] [-o OUTFILE] [-c CHOICES] minlength maxlength

用于生成指定长度和字符空间的密码字典

positional arguments:
  minlength             用于指定生成密码的最小位数
  maxlength             用于指定生成密码的最大位数

optional arguments:
  -h, --help            show this help message and exit
  -o OUTFILE, --outfile OUTFILE
                        指定字典文件的保存路径
  -c CHOICES, --choices CHOICES
                        指定字符串,密码中的字符从字符串中选择,默认为 "0123456789"

生成 4~6 位数字密码

$ ./keykey 4 6
[+] 已生成 4 ~ 6 位密码字典 [+]
[+] 已保存密码字典到 /Users/5km/Desktop/keys.txt [+]
$ head -n 5 /Users/5km/Desktop/keys.txt
0000
0001
0002
0003
0004

指定密码字典保存文件

$ ./keykey 4 6 -o keys.txt
[+] 已生成 4 ~ 6 位密码字典 [+]
[+] 已保存密码字典到 /Users/5km/Documents/workspace/python/tools-with-script/keykey/keys.txt [+]
$ head -n 5 keys.txt
0000
0001
0002
0003
0004

指定密码可选择字符

$ ./keykey 4 6 -o keys.txt -c 'asdfghjkl'
[+] 已生成 4 ~ 6 位密码字典 [+]
[+] 已保存密码字典到 /Users/5km/Documents/workspace/python/tools-with-script/keykey/keys.txt [+]
$ head -n 5 keys.txt
aaaa
aaas
aaad
aaaf
aaag

总结

一切顺利的话,到目前就实现了一个简单的密码字典生成器。本文复习了 itertoolsargparse 的知识和部分使用方法,希望对您有所帮助!感谢您的阅读!