函数
曾经有一句非常出名的话是 In Unix Everything Is A File,在unix中所有的一切都是文件
在这里可以借鉴一下 In Python Everything Is A Function,在python程序中,所有的一切都是函数,把所需的功能写成一个一个的函数,然后由函数调用函数,以此类推,最终完成整个程序的功能
记得之前提过暴力破解,不管用什么工具,暴力破解都少不了一个合适的字典,下面编写一个简单的程序makepasswordfilefunction.py,创建一个有针对性的专用密码字典
代码如下
# coding: utf-8
__author__ = 'www.py3study.com'
import os
import platform
import itertools
import time
def main():
'''主程序'''
global rawlist #原始数据列表
rawlist = []
global denylist #非法单词列表
denylist = [' ', '', '@']
global pwlist #最终的密码列表
pwlist = []
global minlen #密码的最小长度
minlen = 6
global maxLen #密码的最大长度
maxLen = 16
global timeout
timeout = 3
global flag
flag = 0
run = {
'0': exit, #退出
'1': getrawlist, #创建原始列表
'2': adddenylist, #添加不可能出现的元素
'3': clearrawlist, #清空列表
'4': setrawlist, #原始列表排序
'5': modifypasswordlen, #修改最终的密码长度
'6': createpasswordlist, #创建最终的字典列表
'7': showpassword, #显示密码
'8': createpassowrdfile, #创建密码文件
}
while True:
mainMenu()
op = input('输入选项:')
if op in map(str, range(len(run))):
run.get(op)()
else:
tipMainMenuInputError()
continue
def mainMenu():
'''主菜单'''
global denylist
global rawlist
global pwlist
global flag
clear()
print(u"||")
print(u"="*40)
print(u"|| 0:退出程序")
print(u"|| 1:输入密码原始字符串")
print(u"|| 2:添加非法字符串到列表")
print(u"|| 3:清空原始密码列表")
print(u"|| 4:整理原始密码列表")
print(u"|| 5:改变默认密码长度({}-{})".format(minlen, maxLen))
print(u"|| 6:创建密码列表")
print(u"|| 7:显示所有密码")
print(u"|| 8:创建字典文件")
print(u"||")
print(u"="*40)
print(u"||")
print(u"当前非法字符为:{}".format(denylist))
print(u"当前原始密码元素为:{}".format(rawlist))
print(u"共有密码{}个".format(len(pwlist)))
if flag:
print(u"已在当前目录创建密码文件dict.txt")
else:
print(u"尚未创建密码文件")
def clear():
'''清屏函数'''
OS = platform.system()
if (OS == u'Windows'):
os.system('cls')
else:
os.system('clear')
def tipMainMenuInputError():
'''错误提示'''
clear()
print(u"只能输入0-7的整数,等待{}秒后重新输入".format(timeout))
time.sleep(timeout)
def getrawlist():
'''获取原始数据列表'''
clear()
global denylist
global rawlist
print(u"输入回车后直接退出")
print(u"当前的原始密码列表为:{}".format(rawlist))
st = None
while not st == '':
st = input("请输入密码元素字符串:")
if st in denylist:
print(u"这个字符串是预先设定的非法字符串")
continue
else:
rawlist.append(st)
clear()
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:{}".format(rawlist))
def adddenylist():
'''添加非法词'''
clear()
global denylist
print(u"输入回车后直接退出")
print(u"当前非法字符为:{}".format(denylist))
st = None
while not st == '':
st = input("请输入需要添加的非法字符串:")
denylist.append(st)
clear()
print(u"输入回车后直接退出")
print(u"当前原始密码列表为:{}".format(denylist))
def clearrawlist():
'''清空原始数据列表'''
global rawlist
rawlist = []
def setrawlist():
'''整理原始数据列表'''
global rawlist
global denylist
a = set(rawlist)
b = set(denylist)
rawlist = []
for str in set(a - b):
rawlist.append(str)
def modifypasswordlen():
'''修改默认密码长度'''
clear()
global maxLen
global minlen
while True:
print(u"当前密码长度为{}-{}".format(minlen, maxLen))
min = input("请输入密码最小长度:")
max = input("请输入密码最大长度:")
try:
minlen = int(min)
maxLen = int(max)
except ValueError:
print(u"密码长度只能输入数字[6-18]")
break
if minlen not in range(6,19) or maxLen not in range(6,19):
print(u"密码长度只能输入数字[6-18]")
minlen = 6
maxLen = 16
continue
if minlen == maxLen:
res = input(u"确定将密码长度设定为{}吗?(Yy/Nn)".format(minlen))
if res not in list('yYnN'):
print(u"输入错误,请重新输入")
continue
elif res in list('yY'):
print(u"好吧,你确定就好")
break
else:
print(u"给个机会,改一下吧")
continue
elif minlen > maxLen:
print(u"最小长度比最大长度还大,可能吗?请重新输入")
minlen = 6
maxLen = 16
continue
else:
print(u"设置完毕,等待{}秒后回主菜单".format(timeout))
time.sleep(timeout)
break
def createpasswordlist():
'''创建密码列表'''
global rawlist
global pwlist
global maxLen
global minlen
titlelist = []
swapcaselist = []
for st in rawlist:
swapcaselist.append(st.swapcase())
titlelist.append(st.title())
sub1 = []
sub2 = []
for st in set(rawlist + titlelist + swapcaselist):
sub1.append(st)
for i in range(2,len(sub1) + 1):
sub2 += list(itertools.permutations(sub1, i))
for tup in sub2:
PW = ''
for subPW in tup:
PW += subPW
if len(PW) in range(minlen, maxLen + 1):
pwlist.append(PW)
else:
pass
def showpassword():
'''显示创建的密码'''
global pwlist
global timeout
for i in range(len(pwlist)):
if i % 4 == 0:
print("{}".format(pwlist[i]))
else:
print("{}".format(pwlist[i]))
print('\n')
print(u"显示{}秒,回到主菜单".format(timeout))
time.sleep(timeout)
def createpassowrdfile():
'''创建密码文件'''
global flag
global pwlist
print(u"当前目录下创建字典文件:dict.txt")
time.sleep(timeout)
with open('dict.txt', 'w') as fp:
for PW in pwlist:
fp.write(PW)
fp.write('\n')
flag = 1
if __name__ == '__main__':
main()
应该看到的结果
该脚本将输入的元素根据一定的规则修改,添加后当作新元素添加到元素列表中去,最后将元素列表排列组合得到最后的字典列表