表格中超鏈接圖片,打開的圖片都是網頁打開的(excel超鏈接打開圖片)
976
2025-03-31
老爸說他有個照片文件夾打不開了,讓我過去看看,一瞅,好家伙,加密壓縮包塵封老照片呀。
既然加密,沒準還有意外收貨。
作為一個“精靈鬼”,這么有價值的數據,我必須幫老爸解開呀
。
尋找思路
解密壓縮包的思路是什么?
答:通過各種密碼去嘗試解壓文件。
用什么解壓文件?
答: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('失敗啦!')
1
2
3
4
5
6
7
8
9
10
完成任務,成功解壓文件,zip 文件和 python 代碼放置在同一目錄。
解壓帶密碼的文件
下面假裝不知道密碼,通過密碼進行解壓,設置密碼為 1234。
import zipfile try: # 創建 ZipFile 對象 with zipfile.ZipFile('511.zip') as zfile: # 解壓文件 zfile.extractall(path='./', pwd=b"1234") print('文件解壓成功') except: print('失敗啦!')
1
2
3
4
5
6
7
8
9
10
成功解壓,后文就可以通過這種思路,對壓縮包進行解壓。
中文亂碼問題
在測試的時候,還發現了如果文件名是中文,解壓之后文件名出現亂碼情況,修正它。
找到 Python 安裝中的 Lib 文件夾,然后打開 zipfile.py 文件,直接修改源碼。
搜索 fname_str = fname.decode("cp437"),再后面添加如下內容。
fname_str = fname_str.encode("cp437").decode('gbk')
1
搜索 filename = filename.decode('cp437'),再后面追加如下代碼。
filename = filename.encode("cp437").decode('gbk')
1
保存該文件,再對測試文件進行解壓,解壓成功,文件名無錯誤。
解密文件
進入正式環節,接下來就要解密老爸的壓縮包了,這么有價值的壓縮包,可別打不開。
假設老爸的密碼是 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
非常簡單的運行幾秒之后,文件解壓成功。
正在測試密碼: 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
1
2
3
4
5
6
7
8
9
10
11
12
13
此時相信大佬們已經發現問題,如果密碼不是 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)
1
2
3
4
5
6
7
8
上述代碼用到了 itertools.permutations ,該函數的用法如下:
# 函數原型 itertools.permutations(iterable, r=None)
1
2
連續返回由 iterable 元素生成長度為 r 的排列。
如果 r 未指定或為 None ,r 默認設置為 iterable 的長度,這種情況下,生成所有排列。
所以使用上述代碼,可以快速的生成指定位數的密碼,后續只需要傳入老爸密碼的位數,即可不變動代碼就進行程序測試了。
import zipfile import itertools 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, 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
經過改良之后,你可以動態控制密碼的長度了,如果需要特殊符號也可以繼續擴充 my_password_str 字符串。
擴展思路
密碼的獲取一定要自己生成嗎?
答:有種文件叫做密碼本,所以去找到一些,然后逐行讀取就好了。
一個個的解密太慢了,有高效的辦法嗎?
答:多線程或者多進程破解,一個進程讀一個密碼本,每個進程下面在啟用幾個線程去分段解析密碼。
事件后續
代碼雖然寫好了,但文件解密我用多線程輪詢了 2 天,還是沒有解開(相當真實的體驗了)。
由于不知道密碼組成和密碼位數,也不知道算到何年何月去了,我決定還是從老爸那里在找找突破口,“逼問了”一下常用的密碼,尤其是知道其銀行卡密碼之后,得到重要突破點。
解密結果:最終的最終嘗試一周之后,文件解開了,密碼不復雜,姓的首字母+123789。
本因為是我的姓名+生日,最后得一波感動,然而我還是多慮啦,哈哈哈。
今天是持續寫作的第
152
/ 200 天。
求、求評論、求。
有任何疑問都可以在評論區詢問,有問必答~
本文,以后沒準能用到哦~
Python 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。