看到論壇上各種貼子寫用python進行暴力破解的文章,於是自己也想去嘗試一下,不試不知道,一試嚇一跳,真的就像那句有名的”python由入門到放棄“,把論壇上別人的腳本全部自己敲一遍,運行不報錯,但也沒有正常解壓出來,然后就是全部拷下來運行,結果一樣,不能正常解壓。不知道在屏幕前的你看到我這篇文章有沒有遇到同樣問題,最后有沒有解決掉。
下面我也把我所遇到的問題代碼貼出來及解決的辦法,相信會對你有所幫助:
1 # -*- coding:utf-8 -*- 2 ''' 3 首先創建一個壓縮包,壓縮包密碼是6位純數字,該腳本的目的就是要正常解壓出這個壓縮包,我創建的壓縮包解壓密碼為 000100,主要是能快速看到結果 4 ''' 5 import zipfile 6 7 class ForceUnlock(): 8 9 # 先生成6位數字的密碼表並存入文件中 10 def generate_password_table(self): 11 with open("pwd_table.txt", 'w', encoding="utf-8") as f: 12 for i in range(1000000): 13 pwd = str(i).zfill(6) + "\n" 14 f.write(pwd) 15 16 def extract_file(self, zip_file, password): 17 try: 18 zip_file.extractall(pwd=bytes(password, "utf-8")) # 注意這個密碼是要以字節方式傳入 19 print("The extract password is:", password) 20 return True 21 except: 22 print(("current {} password is not correct").format(password)) 23 return False # 密碼不對,繼續破解 24 25 def main(self): 26 self.generate_password_table() 27 zip_file = zipfile.ZipFile("strict_test.zip") 28 with open("pwd_table.txt", 'r', encoding="utf-8") as f: 29 pwd_list = f.readlines() 30 for line in pwd_list: 31 pwd = line.strip("\n") 32 if self.extract_file(zip_file, pwd): 33 break # 密碼正確后退出循環 34 else: 35 continue 36 37 38 if __name__ == "__main__": 39 test = ForceUnlock() 40 test.main()
運行了該代碼無數次,都不能正常解壓出來,於是單獨把代碼擰出來運行,尼瑪竟然報密碼不對
1 import zipfile 2 fn = zipfile.ZipFile("strict_test.zip") 3 fn.extractall(pwd=b'100100') 4 5 6 報錯如下: 7 Traceback (most recent call last): 8 File "E:/05.Project/01.Python/Aziji-usefully/force_unlock_zipfile/d.py", line 10, in <module> 9 fn.extractall(pwd=b'100100') 10 File "C:\Program Files\Python37\lib\zipfile.py", line 1594, in extractall 11 self._extract_member(zipinfo, path, pwd) 12 File "C:\Program Files\Python37\lib\zipfile.py", line 1647, in _extract_member 13 with self.open(member, pwd=pwd) as source, \ 14 File "C:\Program Files\Python37\lib\zipfile.py", line 1516, in open 15 raise RuntimeError("Bad password for file %r" % name) 16 RuntimeError: Bad password for file <ZipInfo filename='strict_test.txt' compress_type=deflate external_attr=0x20 file_size=9 compress_size=24>
把這個錯誤在網上搜索了一翻,要么就是說密碼那塊輸入的格式不對,要么就是編碼用的不對,再找官方文檔關於該extractall方法的使用介紹,也找不到任何能解決這個問題的方法。
接下來對這個問題重新復盤一次:
1、使用zipfile在文件加密再解密,能正常解壓,說明加解密這它本身是沒問題
2、我是在window10 64bit上手動通過winrar創建的一個壓縮包,並設置格式為zip,下面是創建步驟
3、通過手動創建加密壓縮包去用代碼解壓就不行,那么問題可能是下面的可能
a),目前zipfile還不能很好的兼容windows端壓縮解壓方式,加解密方式不兼容
b),暫時還沒想到
問題解決方法:
有時候對一個問題過分的好奇,想着法都想把它搞定,尤其是搞定別人沒有遇到過的問題,想想都高興。於是重新把復盤里面步驟再試一次,在第二步創建壓縮包時,在最后設置密碼界面時好像跟在網上別人那看到的不一樣,別人的都只有兩個選項:顯示密碼和加密文件名,而我的卻有三個,多了一個ZIP傳統加密,難道多出來的這個選項就是為我這個問題而存在?想想都來勁,於是勾選上它再次運行代碼,奇跡出來了,可以正常解壓出來了,雖然問題是解決了,但這個選項是做啥用的,為什么會存在這個按鈕,於是又去搜索了一翻,沒搜索到關於這個ZIP傳統加密有價值介紹,按目前我的測試來看,估計就是用來被破解的作用,哈哈。