使用python编写生成密码字典的脚本需要用到itertools模块
。
3个需要用的函数:
- permutation(iterable, r):返回terble中元素所有组合长度为r的项目序列,r省略则默认取iterable中项目的数量。例如itertools.Permutations(‘abc’,3),从“abc" 中按顺序排列组合长度为 3进行输出, 即abc, acb, bac, bca, cab, cba。
- product(*iterables[, repeat]):可以获得多个循环器的笛卡儿积。例如product(“123”,“abe”),得到的结果是la, 1b, 1c, 2a, 2b, 2c,3a, 3b, 3c。
- repeat(object[, times]) :这个函数的作用就是重复元素,未指定times则会一直重复。例如repeat(100),即100,100, …
接下来编写一个密码字典的生成脚本,具体步骤如下。
需要的文件:person_information,TopPwd(常用密码)
person_information
目标姓名全拼:zhangwei
目标姓名简拼:zw
目标手机号码:12341564567
目标生日:19930916
目标生日(年):1993
目标生日(月/日):0916
目标QQ号:435446654
目标爱人姓名全拼:wangfang
目标爱人姓名简拼:wf
目标爱人手机号码:18945658432
目标爱人的生日:19971011
目标爱人生日(年):1997
目标爱人生日(月/日):1011
# -*- coding: utf-8 -*-
import itertools
def ReadInformationList():
try:
informationFile = open('person_information','r')
lines = informationFile.readlines()
for line in lines:
infolist.append(line.strip().split(':')[1]) #数据处理,获取值
except Exception as e:
print(e + "\n")
print("Read person_informaiton error!")
def CreateNumberList():
#数字元素
words = '0123456789'
itertoolsNumberList = itertools.product(words,repeat=3)
#利用itertools产生不同的数字排列,数字组合长度为3
for number in itertoolsNumberList:
numberList.append("".join(number))
def AddTopPwd():
try:
#读取toppwd文件,并存入paaaword字典文件
informationFile = open('TopPwd','r')
lines = informationFile.readlines()
for line in lines:
dictionaryFile.write(line)
except Exception as e:
print(e + "\n")
print("Read TopPwd error!")
def CreateSpecialList():
#添加特殊字符模块
specialwords = '`~!@#$%^&*()_+?|/<>,.'
for i in specialwords:
specialList.append("".join(i))
def Combination():
for a in range(len(infolist)):
if (len(infolist[a]) >= 8 ):
#个人信息大于8位的直接存储到字典
dictionaryFile.write(infolist[a] + "\n")
else:
needWords = 8 - len(infolist[a])
#个人信息不足8位的补到8位存储
for b in itertools.permutations("1234567890",needWords):
dictionaryFile.write(infolist[a] + ''.join(b) + "\n")
for c in range(0,len(infolist)):
if (len(infolist[a] + infolist[c]) >= 8):
dictionaryFile.write(infolist[a] + infolist[c] + '\n')
#将个人元素两两进行拼接,大于8位输入字典
for d in range(0,len(infolist)):
for e in range(0, len(specialList)):
if (len(infolist[a] + specialList[e] + infolist[d] ) >= 8 ):
#特殊字符加到中间
dictionaryFile.write(infolist[a] + infolist[d] + specialList[e] + "\n")
#特殊字符加到尾部
dictionaryFile.write(infolist[a] + specialList[e] + infolist[d] + "\n")
#加到中间
dictionaryFile.write(specialList[e] + infolist[a] + infolist[d] + "\n")
dictionaryFile.close()
if __name__ == "__main__":
global dictionaryFile
# 创建字典文件
dictionaryFile = open('passwords','w')
global infolist
#用户信息列表
infolist = []
global numberList
#数字列表
numberList = []
global specialList
specialList = []
ReadInformationList()
#读取个人信息文件
CreateNumberList()
#创建数字列表
CreateSpecialList()
AddTopPwd()
#常见密码写入字典
Combination()
#主函数
print('\n' + u"字典生成成功!" + "\n" + '\n' + u"字典文件名:passwords")
kali下的crunch字典脚本学习
min 设定最小字符串长度(必选)
max 设定最大字符串长度(必选)
oprions
-b 指定文件输出的大小,避免字典文件过大
-c 指定文件输出的行数,即包含密码的个数
-d 限制相同元素出现的次数
-e 定义停止字符,即到该字符串就停止生成
-f 调用库文件(/etc/share/crunch/charset.lst)
-i 改变输出格式,即aaa,aab -> aaa,baa
-I 通常与-t联合使用,表明该字符为实义字符
-m 通常与-p搭配
-o 将密码保存到指定文件
-p 指定元素以组合的方式进行
-q 读取密码文件,即读取pass.txt
-r 定义重某一字符串重新开始
-s 指定一个开始的字符,即从自己定义的密码xxxx开始
-t 指定密码输出的格式
-u 禁止打印百分比(必须为最后一个选项)
-z 压缩生成的字典文件,支持gzip,bzip2,lzma,7z
Crunch特殊字符
1、% 代表数字
2、^ 代表特殊符号
3、@ 代表小写字母
4、, 代表大写字符
特殊字符一般与参数 -t 配合使用