一個42KB的檔案,解壓完其實是個4.5PB的“炸彈”
你聽說過 ZIP 炸彈嗎?
一個很小很小的,幾十 KB 的壓縮過後的檔案,解壓以後有幾百萬 GB ,好像炸彈一樣。
在繼續介紹它之前,差評君想先問問各位都用過哪些壓縮軟體。。。
WinRAR ?
或者 2345 好壓?
還是開源的 7 - Zip ?
其實壓縮軟體雖然五花八門,但目的都很單純:
把檔案佔用空間縮小。
不過差評君上面提到的壓縮軟體,又不單純是縮小空間。
JPG 圖片 , MP3 音樂格式也起到了壓縮作用。
但是 JPG, MP3 們執行的是有失真壓縮。
一旦個檔案被有失真壓縮的時候,會損失一部分資料。
損失的代價就是,你無法從被壓縮的檔案還原出壓縮前的檔案。
圖片,音樂等多媒體在有的時候考慮可用性和傳播性,對這樣的結果是可以接受的。
但對許多通用資料來說,往往需要的是無失真壓縮,比如 .zip 。
對於無失真壓縮來說,演算法非常重要,不同的演算法能實現的壓縮率和速度有很大差別。
如上圖所示,主流的演算法一般在 30% - 40% 。
而文章一開始介紹的 ZIP 炸彈,是一個名為 42.zip 的檔案。
它的初始大小是 42KB , 解壓密碼是 42 。
解壓之後的大小,足足有 4.5 PB 。
嗯。。。就是這麼囂張。
解壓這個 42.zip 以後會出現 16 個壓縮包,每個壓縮包又包含 16 個,如此迴圈 5 次,最後得到 16 的 5 次方個檔案,也就是 1048576 個。
這一百多萬個最終檔案,每個大小為 4.3 GB 。
因此整個解壓過程結束以後,會得到 1048576 * 4.6 GB = 4508876.8 GB
也就是 4508876.8 ÷ 1024 ÷ 1024 = 4.5 PB
還有比它更囂張的。
一個叫做 droste.zip 的大小為 28 KB 的檔案,一旦被開啟了以後,就會無限解壓縮生成一份同樣的檔案,直到永遠。
這個檔名靈感應該取自德羅斯特效應 ( Droste Effect ),是指一張圖片的部分與整張圖片相同,無限迴圈。。。如下圖↓
這個名字源自一家叫德羅斯特的可可粉廠商做的商品包裝。。。
注意女僕手上拿著的產品圖
咳咳。。。扯遠了。
總而言之,這個 droste.zip 的核心原理就是輸出結果為自身。
舉個例子,製作者大概做了這麼一件事:
在引號裡重複這句話 “ 在引號裡重複這句話 ”
然後解壓縮之後,硬碟就。。。 BOOM !
當然。。。也有劍走偏鋒思路不同的。
有一段名為 《 彗星撞地球 》 的影片,也展現了神奇的壓縮比率。
這段 3D 影片如果直接放出來要 15 G 左右,效果。。。放在它出生的年代 2000 年還真不差。
這個壓縮過的大小只有 64 KB, 壓縮了 25 萬倍 !
實現的原理其實不算通常意義上的壓縮。
而是製作組 Warez 做了一個 64KB 的可執行 EXE 檔案,執行的時候會呼叫顯示卡,CPU 及記憶體等等及時渲染動畫。
打個比方,動畫就好比連環畫,傳統影片是畫好的一冊,而這個 《 彗星撞地球 》 則是看的時候現場一幅幅畫。
錄屏軟體錄了 7 分鐘都要 2.27 G 。( 當然,這和現代螢幕解析度比較高有關係 )
那麼問題來了。。。
一個檔案的壓縮率有極限嗎?
有,可以由資訊學之父克勞德·夏農提出的資訊熵函式算出來。
不過 42.zip 也好,droste.zip 也好,不適合套用夏農提出的極限。
因為這兩個檔案為了達到驚人的壓縮比,有大量刻意重複的資料,這種重複資料在壓縮的時候是可以被丟棄的,沒啥實質性內容的資訊。
那麼。。。
如果動畫還有點傳播意義, 42.zip 和 droste. zip 還有啥意義呢?
這兒就要提就是 ZIP 炸彈之所以被稱作 “ 炸彈 ” 的真正原因了。。。
除了會 “ 爆炸 ” , 這玩意兒其實是拿來攻擊別人的。
某些病毒製作者利用防毒軟體會掃描壓縮檔案內部的特性,會把 ZIP 炸彈連帶病毒一起發到目標電腦上。
而 ZIP 炸彈表面上看起來很小,易於傳輸,但實際上掃描起來非常花時間。
趁著防毒軟體忙著掃描 4.5 PB 的資料,被佔用時,病毒軟體就可以趁虛而入了 ~
幹黑產的,角度刁鑽得讓人折腰。
不過現在很多防毒軟體已經有辦法避開這種 zip 炸彈的佯攻了,這個話題漸漸地拋開了黑產。
一直以來壓縮演算法是演算法研究裡津津樂道的話題, Huffman 樹, LZW 字典等等。。。
用程式解決資訊問題的姿勢,仔細一琢磨也挺有意思的不是?
∑編輯 | Gemini
來源 | 差評
更多精彩:
☞ 曲面論
演算法數學之美微信公眾號歡迎賜稿
稿件涉及數學、物理、演算法、計算機、程式設計等相關領域,經採用我們將奉上稿酬。
投稿郵箱:math_alg@163.com
相關文章
- David Fifield 推出新款“解壓炸彈包”:46MB 檔案可膨脹到 4.5PB
- 你認為的伺服器其實是一個誤解伺服器
- 檢視一個歸檔或壓縮檔案的內容而無需解壓它
- 自己寫的一個 java 解壓 rar zip 帶密碼 檔案Java密碼
- 最近很火的Vue Vine是如何實現一個檔案中寫多個元件Vue元件
- Linux下檔案的壓縮與解壓Linux
- 分享一個自己寫的Intellij外掛,主要功能是能瀏覽壓縮檔案IntelliJ
- 用PHP實現上傳的ZIP檔案的解壓PHP
- 一個 java 檔案的執行過程詳解Java
- 區塊鏈的工作證明其實是一個分散式時鐘區塊鏈分散式
- Javascript 實現一個post方式的檔案下載JavaScript
- 多個excel檔案合併到一個檔案中的多個sheet表中Excel
- 應用分析|瞭解FTP的五個事實,確保檔案傳輸一個都不少FTP
- 解決方案 | winrar 使用命令列解壓到同名資料夾 (QTTabBar 中建立一個【解壓檔案】命令按鈕的設定)命令列QTtabBar
- .NET 壓縮/解壓檔案
- 論如何用Vue實現一個彈窗-一個簡單的元件實現Vue元件
- betterzip怎麼解壓檔案?如何使用BetterZip批次解壓壓縮檔案
- 【Python】Python實現解壓rar檔案Python
- Keka解壓縮檔案時,總是彈出對目標檔案沒有訪問許可權.....視窗解決方法訪問許可權
- 封裝一個的toast彈出框(vue專案)封裝ASTVue
- 表示一個檔案的 File 型別型別
- 如何確定一個dmp檔案是exp匯出的還是expdp匯出的?
- 多個 EXCEL 檔案如何合併成一個檔案Excel
- JNI初步(五)jni ndk 一個.so檔案依賴另一個.so檔案的寫法
- 「Python實用祕技01」複雜zip檔案的解壓Python
- EXPAND命令是Windows作業系統中的一個命令列工具,用於解壓縮檔案。它可以將Windows壓縮檔案(.cab)中的檔案提取到指定的目錄中。EXPAND命令通常用於在命令列中執行解壓縮操作,而不需要使用圖形介面中的壓縮工具。Windows作業系統命令列
- MATLAB|讀取一個檔案,並將其不同內容儲存為不同的矩陣Matlab矩陣
- 一個新的專案上線,回顧2018年做的事情,其實你可以看看
- vue中下載excel的使用,後端連結兩種情況,一個是連結,一個是檔案流VueExcel後端
- 一個故事講完CPU的工作原理
- Linux常用的檔案解壓命令有哪些?Linux
- 用一個檔案,實現迷你 Web 框架Web框架
- 一個私有協議檔案DB 的解析.協議
- 共享一個iptables的shell指令碼檔案指令碼
- 多個excel檔案合併成一個excel表的方法 如何快速合併多個excel檔案Excel
- 阿里巴巴26個屌炸天的開源專案阿里
- LeetCode題解(1652):拆炸彈(Python)LeetCodePython
- linux 下面壓縮、解壓.rar檔案Linux