如果你有壓縮包的密碼忘記了,并且壓縮包的加密算法采用的是ZipCrypto,并且壓縮參數(shù)如下圖所示:
那么你就可以使用本文中的方法進行破解。
壓縮包的加密,是根據(jù)輸入的密碼進行運算加密,輸入不同的密碼,加密后的結(jié)果就是不同的二進制流。所以在進行解密的時候,不同的密碼會解密出不同的結(jié)果,但是只有一種結(jié)果是你想要的正確的結(jié)果。
假設(shè)組成密碼的字符總共有 a 個,密碼是1 ~ n位,那么可以組合出 S 種不同的密碼,一個字符占一個字節(jié),所有密碼的所有字符加在一起總共有 Q 個字節(jié)。下面分別給出 S 和 Q 的計算公式:
S
=
a
1
+
a
2
+
a
3
+
a
4
+
.
.
.
.
.
.
+
a
n
(1)
S = a^1+a^2+a^3+a^4+... ...+a^n\tag{1}
S=a1+a2+a3+a4+......+an(1)
a
S
=
a
2
+
a
3
+
a
4
+
.
.
.
.
.
.
+
a
n
+
a
n
+
1
(2)
aS=a^2+a^3+a^4+... ...+a^n+a^{n+1}\tag{2}
aS=a2+a3+a4+......+an+an+1(2)
(1)式減去(2)式得:
(
1
?
a
)
S
=
a
1
?
a
n
+
1
(1-a)S=a^1-a^{n+1}
(1?a)S=a1?an+1
最后可以化簡得到:
S
=
a
(
1
?
a
n
)
1
?
a
.
S=\dfrac{a(1-a^n)}{1-a}.
S=1?aa(1?an)?.
Q
=
1
?
a
1
+
2
?
a
2
+
3
?
a
3
+
.
.
.
.
.
.
+
n
?
a
n
(3)
Q=1·a^1+2·a^2+3·a^3+... ... + n·a^n\tag{3}
Q=1?a1+2?a2+3?a3+......+n?an(3)
a
Q
=
1
?
a
2
+
2
?
a
3
+
3
?
a
4
+
.
.
.
.
.
.
+
(
n
?
1
)
?
a
n
+
n
?
a
n
+
1
(4)
aQ=1·a^2+2·a^3+3·a^4+... ...+(n-1)·a^n+n·a^{n+1}\tag{4}
aQ=1?a2+2?a3+3?a4+......+(n?1)?an+n?an+1(4)
(3)式減去(4)式得:
(
1
?
a
)
Q
=
a
1
+
a
2
+
a
3
+
a
4
+
.
.
.
.
.
.
+
a
n
?
n
?
a
n
+
1
(1-a)Q=a^1+a^2+a^3+a^4+... ...+a^n-n·a^{n+1}
(1?a)Q=a1+a2+a3+a4+......+an?n?an+1
化簡得:
Q
=
a
(
1
?
a
n
)
(
1
?
a
)
2
+
n
?
a
n
+
1
a
?
1
.
Q=\dfrac{a(1-a^n)}{(1-a)^2}+\dfrac{n·a^{n+1}}{a-1}.
Q=(1?a)2a(1?an)?+a?1n?an+1?.
一開始,我的思路是先寫一個程序,這個程序把所有的密碼組合出來,寫入一個文件,然后再寫一個程序,這個程序負責(zé)把寫入的密碼讀取出來,再逐個暴力破解。但是后來發(fā)現(xiàn)這種思路存在幾個問題,如果密碼的組合可能性太多的時候,那么存取所有密碼的這個文件將會達到幾十個G(甚至更大)。壓縮包的密碼位數(shù)可以是1 ~ 127位的(超過127位的密碼也有)。以最大位數(shù)127位為例,假如不知道密碼是多少位,那么可以組合出:
9
4
1
+
9
4
2
+
9
4
3
+
.
.
.
.
.
.
+
9
4
126
+
9
4
127
94^1+94^2+94^3+... ... + 94^{126}+94^{127}
941+942+943+......+94126+94127
種不同的密碼組合。使用上面的式子計算一下,就可以知道總共有:39073499766929905093170936199210360403225359398866973176589007276420630179610064715271048101086598784117989282816367722389837036292113256007435625512903036280893835514194448335273218252856958007222866912360893842268293858285256762926406241457713184768 種不同的密碼。
如果將所有的密碼組合寫入文件,不算回車換行符號,那么這個文件將會占 4961914325241313777553199490046598363526519239925145287832966868945419472665422521762910503472996114196429684959005740369797942759811562831081763117671397554605682022967601468185686939482979425062618339967434564286481867349313821628002924237784812093440 個字節(jié)。
并且,如果正確密碼是最后一個,那么將要循環(huán)到最后一個密碼才能破解成功,這樣將會很耗費時間。所以,我采用了隨機密碼暴力破解。
下面是代碼:
import zipfile
import os
import numpy as np
pwdCharset = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+', '[', ']', '{', '}', ';', ':', "'", '"', '\\', '|', ',', '<', '.', '>', '/', '?', 'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# 94\
CharsetInput = []
def gPwd(chST, lgth, rgth):
while True:
pl = int(np.random.random() * 100)
if pl >= lgth and pl <= rgth:
break
pwd = ""
chStLen = len(chST)
for i in range(0, pl):
while True:
idx = int(np.random.random() * 100)
if idx >= 0 and idx < chStLen:
break
pwd += chST[idx]
return pwd
def dcryp(fileName, lLen, rLen, chST):
fp = zipfile.ZipFile(fileName)
count = 0
while True:
pwd = gPwd(chST, lLen, rLen)
count += 1
try:
for file in fp.namelist():
fp.extract(file, pwd=pwd.encode())
os.rename(file, file.encode('cp437').decode('gbk'))
print("%d Success! The password is %s" % (count, pwd))
break
except:
print("%d %s no" % (count, pwd))
if __name__ == "__main__":
fileName = input("請輸入要破解的壓縮包文件名:")
choose = input("按1選擇暴力破解。\n按2選擇指定條件破解\n")
if "1" == choose:
leftLen = int(input("確定密碼的長度范圍:\n請輸入密碼的最小長度:"))
rightLen = int(input("請輸入密碼的最大長度:"))
dcryp(fileName, leftLen, rightLen, pwdCharset)
elif "2" == choose:
charSt = input("請輸入密碼中可能包含的字符:\n")
for i in charSt:
CharsetInput.append(i)
leftLen = int(input("確定密碼的長度范圍:\n請輸入密碼的最小長度:"))
rightLen = int(input("請輸入密碼的最大長度:"))
dcryp(fileName, leftLen, rightLen, CharsetInput)
else:
print("無效輸入!")
下面是測試:
這里選用的是4位的定長密碼,嘗試了10515次,用了不到10秒鐘的到結(jié)果。
4位定長密碼,如果不指定字符集,用所有可能的字符集暴力隨機破解,總共有78074896種不同的密碼組合,一共嘗試了13478113次,將會用大概20多分鐘的時間。
密碼越長,且可能的字符越多,則破解的時間越長。文章來源:http://www.zghlxwxcb.cn/news/detail-810390.html
針對長而復(fù)雜的密碼,如果加密的內(nèi)容很重要,一定要破解出來的話,可以采用分布式破解,即一臺主機通過網(wǎng)絡(luò)將破解內(nèi)容分發(fā)給一個計算機集群,集群中的每一臺主機同時運行多個破解進程,并定期向控制主機發(fā)送心跳信號,反饋破解信息,這樣可以大大縮短破解時間。文章來源地址http://www.zghlxwxcb.cn/news/detail-810390.html
到了這里,關(guān)于使用python暴力破解zip壓縮包的密碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!