手把手教你使用Python解決簡單的zip文件解壓密碼
簡介
使用的核心模塊是python標準庫中的zipfile模塊。這個模塊可以實現(xiàn)zip文件的各種功能,具體可以查看官方參考文檔。這里的暴力破解的意思是對密碼可能序列中的值一個一個進行密碼嘗試,這對人來說是很難的,可是對計算機而言并不難。有時候我們下載的zip文件需要密碼解壓而我們不知道,需要付費才知道。所以這里主要介紹兩種暴力破解的密碼:純數(shù)字密碼和英文數(shù)字組合密碼。
文件創(chuàng)建
首先測試文件為test.txt(僅包含單行文本),壓縮后文件為test.zip,壓縮密碼為2340,壓縮后刪除目錄下的txt文件。。
上圖注意勾選傳統(tǒng)加密。
純數(shù)字密碼
指的是不用0開頭的數(shù)字密碼,0開頭見后面的字母組合。原理就是zipfile模塊解壓壓縮文件時,一旦密碼不正確,程序會終止,在try語句只有成功解壓的密碼才會執(zhí)行到extract函數(shù)調(diào)用后面的語句。
代碼:
import zipfile import time import threading startTime = time.time() # 判斷線程是否需要終止 flag = True def extract(password, file): try: password = str(password) file.extractall(path='.', pwd=password.encode('utf-8')) print("the password is {}".format(password)) nowTime = time.time() print("spend time is {}".format(nowTime-startTime)) global flag # 成功解壓其余線程終止 flag = False except Exception as e: print(e) def do_main(): zfile = zipfile.ZipFile("test.zip", 'r') # 開始嘗試 for number in range(1, 9999): if flag is True: t = threading.Thread(target=extract, args=(number, zfile)) t.start() t.join() if __name__ == '__main__': do_main()
顯然,解壓成功,這里提一下這種編碼 密碼的方式只適用于傳統(tǒng)zip加密,winrar有一種新式的默認加密方式,是不可以的。
字母數(shù)字混合密碼
這里情況密碼組合太多,為了防止內(nèi)存溢出,改用迭代器。這種情況費時很久,可以閑來無事掛著腳本。這里再次壓縮文件,密碼為python。
import zipfile import random import time import sys class MyIterator(): # 單位字符集合 letters = 'abcdefghijklmnopqrstuvwxyz012345678' min_digits = 0 max_digits = 0 def __init__(self, min_digits, max_digits): # 實例化對象時給出密碼位數(shù)范圍,一般4到10位 if min_digits < max_digits: self.min_digits = min_digits self.max_digits = max_digits else: self.min_digits = max_digits self.max_digits = min_digits # 迭代器訪問定義 def __iter__(self): return self def __next__(self): rst = str() for item in range(0, random.randrange(self.min_digits, self.max_digits+1)): rst += random.choice(MyIterator.letters) return rst def extract(): start_time = time.time() zfile = zipfile.ZipFile("test.zip") for p in MyIterator(5, 6): try: zfile.extractall(path=".", pwd=str(p).encode('utf-8')) print("the password is {}".format(p)) now_time = time.time() print("spend time is {}".format(now_time-start_time)) sys.exit(0) except Exception as e: pass if __name__ == '__main__': extract()
字符的序列組合很多,需要等待。
補充說明
很多人反饋這個方法無效,這主要是因為文件路徑不正確(我的代碼是默認該Python腳本所在目錄下的zip文件進行解壓的)和加密方式并非傳統(tǒng)加密。這種暴力破解方法只在自己大致記得密碼位數(shù)和密碼格式(如只有字母等)時比較實用,完全的暴力破解是不現(xiàn)實的,畢竟做加密的也不是白做的。
到此這篇關(guān)于手把手教你使用Python解決簡單的zip文件解壓密碼的文章就介紹到這了,更多相關(guān)Python zip文件解壓密碼內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。