python函数和类

函数

曾经有一句非常出名的话是 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()

应该看到的结果

该脚本将输入的元素根据一定的规则修改,添加后当作新元素添加到元素列表中去,最后将元素列表排列组合得到最后的字典列表

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏钱塘大数据

理工男图解零维到十维空间,烧脑已过度,受不了啦!

让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

26730
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.1K20
来自专栏腾讯社交用户体验设计

ISUX Xcube智能一键生成H5

50620
来自专栏钱塘大数据

中国互联网协会发布:《2018中国互联网发展报告》

在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

13150
来自专栏前端桃园

知识体系解决迷茫的你

最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

19440
来自专栏怀英的自我修炼

考研英语-1-导学

英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

11210
来自专栏腾讯大讲堂的专栏

白底黑字or黑底白字,眼睛更喜欢哪一个?

11910
来自专栏微信公众号:小白课代表

不只是软件,在线也可以免费下载百度文库了。

不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

43230
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

26440
来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

17230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励