ZIP (ファイルフォーマット)

ZIPファイルフォーマットの詳細解説



ZIPは、複数のファイルを一つにまとめるアーカイブフォーマットであり、必要に応じて圧縮も可能です。特にWindows環境で広く利用されていますが、様々なOSやアプリケーションでもサポートされています。

ZIPフォーマットの概要



ZIPファイルフォーマットは、複数のファイルを一つのファイルとして取り扱うためのアーカイブ形式です。1つ以上のファイルを格納でき、必要に応じて様々な圧縮アルゴリズムを選択してファイルサイズを圧縮できます。このフォーマットは1989年にフィル・カッツによって考案され、PKWAREのPKZIPユーティリティに実装されました。

現在では、多くのユーティリティやオペレーティングシステムでサポートされており、Windowsでは「圧縮フォルダー」として、macOSでは標準機能として組み込まれています。ZIPファイルは通常、拡張子「.zip」または「.ZIP」が付けられます。

ZIPフォーマットは、圧縮を主目的としない多くのアプリケーションでも使用されており、その際は固有の拡張子が用いられることが多いです。例えば、Javaのアーカイブファイルである「.jar」は、実態はZIPフォーマットです。

歴史



「zip」という名前は、フィル・カッツの友人ロバート・マホーニーの提案によるもので、「速さ」を意味します。これは、従来のARCなどの圧縮フォーマットよりも高速であることを示唆する意図がありました。

ZIPファイルフォーマットの仕様は、PKZIP0.9のパッケージに同梱されたファイルで初めて公開されました。ZIPフォーマットはオープンフォーマットとしてパブリックドメインでリリースされており、誰でも自由に利用できます。

PKWAREもまた、基本的なフォーマットをパブリックドメインとしており、誰でもZIPファイルを扱うアプリケーションを開発できます。この点は、Info-ZIPバージョンのプロダクトに付属するドキュメントでも強調されています。

ZIPフォーマットの起源



ZIPファイルフォーマットは、PKWAREのフィル・カッツによって考案され、PKZIPで実装されました。カッツは以前、「PKXARC」というアーカイブユーティリティを公開していましたが、システム・エンハンス・アソシエイツ社のARCというユーティリティの著作権を侵害したとして訴訟を起こされています。

よく似た名前のフォーマット



「zip」という名前を使ったフォーマットは他にも多数存在します。例えば、gzipやzlibは同じDeflate圧縮アルゴリズムを使用していますが、ヘッダーやフッターが異なります。また、7z、bzip2、rzipなどもよく似た名前の異なるファイルフォーマットや圧縮アルゴリズムです。

バージョン履歴



ZIPファイルフォーマットにはバージョン番号がありますが、これは必ずしもPKZIPツールのバージョン番号と一致しません。PKWAREは、PKZIP製品が先進的な機能を利用できるように、予備的な機能を度々追加しています。各バージョンの主な機能は以下の通りです。

2.0: ファイルエントリをDeflateで圧縮可能に。
4.5: 64ビットZIPフォーマットが導入。
5.0: DES、Triple DES、RC2、RC4による暗号化をサポート。
5.2: RC2-64による暗号化をサポート。
6.1: 承認されたストレージについて記述。
6.2.0: セントラルディレクトリの暗号化について記述。
6.3.0: UnicodeUTF-8)ファイル名のストレージについて記述。サポートされるハッシュ、圧縮、暗号化アルゴリズムが追加。
6.3.1: SHA-256/384/512の標準ハッシュ値を修正。
6.3.2: 圧縮メソッド97(WavPack)について記述。

WinZipのバージョン12.1からは、Deflateよりも新しい圧縮メソッド(BZip2、LZMA、PPMd、Jpeg、WavPack)を使用するファイルの拡張子として「.zipx」が使用されています。

標準化



2010年4月、ISO/IEC JTC 1|ISO_IEC JTC 1でZIP互換の国際標準フォーマットを作成するプロジェクトが開始されました。このプロジェクトは「ドキュメントパッケージング」という名称で、OpenDocumentOffice Open XMLEPUBなどの既存の標準規格に適したZIP互換のアーカイブフォーマットを目指しています。

そして2015年、ISO/IEC 21320-1:2015として制定されました。

現在のZIPフォーマットは、オープンなコミュニティ主導の開発を経ていないため、オープンフォーマットの要求仕様を満たしていない場合があります。しかし、著作権、特許、商標などの制約はなく、誰でも自由に利用できます。

技術的な情報



ZIPは、複数のファイルを格納するシンプルなアーカイブフォーマットです。圧縮はオプションで、ファイル単位で圧縮が行われます。

ZIPは、データ破損に備えて32ビットのCRCアルゴリズムを利用し、アーカイブのディレクトリ構造を二箇所に含めることで保護機構を提供しています。

構造



ZIPファイルは、ファイルの最後に置かれるセントラルディレクトリの終端レコード(EOCD)によって認識されます。この構造により、ファイルの追加が容易になっています。

各エントリ(ファイルやディレクトリ)には、名前、メタデータ、およびZIPファイル内でのデータ位置が記述されたセントラルディレクトリエントリが存在します。これにより、アーカイブ全体を読み込むことなくファイルリストを高速に表示できます。

また、各エントリはローカルファイルヘッダとして情報も保持しており、冗長性を持たせています。ただし、ファイルは後から追加される可能性があるため、セントラルディレクトリの情報が最新であるとみなされます。

ZIPファイル内のエントリの順序は、アーカイブ内の実際の順序と一致する必要はありません。

各エントリは、ローカルファイルヘッダ、オプションの拡張データフィールド、およびファイルデータで構成されます。拡張フィールドは、ZIP64フォーマット、WinZip互換のAES暗号化、ファイル属性などをサポートするために使用されます。

ZIPフォーマットは、ファイル内の様々な構造を表すために、特定の4バイトの「シグネチャ」を使用します。各エントリ、セントラルディレクトリの終端レコード、およびセントラルディレクトリエントリには、それぞれ異なるシグネチャが割り当てられています。

ZIPファイルには、BOFやEOFのような目印はありません。通常はZIPエントリから始まりますが、自己解凍型のアーカイブのように、実行可能なファイルヘッダから始まる場合もあります。

ZIPアーカイブを正しく読み込むには、まずセントラルディレクトリの終端レコードを探し、それから他のセントラルレコードを探索する必要があります。

ZIPは複数のファイルシステムにまたがるアーカイブもサポートしており、分割してメールで送ったり、リムーバブルメディアで持ち運ぶのに便利です。

DOSのFATファイルシステムではタイムスタンプを2秒単位で保持しますが、ZIPファイルレコードもこれを模倣しています。より正確なタイムスタンプは拡張フィールドに格納できます。また、ZIPにはタイムゾーンの概念がないため、タイムスタンプは作成されたタイムゾーンを知っている場合にのみ意味を持ちます。

2007年9月、PKZIPはUTF-8ファイル名を格納する仕組みを含むZIP仕様をリリースし、ユニコード互換を追加しました。

ファイルヘッダ



ヘッダ内の複数バイトの値は、リトルエンディアンで格納されます。すべての長さを示すフィールドは、バイト単位で数えられます。

拡張フィールドには、OS固有の属性など、様々なオプションデータが含まれます。これは16ビットのIDと16ビットの長さのチャンクに分割されます。

ヘッダの直後には圧縮データが続きます。

汎用目的のビットフラグフィールドの3ビット目がセットされている場合、ヘッダの書き込み時にはCRC-32とファイルサイズが不明です。この場合、CRC-32とファイルサイズのフィールドにはゼロが書き込まれ、CRC-32とファイルサイズは圧縮データの後に12バイトのデータとして追加されます。

セントラルディレクトリエントリは、ローカルファイルヘッダを拡張したものです。

すべてのセントラルディレクトリエントリの後には、ZIPファイルの終わりを表すセントラルディレクトリの終端レコードが続きます。

この順序により、ZIPファイルをワンパスで作成できますが、展開時には通常、最後のセントラルディレクトリを最初に読み込みます。

圧縮メソッド



現在のZIPファイルフォーマット仕様では、以下の圧縮メソッドの詳細が記述されています。

stored(無圧縮)
Shrunk
Reduced(メソッド1-4)
Imploded
Tokenizing
Deflated
Deflate64
BZIP2
LZMA (EFS)
WavPack
PPMd

最も一般的な圧縮メソッドはDEFLATEで、IETF RFC 1951に記述されています。

暗号化



ZIPは、シンプルなパスワードベースの共通鍵暗号をサポートしていますが、既知平文攻撃に脆弱であり、貧弱なランダム数生成器の実装によっては安全性が低下する場合があります。

バージョン5.2以降のZIPファイルフォーマット仕様では、AESなどの新しい暗号化メソッドが追加されています。WinZipはAESベースの標準規格を使用しており、7-Zip、XCeed、DotNetZipでも使用されています。

一方、PKZIPやSecureZIPは、RC2、RC4、DES、Triple DES暗号メソッドや、電子証明書ベースの暗号化/認証をサポートしています。

ZIP64



オリジナルのZIPフォーマットには、ファイルサイズやアーカイブの合計サイズに4GiBの制限があり、エントリ数も65535個に制限されていました。仕様バージョン4.5では、これらの制限を回避するために16EiB(264バイト)まで増加させた「ZIP64」フォーマット拡張が導入されました。

ZIP64のサポートは比較的新しく、Windows XPではサポートされていませんが、Windows Vista以降のエクスプローラーではサポートされています。同様に、DotNetZip、IO::Compress::Zip、zipfileなどのライブラリもZIP64をサポートしています。

長所と短所



ZIPファイルのようにファイルを分割して圧縮すると、ランダムアクセスが可能になり、他のデータを読み込むことなく個々のファイルを取り出すことができます。また、ファイルごとに異なる辞書圧縮を利用することで、アーカイブ全体のサイズを小さくすることができます。

しかし、ZIPアーカイブフォーマットでは、個々のエントリに関するメタデータは圧縮されないため、小さなファイルが大量にある場合には効率が悪くなる場合があります。

このような場合には、圧縮されたtarアーカイブ(.tar.gzまたは.tgz)がより適していることがあります。ただし、tarアーカイブではランダムアクセス効率が低下します。

ZIPと他のファイルフォーマットとの組み合わせ



ZIPファイルフォーマットでは、セントラルディレクトリの後(ファイルの末尾)に、65535バイト以下のコメント欄があり、アーカイブの前や後に任意のデータを配置しても、ZIPアプリケーションはそのアーカイブを読み込むことができます。この特性を利用して、ZIPアーカイブとしても、別のフォーマットとしても扱えるようなファイルを作成できます。

例えば、WinZipやDotNetZipがサポートする自己解凍型アーカイブ(SFX)は、この特性を活用したものです。

ZIPフォーマットやJARフォーマットのような特性は、一見普通のファイルに見えるものの、コンピューター内部に害を及ぼすJavaクラスを隠すことに悪用される可能性もあります。

実装



多くのZIPツールとZIPライブラリが、様々なプログラミング環境で利用できます。ライセンスは商用やオープンソースのものがあります。WinZip、WinRAR、IZarc、Info-ZIP、7-Zip、PeaZip、DotNetZipなどが利用可能です。これらのツールの一部は、ライブラリやプログラミングインターフェースを提供しています。

オープンソースのライブラリとしては、GNUプロジェクトのgzipやInfo-ZIPがあります。Javaでは、java.util.zipパッケージが標準的なZIPファイルを扱うために提供されています。

.NETアプリケーションでは、.NET Framework 4.5で追加されたSystem.IO.Compression名前空間のZipArchiveクラスやZipFileクラスが使用できます。それ以前の環境では、無償のオープンソースライブラリであるDotNetZipが利用できます。

ZIPフォーマットのInfo-ZIP実装は、Unixファイルシステムの機能(ユーザーやグループID、ファイルパーミッション、シンボリックリンク)のサポートを追加します。また、Info-ZIP WindowsツールはNTFSファイルシステムパーミッションもサポートしています。

Windowsの圧縮フォルダー



Windowsでは、Windows 98以降、エクスプローラーからZIP形式の圧縮と展開がサポートされています。この機能は「圧縮フォルダー」と呼ばれています。しかし、Windowsの圧縮フォルダーはZIPのすべての機能をサポートしているわけではなく、AES暗号化や分割アーカイブなどの機能は利用できません。

また、ファイル名のエンコーディングの問題もあります。Windowsのシステムロケールが日本語に設定されている場合、ファイル名にはMicrosoftコードページ932が使用されますが、展開時にはUTF-8に対応しています。

強力な暗号化についての議論



2003年、WinZipは独自のAES-256暗号を導入しましたが、PKWAREは以前から存在した強力な暗号化仕様(SES)をAPPNOTE.TXTに含めませんでした。このため、WinZipとPKWAREの間で議論が生じました。

その後、PKWAREとWinZipは互いの製品をサポートすることに合意し、PKWAREは最終的にSESを記載したZIPファイルフォーマット仕様バージョン5.2をリリースしました。

ソフトにおける固有の拡張子



アプリケーション固有のファイル形式の中には、ファイルをZIP形式で圧縮したものが多数存在します。これらのファイルは、そのアプリケーション固有のものであることを示すために専用の拡張子が定義されています。

以下は、その一部の例です。

apk: Androidアプリケーションアーカイブ
crx: Google ChromeChromiumの拡張機能アーカイブ
docx, xlsx, pptx: Microsoft Officeの文書フォーマット (Office Open XML)
epub: 電子書籍の標準フォーマット
ipa: iOSデバイス向けアプリケーションアーカイブ
jar: Javaのアーカイブファイル
kmz: Google Earthの標準ファイル形式
odt, ods, odp, odb, odg, odf: OpenDocumentの文書フォーマット
* wgt: W3C Packaged Web Appsのパッケージファイル

これらの拡張子を持つファイルは、実質的にZIPアーカイブであり、ZIPツールで展開できます。

まとめ



ZIPファイルフォーマットは、複数のファイルを効率的に管理するための重要な技術です。その歴史、構造、技術的な詳細、そして他のフォーマットとの関係を理解することで、より深くZIPを活用できるようになるでしょう。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。