我們知道,壓縮文件可以設(shè)置解壓密碼,用來保護(hù)壓縮包中的文件不被非法解壓縮。但是加密的壓縮文件長時(shí)間不使用難免我們自己都要忘記了。接下來,我們通過一個(gè)程序來破解壓縮文件的密碼。
這里需要使用到的三個(gè)庫,分別是、time、三個(gè)庫,第一個(gè)用來調(diào)用庫中的函數(shù)來解壓文件,其中可以傳一個(gè)pwd參數(shù)來解壓;第二個(gè)是用來對(duì)時(shí)間的操作,第三個(gè)是多線程庫。
根據(jù)自己實(shí)際的需要,創(chuàng)建一個(gè)工程,選擇好等參數(shù)后即可創(chuàng)建。如下圖所示。
但需要注意的是“ site-”選項(xiàng),其主要是用來繼承基礎(chǔ)中已經(jīng)安裝的庫,如果此處不勾選,使用創(chuàng)建的工程則沒有基礎(chǔ)中已經(jīng)安裝的庫,一般建議勾選。
如果不勾選,則可以在中”file>"菜單中找到“”窗口,窗口的左側(cè)找到:xxx下的“ ”,在這里也可以為當(dāng)前工程安裝對(duì)應(yīng)的庫文件(此處為在線更新,需要網(wǎng)絡(luò))。
如上圖所示,點(diǎn)擊中間的加號(hào),搜索對(duì)應(yīng)的庫文件即可在線安裝。下面開始正式的程序的編寫。
如上圖所示,先將三個(gè)庫引入程序。
startTime=time.time()
flag=True
定義兩個(gè)變量,一個(gè)用來計(jì)算解壓所用時(shí)間,flag用來作為解壓成功與否的標(biāo)記變量。
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)
定義一個(gè)自定義函數(shù),名稱為,傳兩個(gè)參數(shù),一個(gè)是密碼,一個(gè)是需要解壓的文件。將傳遞進(jìn)來的int類型的轉(zhuǎn)換為str類型,然后用次密碼來嘗試解壓文件,此時(shí),大概率會(huì)解壓失敗,此處則使用try和來輸出“e”,即當(dāng)前解壓失敗的錯(cuò)誤信息。注意,此時(shí)的flag依然為true。
def do_main():
zfile=zipfile.ZipFile("1.zip",'r')
for num in range(1,999999):
if flag is True:
t=threading.Thread(target=extract,args=(num,zfile))
t.start()
t.join()
if __name__=='__main__':
do_main()
再定義一個(gè)名稱為的自定義函數(shù),來執(zhí)行密碼的枚舉任務(wù)。將定義一個(gè)循環(huán)體,即實(shí)現(xiàn)密碼從至,每循環(huán)一次沒有解壓碼怎么解壓文件,來判斷一次flag是否為true沒有解壓碼怎么解壓文件,為true則繼續(xù)嘗試解壓(大多數(shù)情況下會(huì)失敗,所以flag一直為true),當(dāng)為true時(shí)使用方法來執(zhí)行一次函數(shù)來嘗試解壓一次,解壓失敗則輸出失敗的原因e。
當(dāng)解壓成功后,輸出解壓文件,然后輸出解壓所用時(shí)間,再將flag標(biāo)記變量置于false,即可完成程序。
完整的程序如下圖所示。
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("1.zip",'r')
for num in range(1,999999):
if flag is True:
t=threading.Thread(target=extract,args=(num,zfile))
t.start()
t.join()
if __name__=='__main__':
do_main()
注意,此方法只作為技術(shù)探討,當(dāng)我們?cè)O(shè)置一個(gè)純數(shù)字六位的密碼時(shí),完全掃描一遍至少需要200秒的時(shí)間,當(dāng)使用字母、數(shù)字、符號(hào)并且區(qū)分大小寫的密碼,位數(shù)再增加到16位以上,枚舉完所有密碼的可能性,就以當(dāng)前電腦的運(yùn)算水平,可能需要好幾個(gè)世紀(jì)的時(shí)間。:D
那么問題來了,使用字母、數(shù)字和符號(hào)的破解程序怎么編寫呢?