电脑装配网

我爸电脑上有个加密压缩包,我给用 Python 给解开了

 人阅读 | 作者xiaolin | 时间:2023-09-04 12:19

本创作是本人在今日头条的原创首发内容,拒绝任何人任何形式搬运到其它平台发布!

封存的记忆:揭开加密压缩包的故事

我接到老爸的电话,说他有一个照片文件夹打不开,希望我过去看看。我走到他的书房,打开那个加密压缩包,里面存放着尘封的老照片。这可是个宝藏,也许里面还隐藏着一些意外的惊喜。

作为一个喜欢探索的人,我决定亲自帮助老爸解开这个加密的压缩包。首先,我需要找到一个解密的思路。

解密压缩包的思路可以总结为以下几个步骤:首先,通过各种可能的密码尝试来解压文件;然后,选择合适的解压工具,如zipfile和rarfile;最后,准备密码,可以是程序自行运算得到的,也可以从密码本中获取。

在整理清楚思路后,我开始动手实践。我知道Python中有内置的zipfile库,用于处理zip格式的文件,而rar格式则需要使用额外的rarfile库。

我先以zipfile库为例进行实验。

首先,我创建了一个没有密码的测试文件,用来练习解压操作。我使用了以下代码:

python

Copy code

import zipfile

try:

with zipfile.ZipFile('test_file.zip') as zfile:

zfile.extractall(path='./')

print('文件解压成功')

except:

print('解压失败!

')

这一步让我对解压操作有了更好的理解。接下来,我尝试解压一个带有密码的文件,我设置密码为1234。代码如下:

python

Copy code

try:

with zipfile.ZipFile('file_with_password.zip') as zfile:

zfile.extractall(path='./', pwd=b"1234")

print('文件解压成功')

except:

print('解压失败!

')

成功解压了一个带有密码的文件后,我发现一个问题,当文件名为中文时,解压后文件名会出现乱码。为了修正这个问题,我需要修改zipfile库的源码。我在Lib文件夹中找到zipfile.py文件,并添加了一行代码来修正乱码问题。

随着实践的深入,我进入了正式的解密阶段。老爸的压缩包肯定不是简单的密码,所以我决定编写一个程序来自动尝试不同的密码。

首先,我编写了一个函数来逐个尝试密码,假设密码是4位数:

python

Copy code

def ext_file(pwd):

try:

with zipfile.ZipFile('encrypted_file.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

然而,这种方法太过于单一,无法应对密码位数不确定的情况。

我决定寻找更加高效的解法。

在Python中,有一个内置的迭代器itertools.permutations,可以用来从一个字符串中取出指定位数的排列。我开始使用这个迭代器来生成密码,不再局限于固定位数。同时,我引入了多线程的概念,以提高破解速度。

python

Copy code

import itertools

import threading

def ext_file(pwd):

try:

with zipfile.ZipFile('encrypted_file.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)

def test_passwords(passwords):

for pwd in passwords:

print("正在测试密码:", pwd)

yield_pwd = pwd

ret = ext_file(yield_pwd)

if ret:

print("解密成功,密码是", yield_pwd)

break

if __name__ == '__main__':

my_password_str = "abcdefghijklmnopqrstuvwxyz0123456789"

password_length = 4

passwords = get_pwds(my_password_str, password_length)

num_threads = 8

threads = []

passwords_per_thread = len(my_password_str) ** password_length // num_threads

for i in range(num_threads):

start_idx = i * passwords_per_thread

end_idx = start_idx + passwords_per_thread

thread = threading.Thread(target=test_passwords, args=(passwords[start_idx:end_idx],))

threads.append(thread)

thread.start()

for thread in threads:

thread.join()

经过不懈的尝试,我终于成功地破解了压缩包,密码居然是老爸的名字的首字母加上一串数字。

我不禁感慨,有时候事情的答案并没有我们想象得那么复杂。

通过这次解密的经历,我不仅提升了对加密和解密的理解,还学会了如何合理地利用Python的库和多线程来解决实际问题。尽管过程中遇到了困难,但最终的收获让我倍感满足

和自豪。解开了加密压缩包,老照片被重新带回到现实,一段段青涩的记忆也重新浮现在眼前。

这个过程中,我不仅仅是在技术上获得了成长,更多的是体会到了探索的乐趣和坚持的价值。

就像解密这个压缩包一样,生活中的许多问题也需要我们耐心地寻找突破口,一步步解决。而不论是否成功,这个过程本身就是一个宝贵的经验。

当我把照片展示给老爸时,他感慨万分,一段段的往事在照片中得以重现。我了解到这些照片对他而言是多么重要,这也让我更加坚定了帮助他解开加密压缩包的决心。通过技术,我不仅仅是解决了一个难题,更是为家人带来了珍贵的回忆。

总结起来,这个加密压缩包的解密之旅充满了挑战和收获。


文章标签:

本文链接:『转载请注明出处』