小白教程

 找回密码
 立即注册
小白教程 首页 Python技术文章 查看内容

用Python 给解开加密压缩包的方法

发布者: 小白教程

寻找的想法
解密压缩包的思想是什么?
答:尝试用各种密码解压缩文件。
用什么来解压缩文件?
答:zip使用zipfile, rar使用rarfile。Python已经为我们编写了它。您只需要调用它们的方法。
我在哪里可以找到密码?
答:程序自己计算或找到一个码本。
在理清思路后,你就可以开始了。

Zipfile和rarfile
Zipfile:内置Python,无需安装;
Rarfile:需要安装的文档参考:https://rarfile.readthedocs.io/api.html。
ExtracTall方法用于提取文件并生成对象。

下面以zipfile库为例进行说明。
通过Zipfile以静默方式解压缩一个无密码的文件并尝试它。
测试文件可以打包和压缩,先尝试英文或数字文件命名,尝试中文命名。
import zipfile

try:
    # 创建 ZipFile 对象
    with zipfile.ZipFile('测试文件.zip') as zfile:
        # 解压文件
        zfile.extractall(path='./')
        print('文件解压成功')
except:
    print('失败啦!')
任务完成后,解压成功,zip文件和python代码放置在同一个目录下。
用密码解压缩文件
假设您不知道密码,使用密码解压并将密码设置为1234。

import zipfile

try:
    # 创建 ZipFile 对象
    with zipfile.ZipFile('511.zip') as zfile:
        # 解压文件
        zfile.extractall(path='./', pwd=b"1234")
        print('文件解压成功')
except:
    print('失败啦!')

成功解压后,您可以使用这个想法来解压压缩包。
如果出现乱码的问题
测试中也发现如果文件名是中文,解压后文件名出现乱码,请更正。
在Python安装中找到Lib文件夹,然后打开zipfile.py文件并直接修改源代码。
搜索fname_str = fname.decode("cp437"),然后添加以下内容。
fname_str = fname_str.encode("cp437").decode('gbk')
搜索 filename = filename.decode('cp437'),再后面追加如下代码。
filename = filename.encode("cp437").decode('gbk')
保存文件,然后解压缩测试文件。解压成功,文件名正确。

解密文件
进入官方链接后,下一步就是解密老爸的压缩包。不要打开这么贵重的压缩包裹。
假设爸爸的密码是4位,可以直接编写以下代码进行测试。
提前准备好测试压缩包,破解密码设置为aaaf,密码如下:
import zipfile


def ext_file(pwd):

    try:
        # 创建 ZipFile 对象
        with zipfile.ZipFile('测试中文.zip') as zfile:
            # 解压文件
            zfile.extractall(path='./', pwd=pwd.encode('utf-8'))
            print('文件解压成功')
            return True
    except Exception as e:
        print('失败啦!', e)
        return False

# 先“细致入微”的实现一下,以后有好思路在修改
def get_pwds(my_password_str):
    for i1 in range(len(my_password_str)):
        for i2 in range(len(my_password_str)):
            for i3 in range(len(my_password_str)):
                for i4 in range(len(my_password_str)):
                    yield my_password_str[i1] + my_password_str[i2] + my_password_str[i3] + my_password_str[i4]


if __name__ == '__main__':
    my_password_str = "abcdefghijklmnopqrstuvwxyz0123456789"
    for pwd in get_pwds(my_password_str):
        print("正在测试密码:", pwd)
        yield_pwd = pwd
        ret = ext_file(yield_pwd)
        if ret:
            print("解密成功,密码是", yield_pwd)
            break
经过几秒钟的简单运行,文件成功解压缩。
1

正在测试密码: aaaa
失败啦! Bad password for file '测试中文.txt'
正在测试密码: aaab
失败啦! Bad password for file '测试中文.txt'
正在测试密码: aaac
失败啦! Bad password for file '测试中文.txt'
正在测试密码: aaad
失败啦! Bad password for file '测试中文.txt'
正在测试密码: aaae
失败啦! Bad password for file '测试中文.txt'
正在测试密码: aaaf
文件解压成功
解密成功,密码是 aaaf
这时,我相信已经发现了问题所在。如果密码不是4位数字,它是一个不确定的数字数目,那么需要修改我的微妙循环操作。
我也不知道爸爸的密码是多少位,这有点难。
更好的解决方案
Python中构建了一个迭代器,可用于从字符串中获取固定数量的密码。测试代码如下:
import itertools
my_pwdstr = 'abcdefghijklmnopqrstuvwxyz0123456789'
def ret_pwd():
    for x in itertools.permutations(my_pwdstr, 4):
        yield ''.join(x)

for item in ret_pwd():
    print(item)

上面的代码使用了itertools,这个函数的用法如下:
# 函数原型
itertools.permutations(iterable, r=None)
连续返回由iterable元素生成的长度为r的排列。
如果r未指定或为None, r默认设置为iterable的长度。在这种情况下,生成了所有的排列。
所以使用上面的代码,你可以快速生成一个有指定数字的密码,然后你只需要通过你父亲的密码的数字的数量,你可以测试程序,而不改变代码。
    try:
        # 创建 ZipFile 对象
        with zipfile.ZipFile('测试中文.zip') as zfile:
            # 解压文件
            zfile.extractall(path='./', pwd=pwd.encode('utf-8'))
            print('文件解压成功')
            return True
    except Exception as e:
        print('失败啦!', e)
        return False


def get_pwds(my_password_str, nums):
    for x in itertools.permutations(my_password_str, nums):
        yield ''.join(x)

if __name__ == '__main__':
    my_password_str = "abcdefghijklmnopqrstuvwxyz0123456789"
    for pwd in get_pwds(my_password_str, 4):
        print(len(pwd))
        print("正在测试密码:", pwd)
        yield_pwd = pwd
        ret = ext_file(yield_pwd)
        if ret:
            print("解密成功,密码是", yield_pwd)
            break
改进后,可以动态控制密码的长度。如果需要特殊符号,可以继续扩展my_password_str字符串。
扩张的想法
我必须自己生成密码吗?
答:有一种文件叫密码本,找一些逐行读就行了。
一个接一个的解密太慢了,有没有有效的方法?
答:对于多线程或多进程破解,一个进程读取一个代码本,并在每个进程下启用多个线程来解析部分中的密码。



Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-17 14:04 , Processed in 0.030944 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

返回顶部