這個問題很好,在軟件破解領(lǐng)域,屬于一個非常經(jīng)典的問題。
軟件破解在過去很流行,就是一個Windows上面的軟件,需要輸入注冊碼、序列號之類的東西。高手往往可以輕松破解出注冊碼。還有一種叫做黑客,就是說一個網(wǎng)站需要輸入密碼才能進(jìn)去,而黑客通過一定手段,可以設(shè)法“破解”密碼或者繞開正常登錄機(jī)制。不管密碼設(shè)置設(shè)多復(fù)雜,都難厄運(yùn)。
于是就有人問,我有一個壓縮包被加密了,有沒有大牛可以破解的?得到的答案基本都是驚人的一致,除了窮舉法,再沒有其他辦法了!不論多高的高手,都沒有辦法“秒破”。密碼太簡單除外。
但是在軟件破解里面,不論注冊碼算法多么復(fù)雜,注冊碼多長,哪怕是一萬個字符,總是可以破解的。甚至出現(xiàn)一種聲音,理論上沒有不可破解的軟件。這里說的理論上,沒有包括窮舉。換句話說,理論上都可以“秒破”。
現(xiàn)在的問題,就在于,為什么會出現(xiàn)這種情況?為什么軟件注冊碼可以破解,網(wǎng)站登錄可以破解,而壓縮包這么一個看似簡單的東西卻破解不了呢(密碼太簡單除外)?
軟件注冊碼保護(hù),屬于基于算法的保護(hù)。也就是說只要軟件敢公開源代碼,敢公開注冊碼生成算法,則分分鐘就被破解了。比方說office軟件在安裝時就要輸入序列號。它的生成算法是不變的,一旦搞到算法,就能馬上做一個序列號生成器,不管裝在誰的電腦上,都適用,每套o(hù)ffice的算法都一樣。顯然,像office這樣的收費(fèi)軟件不可能公開序列號生成算法。但是它要運(yùn)行,必然在“我”的電腦上運(yùn)行(而不是服務(wù)器),它的內(nèi)存必然“我”理論上能完全掌握。只要有耐心,“我”就一定可以反編譯、反匯編、再加上內(nèi)存分析,從而就一定可以找到算法。除非它不在“我”的電腦上正常運(yùn)行。
黑客破解,密碼和驗(yàn)證算法在服務(wù)器,不在“我”的電腦上,則不像軟件破解那樣理論上所有都可破解,而是“碰運(yùn)氣”。它主要是找服務(wù)器漏洞,運(yùn)氣好就找到了,運(yùn)氣不好找不到。找到了后,就能輕松繞開密碼驗(yàn)證,或輕松截獲或查詢密碼。
而壓縮包密碼的破解,則與上面兩種情況有了很大的不同!
壓縮包的加密,不是基于算法的保密,而是基于密鑰的保密。軟件破解是基于算法的保密。軟件破解是知道算法后,根據(jù)算法生產(chǎn)注冊碼,通過驗(yàn)證注冊碼判斷是否合法用戶。那么有了算法,我們就可以自己算出注冊碼,或者干脆把判斷注冊碼是否合法的邏輯顛倒一下。比如把代碼改成,如果注冊碼錯誤,就打開主界面正常使用。
而壓縮包的算法是公開的,它加密用的基本以AES算法為主,任何人都可以去網(wǎng)上學(xué)習(xí)。壓縮包不是程序,不是代碼,不是機(jī)器指令。而是實(shí)際的加密數(shù)據(jù)。壓縮包不驗(yàn)證密碼,沒有密碼正確就顯示內(nèi)容,密碼錯誤就不顯示這樣的邏輯。我們輸入的密碼是用來全文解密的。隨便輸入一個密碼都可以解密,只不過解密出來的東西可能是亂碼。多數(shù)壓縮包管理軟件會提示crc校驗(yàn)失敗,這就是說東西已經(jīng)解密了,但是是錯的。正規(guī)的提示不會告訴你密碼錯誤,因?yàn)?span style="font-weight: bold;">壓縮包中壓根兒就并沒有以任何形式存儲密碼,它無法立刻檢測到底什么密碼才是正確的。只有你用這個錯誤密碼解密到一半,發(fā)現(xiàn)“亂碼”后才知道。
我們可以這樣理解,軟件破解中,軟件作者一定,百分比,無一例外地可以反查一個軟件的注冊碼。而壓縮包破解中,任何人都無法通過壓縮包本身反查密碼,包括寫壓縮包管理軟件的作者。剛說過了,壓縮包中壓根兒就沒有關(guān)于解密密碼的任何信息!
剛已經(jīng)說到,壓縮包的加密算法基本是公開的。這里順便提一下一個思想。有時候,越是公開的東西,越是安全。為什么?因?yàn)檫@樣的加密算法經(jīng)過了無數(shù)計算機(jī)專家、密碼學(xué)家、數(shù)學(xué)家的考驗(yàn)。算法公開,而密鑰(密碼)保密,就成了加密解密的最佳實(shí)踐。多數(shù)嘗試自己發(fā)明一套加密算法的想法都是愚蠢的(密碼學(xué)專家的專業(yè)研究除外)。
所以說,壓縮包加密之所以安全,可以認(rèn)為它是加密算法公開,而密鑰保密的成功典范。它是如此的安全,目前沒有任何人可以通過除窮舉法以外的其他任何辦法破解(未來是否能找到這些公開加密算法的漏洞不好說)。
======分割線======
看到評論很多人關(guān)心如果用窮舉法,到底需要多長時間。下邊我們不妨來算算。內(nèi)容有點(diǎn)長,看結(jié)論就直接看粗體字。不太相信的,想自己算的可以詳細(xì)看計算過程。
目前zip、rar的主流加密算法是AES。AES分3種規(guī)格,主流是256位,此外還有192位、128位(位數(shù)越高安全性越高)。128位是指密碼的長度是128計算機(jī)位,即16字節(jié)。大致相當(dāng)于20幾個英文字符。換句話說,AES-128加密,用20幾個隨機(jī)英文字符足夠安全了。我們就姑且只討論128位的。256位的更難破。
128位密鑰,其可能性總共2^128=3.4×10^38。平均破解次數(shù)那就是除以2了,1.7×10^38。現(xiàn)在最厲害的超算之一是天河二號,排名前五,其極限速度是每秒運(yùn)算6億億次。這個速度是指最簡單的運(yùn)算,那就是整數(shù)加法。普通電腦CPU主頻4GHz,極限速度就是40億次運(yùn)算每秒。如果是8核CPU就乘以8。那么一臺天河二號超算大約相當(dāng)于1百萬臺普通電腦。
概括一下,AES-128加密平均需要窮舉1.7×10^38次可以破解。一臺天河二號超算極限運(yùn)算速度一秒6*10^16次。這個運(yùn)算是指整數(shù)加法運(yùn)算,我們就姑且把復(fù)雜的AES解密看作加法這么簡單吧。接下來就是一看就懂的算式:1.7×10^38÷6×10^16=2.8×10^21秒。即90萬億年。
看到?jīng)]有,一臺天河二號超算——全球排名前五的超算,破解一個足夠復(fù)雜密碼的壓縮包,平均至少需要90萬億年。或許你會反駁,找第一名啊,好吧,第一名也就是天河二號速度的不到4倍。你還可以這樣算,動用一億臺天河二號同時算,也就是把時間由90萬億年變成了90萬年,依然是天文數(shù)字。