Python基礎之破解加密壓縮包


在日常工作生活中,經常用到壓縮文件,有些為了安全保密,還專門設置了密碼,如果忘記密碼要怎么破,這時暴力破解就派上了用場,本文以一個簡單的小例子,簡述如何通過Python中的zipfile模塊進行破解,僅供學習分享使用,如有不足之處,還請指正。

准備工作

在本例中,首先准備一個帶密碼的zip壓縮包,采用winrar進行壓縮,如下所示:

設置zip文件密碼,如下所示:

注意:一定要采用zip傳統加密,否則python的zipfile模塊將無法解壓成功。

破解步驟

1. 下載密碼字典

本例采用密碼字典+多線程方式進行破解,首先需要下載密碼字典,密碼字典包含常用的密碼,有多個文件,所有需要采用多線程方式,以提高破解效率。密碼字典格式如下:

2. 導入模塊文件

需要導入zipfile模塊,及多線程相關和文件目錄相關模塊,如下所示:

1 import zipfile
2 import time
3 import threading
4 import os.path
5 import os

3. 單個密碼解壓函數

通過zipfile對象的extractall可以進行解壓,解壓成功,則停止;否則,繼續。如下所示:

 1     def extract(self, file, password):
 2         try:
 3             self.threadLock.acquire()
 4             if self.is_running:
 5                 # password = str(password)
 6                 zfile = zipfile.ZipFile(file, mode='r')
 7                 zfile.extractall(path=".", pwd=password.encode(encoding='utf-8'))
 8                 print("the password is {}".format(password))
 9                 end_time = time.time()
10                 print('the end time is {}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))))
11                 print("spend time is {}".format(end_time - self.start_time))
12                 # 成功解壓其余線程終止
13                 self.is_running = False
14                 zfile.close()
15         except Exception as e:
16             print('嘗試密碼:{},不對'.format(password))
17             # print(e)
18         finally:
19             self.threadLock.release()

4. 遍歷單個密碼字典文件 

遍歷單個密碼字典文件,並調用解壓函數進行解壓,如下所示:

 1     def single_pwd_file(self, root, pwd_file):
 2         """單個密碼本破解"""
 3         file = os.path.abspath("django.zip")
 4         print(file)
 5         pwd_file = os.path.abspath(os.path.join(root, pwd_file))
 6         print("遍歷{}文件".format(pwd_file))
 7         try:
 8             with open(pwd_file, mode='r', encoding='utf-8') as f:
 9                 pwd = f.readline()
10                 while pwd:
11                     if self.is_running:
12                         self.extract(file, pwd.strip())
13                     else:
14                         break
15                     pwd = f.readline()
16         except Exception as e:
17             pass

5. 遍歷所有密碼字典文件

遍歷所有密碼字典文件,每一個字典文件,采用一個線程,如下所示:

 1     def start(self):
 2         """通過密碼本破解"""
 3         self.start_time = time.time()
 4         print('the start time is {}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))))
 5         root = r"wpa2pojiezidian"
 6         for root, dirs, files in os.walk(root, topdown=True):
 7             for pwd_file in files:
 8                 if pwd_file.endswith('.txt') or pwd_file.endswith('.TXT'):
 9                     if self.is_running:
10                         t = threading.Thread(target=self.single_pwd_file, args=(root, pwd_file,))
11                         t.start()
12                         # t.join()
13                     else:
14                         break

破解示例

本例為了測試,采用的密碼比較簡單,所以破解比較快,如下所示:

源碼下載鏈接

為何一定要勾選傳統加密?

默認情況下,WinRAR在CTR模式下使用AES-256加密ZIP存檔。雖然AES-256比ZIP 2.0傳統加密算法安全得多,但它可能與一些較舊的解壓軟件不兼容。如果需要與這些工具兼容,可以在密碼對話框中啟用“ZIP傳統加密”選項,或在命令行模式下使用-mezl開關。              

Python標准庫中的zipfile模塊僅支持CRC32加密的zip文件。

一定能暴力破解嗎?

采用密碼字典文件的方式進行破解,密碼字典只是收錄了常規的密碼,如果加密密碼正好不在密碼字典文件中,則無法破解。暴力破解,通俗的講就是逐個密碼取嘗試,有可能需要破解幾天,甚至更長時間,才可能會成功。所以技術理論上可行,但實際上可行性並不高。

備注

蘇幕遮·燎沉香

【作者】周邦彥【朝代】宋

燎沉香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽干宿雨、水面清圓,一一風荷舉。

故鄉遙,何日去。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。

意境唯美的古詩詞,讓人心醉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM