ZIP 文件格式是一種流行的檔案文件格式,原名 Deflate,發明者為菲爾·卡茨(Phil Katz),他於 1989 年 1 月發布了該格式資料。ZIP 通常使用副檔名「.zip」,它的 MIME 格式為 application/zip 。目前,ZIP 格式屬於幾種主流的壓縮格式之一,競爭者包括 RAR 格式以及開放原始碼的 7-Zip 格式。從性能上比較,RAR 及 7-Zip 格式較 ZIP 格式壓縮率較高,而 7-Zip 由於提供了免費的壓縮工具而逐漸在更多的領域得到應用,使用任何一種文件編輯器打開Zip文件,都會看到頭2字母為:PK。

前身
1985 年一家名為 SEA(System Enhancement Associates)的小公司開發了一個在 MS-DOS 平台下的商業壓縮軟體,名為 ARC。當時的軟體發行方式與現在略有不同,用戶購買了軟體,除了得到軟體的可執行文件還包括一份 C 語言的原始碼。當時的卡茨與很多用計算機的平民一樣,缺乏資金購買大量的商業軟體,當時卡茨從網上下載了一份ARC的C語言原始碼,並用組合語言將其全新編寫並編譯出來。卡茨將這個軟體名為:PKARC(Phillip Katz' ARC)。卡茨製作的新軟體 PKARC 因為是使用組合語言重新編寫,因為是參照原始碼編寫的,所以完全兼容 ARC 以及性能上比 ARC 高。卡茨當時將這個新軟體上傳到網路上面。顯然,卡茨此舉造成對 SEA 公司的侵權。SEA 最初希望通過聯絡卡茨使 PKARC 成為 SEA 公司旗下的一款產品,後來卡茨拒絕了。最終,雙方對簿公堂,結果是卡茨敗訴,卡茨被判以對 SEA 公司的賠款以及停止發放 PKARC。後來,卡茨在研發過程中的 PKARC 續作 PKPRC 也被迫重新改寫所有代碼,PKPRC 其實就是下文提及的 PKZIP 的前身。

誕生
這場官司過後幾周,卡茨就製作出新壓縮軟體 PKZIP(Phillip Katz' ZIP),這款全新的軟體比 ARC 的壓縮率,壓縮性能以及功能都要高許多。此後,卡茨還將 ZIP 的所有技術參數公諸于眾。這一名稱 zip(含義「速度」)是由卡茨的朋友羅伯特‧馬宏利(Robert Mahoney)建議的。他們想暗示,他們的產品比ARC 在一定時間內更快速。這個名字往往被寫成大寫字母,因為在 DOS 系統內,通常都是使用大寫字母作為副檔名的。(由於 MS-DOS 運行在 FAT 文件系統上)

Winzip的面世
Windows 3 面世之前,有兩種格式與ZIP同樣流行,一個是 LHA(LHArc),另一個是 ARJ(Archiver Robert Jung),直至到 1995 年,這3種壓縮格式都是PC應用的主流。之後,1995 年,微軟發布了 Windows95,當時從 DOS 轉移到 Windows 的用戶們,極度渴求對圖形界面下的優良軟體,Winzip 以其優良的性能以及不太羞澀的圖形用戶界面吸引了用戶的目光,在當時佔有大量的市場佔有量,其實,當時的 Winzip 僅僅是一個調用 DOS 資源的 GUI 外殼,但是其從 Windows 3 就開始的製作經驗使其 GUI 性能和外觀都比當時的流行軟體要好。很快的,Winzip 就成為了當時一個很流行的軟體。同時也帶動了 ZIP 的傳播,由於在前期太受歡迎,使到後期很多用戶都以為,是 WinZip 創造了 ZIP ,其實這是一個誤解。

發展
因為格式開放而且免費。越來越多的軟體內嵌支持打開 Zip 文件。這時,Zip 文件越來越象一個經過壓縮的透明文件夾。自 Windows Me 以來,Windows 內嵌支持打開以及壓縮 Zip 文件。一些下載軟體的工具,支持部分下載 Zip 文件然後進行恢復。越來越多的軟體內嵌支持打開 Zip 文件。幾乎所有的壓縮軟體都支持打開及製作 Zip 文件。

危機
基本上,Zip 文件的發展都是由 PKware 公司與 Winzip 所推動。然而,其兩家公司就某些問題上互相猜疑,導致發展緩慢。人們目前最想在 Zip 文件實現的目標,就是加強目前 Zip 文件的加密能力。就目前而言,Zip 的文件加密能力弱得可憐,僅憑單單一個指令保護,根本滿足不了安全需求。雖然卡茲在發佈時公開了格式,但是當時製作的時候留有為日後升級的空間。而 Winzip 僅僅是一個使用者,根本無法發布新標準,其標準的制訂權依然保留在 PKware手中。2002 年時,PKware 開發了支持 256 位元 AES 加密的 PKZIP 5.0,但是 Winzip 在 2003 年發布的 Winzip 9 卻被證明了無法與之相容。雙方都互相指責對方違背了 Zip 的自由開放精神。這是 Zip 自誕生日起,第一個對於它來說最嚴峻的挑戰。

技術
ZIP 是一種相當簡單的分別壓縮每個文件的存檔格式。分別壓縮文件允許不必讀取另外的數據而檢索獨立的文件;理論上,這種格式允許對不同的文件使用不同的演算法。不管用何種方法,這種格式的一個缺點是壓縮很多小文件時,檔案大小明顯的比壓縮成一個獨立的文件(在類 Unix 系統中一個經典的例子是普通的 tar.gz 存檔是由一個使用 gzip 壓縮的 TAR 存檔組成)要大。

ZIP 的規格指出文件可以不經壓縮或者使用不同的壓縮演算法來存儲。然而,在實際上,ZIP 幾乎差不多總是在使用卡茨(Katz)的 DEFLATE 演算法。ZIP 支援基於對稱加密系統的一個簡單的密碼,現在已知有嚴重的缺陷,已知明文攻擊,字典攻擊和暴力攻擊。ZIP 也支援分割壓縮。在近來一段時間,ZIP 加入了新的壓縮和加密方法,不過這些新功能並沒有被許多工具所支援並且沒有得到廣泛的應用。

文章轉載至 維基百科



ZIP 檔案格式是一種壓縮檔案格式,一個 ZIP 檔案為了減少檔案大小可能包含了一個或數個經過壓縮的檔案,或者只是將檔案原封不動的搬到 ZIP 裡面。ZIP 檔案格式相容許多不同的壓縮演算法,但直到 2009 年,只有 Deflate 演算法被廣泛使用和支援。

此格式原本是由 Phil Katz 在1989年為了 PKZIP 所研發的,而且是由 Thom Henderson 的 ARC 壓縮格式演變而來的。許多軟體工具都支援 PKZIP 格式,微軟甚至從 1998 年開始起就把 ZIP 整合到 Windows 裡,也就是在 windows 看到的「壓縮的(zipped)資料夾」)。蘋果電腦也同樣將 ZIP 整合到 Mac OS X 10.3 及之後的版本。

ZIP 檔案延伸檔名通常是「.zip」或「.ZIP」,MIME 檔案類型為 application/zip 。其實很多軟體都使用 ZIP 檔案格式,只是名稱不一樣而已。例如,Java(爪哇)的 JAR 檔、Mozilla Firefox(火狐狸)附加元件(.xpi)、 id software(開發 FPS 大作 CS 的公司)的 .pk3/.pk4 檔、 OLPC XO 電腦專用格式檔 Activity Bundles(.xo)、Winamp 和 Windows Media Player 面板檔、 OpenOffice 文件檔(.odt) 以及微軟的 Office 2007 的 Open XML(.docx)檔,其實都是應用 ZIP 技術。

歷史

早期

80 年代中期,由 Thom Henderson 所經營的一間小公司 System Enhancement Associates(SEA) ,開發出一個叫做 ARC 的檔案壓縮格式,而且也開發出能夠將檔案壓縮為 ARC 格式的的壓縮程式(也叫做 ARC),該程式以共享軟體的方式連同原始碼發佈了幾種不同平台的版本。ARC 很快的成為一種非官方標準。接著,Phil Katz 在 IBM Intel DOS 平台發佈了一個相容軟體包,也就是 PKXARC。它使用了最佳化的 8088 組合語言,被認為在速度上比 SEA 所開發的原始版本還快。

半路殺出來的 Katz 讓 SEA 非常不爽,於是控告 Katz 抄襲,侵犯了商標和版權。Katz 最後輸了這場官司,判賠美金六萬二千五百元(相當台幣200萬)。因為在訴訟過程中,Katz 被發現他直接使用了 SEA 公司 ARC 大部分的原始碼,但只有針對速度最佳化自己寫了程式碼。他將演算法所使用的字元長度由 12 位元改成 13 位元,而使得壓縮二進位檔時可以有較高的壓縮率。因為敗訴,Katz 不得不把 PKXARC 改名為 PKPAK 和 PKUNPAK。

Katz 繼續研發自己的檔案格式,也就是後來全世界知名的 ZIP 格式(通常叫做 ZIP 檔)。ZIP 格式因為有多餘的目錄儲存空間而比 ARC 格式更堅固,減少資料遺失的風險。同時也比 ARC 更靈活,提供更多可供選擇的壓縮演算法和擴充空間。到 PKZIP 時,內含的演算法效率已經遠遠超過 ARC ,因此在 PKZIP 發佈之後,許多人再也受不了 ARC 又慢又沒效率的壓縮品質而紛紛放棄使用,再來就是在 ARC 格式廣為流傳並在網路許多社群被普遍使用之後,SEA 似乎動不動就喜歡唱高調、宣稱他才是 ARC 壓縮格式合法版權所有人,其他未經授權不該私自使用,也讓很多人敬 ARC 而遠之。

Katz 在 1989 年一月首發的 ZIP 壓縮器時,也公佈了所有的技術文件,成為一種開放格式。原本只包含在 PKZIP 註冊版裡的 ".ZIP 檔案格式規格" 文件在稍後也可以在 PKWARE 官方網站裡看到了。zip 這個名稱是(代表速度)由 Katz 的朋友 Robert Mahoney 建議的,意指他們的產品在速度上能夠比 ARC 及其它的壓縮格式還快。

命令提示字元之後

90 年代中期,隨著愈來愈多圖形化使用者介面電腦的出現,人們開始對必須在命令列提示字元下進行操作的 PKZIP 感到很不方便。共享軟件商看到了商機,紛紛推出圖形使用者介面的壓縮程式,這些壓縮程式有很多都是採用了 ZIP 格式,Winzip 就是其中最受歡迎的一個。PKWARE 也推出了圖形化介面的 PKZIP 版本。這些程式使用起來比在命令提示字元下容易多了,不過使用者還是必須學習如何使用它來壓縮檔案。

90 年代後期,檔案管理軟體開始將 ZIP 格式整合支援到他們的使用者介面之中。在更早,DOS 中的 Norton Commander 還有它的衍生產品 Volkov Commander 就已經這麼做了,還有其他仿 Commander 風格或標準檔案管理軟體像 Midnight Commander(Linux 和 類 UNIX 系統)和 Total Commander(視窗系統,前身為 Windows Commander)也都支援 ZIP 格式。KDE 檔案管理器(KMF)在很早的時候就支援 ZIP 格式了,Windows 98 的 Plsu! 加強包,Windows 資源管理器也開始支援 ZIP 格式了,包括後來的 Windows Me、 Windows XP、Windows Vista、和最新的 Windows 7。 ZIP 格式同樣也被支援內建至 Mac 作業系統的資源管理器中(譯註:MAC 裡叫 Finder ,雖然功能和名稱可能和微軟視窗系統有差別,但說穿了都是檔案管理的一種使用者介面,所以我統統歸類為資源管理器,這樣就不會因為英文名稱不同導致中譯名不同而混亂,當我說 Windows 資源管理器就是說 Windows Explorer,而 Mac 資源管理器就是指 Mac OS Finder),同平台的 GNOME 所使用的 Nautilus 檔案管理器及 KDE 較新版本的 Konqueror 檔案管理器也都支援。直到 2002 年,所有主要的桌面系統都已將 ZIP 格式加入他們的檔案管理器:一個 ZIP 檔案通常看起來像是一個目錄或資料夾,因此將檔案複製進去或複製出來時就跟其他一般資料夾的操作一樣,也會顯示檔案壓縮進度。這樣,使用者就不需要適應軟體介面和學習使用方式就能達到將檔案壓縮的目的了。ZIP 檔在 iPhone 或是以 Windows Mobile 為基礎的手機設備裡一樣能被執行使用。

格式混亂

還有很多標準和格式和 ZIP 壓縮有關,導致人們有時候會感到混亂或將他們混淆了。例如 ZIP 和 GZIP 就是截然不同的兩個東西,前者是屬於 PKWare 公司所開發的一種標準,而後者則被定義在 IETF RFC(1952) 文件裡。共通點就是兩者都使用 DEFLATE 作為壓縮演算法。同樣的,ZLIB 格式 (也被定義在 IETF RFC 1950 文件裡)也使用 DEFLATE 壓縮演算法,但是對於錯誤和一致性檢查指定的檔頭是不一樣的。

版本

.ZIP 檔案格式規格有自己的版本編號,不一定和商用的版本一致,尤其是 PKZIP 6 之後的版本。雖然 PKWARE 想開始增加讓 PKZIP 能夠以進階的方式解壓縮檔案的功能,不過在下一次大改版之前是看不到這個功能的。其他公司或組織則依照各自的步調來支援實作 PKWARE 規格。

技術資訊

ZIP 是一個用來將檔案個別壓縮的簡易壓縮格式,個別壓縮檔案可以讓檢索單個文件時不需要再讀取其他資料,理論上來說,它可以透過個別檔案使用不同的壓縮演算法,而讓壓縮率獲得提升。有一點要注意的是壓縮檔若包含了大量的小檔案,最後反而會比將這些小檔案個別壓縮之後加起來的檔案大小還要大(典型例子就是常見的 tar.gz 壓縮檔,包含了一個用 GZIP 壓縮的 TAR 檔)。

ZIP 規格文件裡指出,儲存時可以選擇不壓縮檔案,或是使用不同的壓縮演算法來壓縮,不過 ZIP 通常還是使用 Katz 的 DEFLATE 演算法,除要加進去的檔案已經壓縮過了,或者檔案本身結構已無壓縮空間,這時候,檔案資料只是被直接儲存下來而已,沒有經過壓縮。

在 ZIP 規格書中明文記載,ZIP 支援簡單的密碼型對稱加密系統,只是這個系統卻有著很嚴重的缺陷。尤其是在面對已知明文攻擊時,拙劣的隨機密碼產生器在某些情況下更顯得脆弱不堪。ZIP 也支援分割磁片檔,原本是用來將大型的 zip 壓縮檔分割儲存至好幾片 1.44MB 的軟碟磁片上,現在則被用來透過電子郵件將個別的分割檔傳送出去,或者其他傳送方式跟儲存媒體。

新功能包含了自 5.2 版就被寫入 ZIP 檔案格式規格文件裡的新壓縮和加密演算法(如 AES)。WinZip 相容的 AES 標準被 7-Zip、XCeed 和 DotNetZip 所採用,其他開發商則使用其他格式。PKWARE SecureZIP 支援 DC2、DC4、DES、3DES 等加密法,數位憑證加密及認證(X.509)和檔頭加密。

最早的 ZIP 格式有著所謂「4.2GB」的限制(單一檔案未壓縮檔案大小、單一檔案壓縮後檔案大小、多個檔案壓縮後總檔案大小),一個 ZIP 壓縮檔裡也不能容納超過 65535 個檔案。在 4.5 版的規格裡(在此所指的是規格書而非各商用軟體的版本),PKWARE 引進了「ZIP64」擴充格式來突破這些限制。Zip64 是近來才出現的,也因此各軟體支援程度不一。例如:Windows XP 裡的檔案總管就不支援 ZIP64,可是 Windows Vista 有支援。同樣的,一些程式庫如在 Perl 裡 IO::Compress::Zip 的,已經支援 ZIP64,不過其他像 Java 內建的 java.util.zip,依然不支援。

在 DOS 的 FAT 檔案系統下的時戳即時解析度只有 2 秒,和 ZIP 檔案紀錄相近。結果,在 ZIP 壓縮檔裡的檔案時戳即時解析度也只有 2 秒,雖然多餘的空間可以拿來儲存更精確的時戳。2007 年 9 月,ZIP 規格書(APPNOTE.TXT)開始支援 UTF-8 編碼,最後也支援 Unicode 編碼了。不過並非所有的程式庫和商用軟體都實做了規格書裡的條列的 ZIP 規格與功能。

ZIP 檔案結構

ZIP 檔包含了一個依字母順序排列的檔案和目錄資料清單。每個檔案的位置會被紀錄在 ZIP 檔尾叫做中央目錄的地方,檔案和目錄會依據檔案項目的順序來依序呈現。

每一個檔案項目都帶有含該檔案項目相關的資訊,如註解、檔案大小和檔案名稱,接著則是「額外」的資料欄位,然後就是壓縮率和加密與否。「額外」資料欄位提供了 ZIP 格式的擴充性,以支援 ZIP64 格式、WinZip 相容的 AES 加密技術及 NTFS 檔案時戳。理論上,透過編碼過的「額外」欄位可能還可以有更多其它的擴充。中央目錄則由檔頭和每個檔案項目中的中繼資料如檔案名稱和相對偏移所組成。

每個檔案目錄都以一個特定的4位元「簽證」標記起來,同樣的,每個在中央目錄的項目也以另外一組不同的4位元簽證標記起來。當解析 ZIP 檔時,解析器會尋找相對應的簽證。因為目錄中的檔案順序不需要和檔案中的順序一致,所以格式是非連續的。在 ZIP 規格裡沒有提到 BOF 或 EOF 標記,相反的,ZIP 工具用來掃瞄多個欄位裡的簽章。

結合 ZIP 和其他檔案格式

ZIP 檔案格式允許在檔案的中央目錄後出現包含任何資料的註解,當然,因為中央目錄替壓縮檔裡的檔案開始的地方指定了偏移量,所以要在第一個檔案項目以非 0 的偏移量作為起始實際上是有可能的。

這讓任何的資料不管是壓縮前或壓縮後都可以出現在檔案裡,而且壓縮檔依然能夠被 ZIP 應用程式所讀取。一個副作用就是倘若其他格式相容任意資料放在檔案的頭、尾或中間,可能會讓檔案變成「雙重國籍」- ZIP 格式壓縮檔以及「其他格式」壓縮檔。自動解壓縮檔(Self-extracting archives,SFX),, WinZip 和 DotNetZip 都支援,並且符合 PKZIP AppNote.txt 文件裡的規格,能夠被相容的 ZIP 工具和資料庫所讀取。

ZIP 格式 和 ZIP 的變種格式 JAR 因為具備了上述特性,因此可以被利用來安放看似無害的檔案來隱藏有害的 Java classes 在檔案裡,例如上傳一個 GIF 影像至網路。這就是所謂的 GIFAR exploit ,並被證實用來攻擊網路社群網站裡的應用程式像是 Facebook 。

ZIP 應用程式實作

網路上有許多的 ZIP 工具和程式設計環境下的程式庫,有一些程式庫是商用的,有一些則是開放原始碼,有一些不是。WinZip 可能是這裡面最有名和最受到歡迎的一個 ZIP 工具了-主要運用在視窗系統裡,讓使用者利用他來壓縮和解壓縮 ZIP 檔。WinRAR、IZarc、Info-zip、7-zip 則是不同平台下類似功能的其他工具,裡面有些工具具備程式庫和可程式畫界面。

還有一些有用的開發程式庫以開放原始碼的形式存在,如  GNU gzip 和 Info-ZIP。對 Java 來說,選項少了些,有 Java 平台,標準版本包含了程序包「java.util.zip」,用來處理標準 zip 檔、Zip64File 程式庫;支援超過 4GB 的大型檔案;隨機存取 ZIP 檔案;內建阿帕契螞蟻工具(Apache Ant tool),更完整的版本。

而對於 .NET 應用程式來說,則有微軟公共授權(Microsoft Public License,Ms-PL)下一個叫做 DotNetZip 的免費程式庫可用,它提供了對稱式 ZIP 加密密碼、萬國碼(Unicode)、ZIP64 以及和 WinZip 相容的 AES 加密演算法。Microsoft .NET 3.5 執行函式庫包含了一個類別 System.IO.Packaging.Package ,提供 ZIP 格式的支援,但是它最原先是針對微軟辦公室套裝軟體的文件格式(xlsx、pptx、docx、xps)而設計的。

Info-ZIP 對 Unix 檔案系統下的一些特點,為 ZIP 格式提供了支援,比如:使用者和群組帳戶名稱、檔案權限、符號連結。阿帕契螞蟻(Apache Ant)則能夠以預先設定好的 Unix 權限來建立檔案。Info-ZIP 也知道如何使用 ZIP 壓縮格式內建的錯誤修正(Error Correction)功能。部分程式(如 IZArc)無法使用此功能並且會被損壞的檔案弄掛掉。

Info-ZIP 也支援 NTFS 檔案系統權限機制,能在解壓縮時在 NTFS 下的權限轉換為 Unix 下的權限,反之亦然。只是結果可能會造成非預期性的結合,例如:.exe 檔案建立在拒絕執行權限的 NTFS 磁碟上。

激烈的加密爭議

當 WinZip 9.0 測試版在 2003 年發佈時,WinZip 為了新規格,連同文件,推出了自己的 AES-256 加密法,也使用不同的檔案格式。加強版加密規格(Strong Encryption Specification,SES)是從 PKZIP 5.0 和 6.0 版本就開始使用的加密演算法,加密標準本身並非專利,但 PKWARE 自從 2001 年起就沒有更新 APPNOTE.TXT 檔,當然 SES 也就沒被納入了。WinZip 技術顧問凱文卡尼(Kevin Kearney)和 StuffIt 產品經理馬修柯文頓(Mathew Covington)指責 PKWARE 對 SES 的阻擋跟限制,PKZIP 技術總監吉姆彼得森則聲稱那是因為認證加密技術尚未發展健全。然而,在當時版本4 .5 最新的 APPNOTE.TXT 文件裡(在 PKWARE 的 FTP站可以找到),不但 SES 被忽略了,連和 PKZIP 同時期其他產品所開發用來使用在. ZIP 檔案上的 Deflate64、DCL Implode、BZip2 等壓縮演算法都被省略了。

為了克服這樣的情況,同時期產品像 PentaZip 透過加密 ZIP 壓縮檔為不同的檔案格式來達到「實作」加強型 ZIP 加密。另外一個引發爭議的是,PKWare 於 2003 年 7 月 16 日以結合 .ZIP 和加強型加密演算法來建立一個安全的 .ZIP檔 ,申請了專利。

最後,PKWARE 和 WinZip 達成協議,互相支援彼此的產品。2004 年 1 月 21 日,PKWARE 宣布支援 WinZip 版的 AES 壓縮格式。而在稍後的 WinZip 測試版本裡,也開始支援帶有 SES 功能的ZIP檔案。PKWARE 最後發佈了 5.2 版的 .ZIP 檔案格式規格書,SES 終於被寫上去了。

資料來源 維基百科(英) 翻譯 克里西熊

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 ALVIN 的頭像
    ALVIN

    全力以赴每一天

    ALVIN 發表在 痞客邦 留言(0) 人氣()