簡介
使用的核心模塊是python標準庫中的zipfile模塊,這個模塊可以實作zip檔案的各種功能,具體可以查看官方參考檔案,這里的暴力破解的意思是對密碼可能序列中的值一個一個進行密碼嘗試,這對人來說是很難的,可是對計算機而言并不難,有時候我們下載的zip檔案需要密碼解壓而我們不知道,需要付費才知道,所以這里主要介紹兩種暴力破解的密碼:純數字密碼和英文數字組合密碼,
檔案創建
很多人學習python,不知道從何學起, 很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手, 很多已經做案例的人,卻不知道如何去學習更加高深的知識, 那么針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼! QQ群:861355058 歡迎加入,一起討論 一起學習!
首先測驗檔案為test.txt(僅包含單行文本),壓縮后檔案為test.zip,壓縮密碼為2340,壓縮后洗掉目錄下的txt檔案,,
上圖注意勾選傳統加密,
純數字密碼
指的是不用0開頭的數字密碼,0開頭見后面的字母組合,原理就是zipfile模塊解壓壓縮檔案時,一旦密碼不正確,程式會終止,在try陳述句只有成功解壓的密碼才會執行到extract函式呼叫后面的陳述句,
代碼:
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()
顯然,解壓成功,這里提一下這種編碼 密碼的方式只適用于傳統zip加密,winrar有一種新式的默認加密方式,是不可以的,
字母數字混合密碼
這里情況密碼組合太多,為了防止記憶體溢位,改用迭代器,這種情況費時很久,可以閑來無事掛著腳本,這里再次壓縮檔案,密碼為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):
# 實體化物件時給出密碼位數范圍,一般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檔案進行解壓的)和加密方式并非傳統加密,這種暴力破解方法只在自己大致記得密碼位數和密碼格式(如只有字母等)時比較實用,完全的暴力破解是不現實的,畢竟做加密的也不是白做的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/348159.html
標籤:Python
