利用 Python 破解 ZIP 或 RAR 文件密碼

咱們常常會從網絡上下載一些帶密碼的壓縮包,想要獲取裏面的內容,每每就要給提供商支付一些費用。想要白嫖其中的內容,常見的作法是百度搜索一些壓縮包密碼破解軟件,但後果相信體驗過的人都知道。本文將會利用 Python 破解壓縮包的密碼,這裏以 ZIP/RAR 爲例。html

本文源碼可在微信公衆號「01 二進制」後臺留言「破解壓縮包」得到python

破解原理

其實原理很簡單,一句話歸納就是「大力出奇跡」,Python 有兩個壓縮文件庫:zipfilerarfile,這兩個庫提供的解壓縮方法 extractall() 能夠指定密碼,這樣的話首先生成一個密碼字典(手動或用程序),而後依次嘗試其中的密碼,若是可以正常解壓縮則表示密碼正確。git

實驗環境

本文采起的虛擬環境爲 Pipenv,有關 Pipenv 的詳細介紹能夠參考個人這篇文章 👉《Python 管理哪家強?》github

利用 Pipenv 安裝 rarfile網絡

pipenv install rarfile
複製代碼

最後,再將一個帶有密碼的壓縮包放入實驗環境中便可。多線程

編碼

知道原理後,編碼就會很是簡單了工具

準備密碼本

「密碼本」其實就是一個包含了全部可能密碼的文件,用戶能夠手動錄入,也能夠用程序錄入。文末還會有一個介紹。post

讀取壓縮文件

# 根據文件擴展名,使用不一樣的庫
if filename.endswith('.zip'):
    fp = zipfile.ZipFile(filename)
elif filename.endswith('.rar'):
    fp = rarfile.RarFile(filename)
複製代碼

嘗試解壓

先嚐試不用密碼解壓縮,若是成功則表示壓縮文件沒有密碼

fp.extractall(desPath)
fp.close()
print('No password')
return
複製代碼

暴力破解

try:
    # 讀取密碼本文件
    fpPwd = open('pwd.txt')
except:
    print('No dict file pwd.txt in current directory.')
    return
for pwd in fpPwd:
    pwd = pwd.rstrip()
    try:
        fp.extractall(path=desPath, pwd=pwd.encode())
        print('Success! ====>'+pwd)
        fp.close()
        break
    except:
        pass
fpPwd.close()
複製代碼

程序入口

if __name__ == '__main__':
    filename = sys.argv[1]
    if os.path.isfile(filename) and filename.endswith(('.zip', '.rar')):
        decryptRarZipFile(filename)
    else:
        print('Must be Rar or Zip file')
複製代碼

使用

若是想要使用上述代碼,咱們只需在命令行執行python main.py <filename>便可。例如python main.py test.zip

運行結果:

$ python main.py test.zip
Success! ====>323126
複製代碼

擴展

密碼本如何獲取?

看到這裏,細心的小夥伴必定會發現,最核心的其實不是代碼,而是**「密碼本」。理論上只要密碼本中的密碼足夠多,就必定能獲取到壓縮包的密碼,這也就是俗稱的「撞庫」**。

這時問題又來了,如何蒐集到足夠多的密碼?我在搜索資料的時候發現已經有人整理好了,我 fork 了一份到了本身的倉庫,有興趣的能夠點擊 👉爆破字典

如何加速破解過程?

解決了密碼本的問題,深刻思考的小夥伴的必定又會有新的疑問,密碼本既然如此龐大,那如何加速破解的過程呢?這裏給出兩個思路

多線程(進程)破解

密碼本若是不少且密碼數量龐大時,咱們能夠採用多線程(進程)的方式讀取密碼,一個進程讀一個密碼本,一個線程分段讀密碼。固然,若是是在 python 中,建議不要採用多線程,由於 python 中的線程就是雞肋,有興趣的能夠閱讀相關資料。

利用 GPU 加速

咱們以上的代碼都是運行在 CPU 上的,即便開啓多線程(進程)也只是利用到 CPU 的資源,但若是想要加速破解過程,咱們其實還能夠利用閒置的 GPU 資源。

在介紹爲何能夠利用 GPU 加速前,咱們須要明確一個觀點,二者都爲了完成計算任務而設計。

那爲何會想到使用 GPU 加速呢?這是就要說到二者的不一樣了:CPU 雖然有多核,但總數沒有超過兩位數,而且每一個核的運算能力極其強大。而 GPU 的核數遠超 CPU,但每一個核的運算能力與 CPU 的核相比就相差甚遠了。

咱們能夠簡單的舉個例子,解一道題,CPU 就是博士生,GPU 就是小學生,CPU 負責理解題目而且整理出解題的步驟以及解法,而 GPU 負責其中很簡單可是數量又很大的簡單運算就好了。

所以理論上在破解密碼的過程當中,咱們徹底可使用 GPU 來加速這一過程。

事實上,這樣的工具也已經出現了,Hashcat 即是最出名的一個,它號稱是世界上最快的密碼恢復工具,能夠基於 CPU/GPU 等工做。有興趣的能夠訪問他的官網hashcat.net/hashcat/進行了…


關注微信公衆號「01 二進制」,獲取更多 IT 資訊和技巧

相關文章
相關標籤/搜索