Python实战-暴力破解zip文件解压密码

Python实战-暴力破解zip文件解压密码使用Python暴力解压传统加密的ZIP文件。

大家好,又见面了,我是你们的朋友全栈君。

简介

使用的核心模块是python标准库中的zipfile模块。这个模块可以实现zip文件的各种功能,具体可以查看官方参考文档。这里的暴力破解的意思是对密码可能序列中的值一个一个进行密码尝试,这对人来说是很难的,可是对计算机而言并不难。有时候我们下载的zip文件需要密码解压而我们不知道,需要付费才知道。所有这里主要介绍两种暴力破解的密码:纯数字密码和英文数字组合密码。

 

文件创建

首先测试文件为test.txt(仅包含单行文本),压缩后文件为test.zip,压缩密码为2340,压缩后删除目录下的txt文件。。

Python实战-暴力破解zip文件解压密码

Python实战-暴力破解zip文件解压密码

Python实战-暴力破解zip文件解压密码

 

上图注意勾选传统加密。

 

 

 

纯数字密码

指的是不用0开头的数字密码,0开头见后面的字母组合。原理就是zipfile模块解压压缩文件时,一旦密码不正确,程序会终止,在try语句只有成功解压的密码才会执行到extract函数调用后面的语句。

代码:

import zipfile
import time
import threading
startTime = time.time()
# 判断线程是否需要终止
flag = True


def extract(password, file):
    try:
        password = str(password)
        file.extractall(path='.', pwd=password.encode('utf-8'))
        print("the password is {}".format(password))
        nowTime = time.time()
        print("spend time is {}".format(nowTime-startTime))
        global flag
        # 成功解压其余线程终止
        flag = False
    except Exception as e:
        print(e)


def do_main():
    zfile = zipfile.ZipFile("test.zip", 'r')
    # 开始尝试
    for number in range(1, 9999):
        if flag is True:
            t = threading.Thread(target=extract, args=(number, zfile))
            t.start()
            t.join()


if __name__ == '__main__':
    do_main()

Python实战-暴力破解zip文件解压密码

 

显然,解压成功,这里提一下这种编码 密码的方式只适用于传统zip加密,winrar有一种新式的默认加密方式,是不可以的。 

字母数字混合密码

这里情况密码组合太多,为了防止内存溢出,改用迭代器。这种情况费时很久,可以闲来无事挂着脚本。这里再次压缩文件,密码为python。

import zipfile
import random
import time
import sys


class MyIterator():
    # 单位字符集合
    letters = 'abcdefghijklmnopqrstuvwxyz012345678'
    min_digits = 0
    max_digits = 0

    def __init__(self, min_digits, max_digits):
        # 实例化对象时给出密码位数范围,一般4到10位
        if min_digits < max_digits:
            self.min_digits = min_digits
            self.max_digits = max_digits
        else:
            self.min_digits = max_digits
            self.max_digits = min_digits

    # 迭代器访问定义
    def __iter__(self):
        return self

    def __next__(self):
        rst = str()
        for item in range(0, random.randrange(self.min_digits, self.max_digits+1)):
            rst += random.choice(MyIterator.letters)
        return rst


def extract():
    start_time = time.time()
    zfile = zipfile.ZipFile("test.zip")
    for p in MyIterator(5, 6):
        try:
            zfile.extractall(path=".", pwd=str(p).encode('utf-8'))
            print("the password is {}".format(p))
            now_time = time.time()
            print("spend time is {}".format(now_time-start_time))
            sys.exit(0)
        except Exception as e:
            pass


if __name__ == '__main__':
    extract()

字符的序列组合很多,需要等待。

补充说明

很多人反馈这个方法无效,这主要是因为文件路径不正确(我的代码是默认该Python脚本所在目录下的zip文件进行解压的)和加密方式并非传统加密。这种暴力破解方法只在自己大致记得密码位数和密码格式(如只有字母等)时比较实用,完全的暴力破解是不现实的,毕竟做加密的也不是白做的。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142803.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WeakHashMap的原理

    WeakHashMap的原理简介WeakHashMap和HashMap一样,WeakHashMap也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以为null。不过WeakHashMap的键是“弱键”(注:源码中Entry中的定义是这样的:privatestaticclassEntry&lt;K,V&gt;extendsWeakReference implementsMap.Ent…

    2022年5月31日
    32
  • java中的数据类型有哪些?

    java中的数据类型有哪些?基本数据类型:boolean、char、byte、short、int、long、float、double引用数据类型:类、接口、数组

    2022年7月7日
    25
  • pycharm中文怎么改成英文_pycharm如何设置英文

    pycharm中文怎么改成英文_pycharm如何设置英文1、选择右上角file(文件)里的setting(设置)2、点击Pulgins,搜索chinese3、找到chinese(simplified)languagepack/中文语言包,一般是搜索里的第一个或第二个4、点击绿色按钮“restartIDE”,在弹出的对话框了选restart,结束。…

    2022年8月28日
    2
  • linux 软连接 创建/查看/删除[通俗易懂]

    linux 软连接 创建/查看/删除[通俗易懂]linux软件连接创建/查看/删除1、建立软链接具体用法是:ln-s源文件目标文件。源:实际存放文件的位置当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。-s是代号(symbolic)的意思注意:ln的链接…

    2022年9月26日
    3
  • 有return的情况下try catch finally的执行顺序(最有说服力的总结)

    有return的情况下try catch finally的执行顺序(最有说服力的总结)结论:1、不管有木有出现异常,finally块中代码都会执行;2、当try和catch中有return时,finally仍然会执行;3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;4、finally

    2022年6月16日
    27
  • sql左连接出现重复数据「建议收藏」

    情况说明:只需左表数据,右表数据只作为条件存在,左表数据与右边有1:n关系,左连接出现重复数据原因分析:由于1:n关系,右边数据连接后处于隐藏状态(类似),实际上数据未重复,由于只显示左边数据,就形成了数据重复情况例:左表:右表:左连接且只需要左表数据:如果取右表数据,上面显示的结果就不算重复:解决方法:直接对数据进行DISTINCT求唯一值,…

    2022年4月17日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号