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

ZIP（ジップ）は、データ圧縮やアーカイブのフォーマット。Windowsでよく使用されるフォーマットである。

 概要 

ZIPフォーマットは1989年にフィル・カッツが考案したもので、トム・ヘンダーソンが考案したそれまでのARCフォーマットに置き換わるものとして、PKWAREのPKZIPユーティリティ
に実装された。

他の具体例については「#ソフトにおける固有の拡張子」節を参照のこと。

歴史

ZIPファイルフォーマット仕様は、PKZIP0.9のパッケージに同梱されていたファイルで初めて公開された。

ZIPフォーマットはオープンフォーマットとしてパブリックドメインでリリースされたものであり、ZIPフォーマットは誰しもが自由に利用でき、個人、団体、組織、あらゆる形態の利用において法的にもモラル的にも全く制約はない。

 起源 

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

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

名前の一部に「zip」という名前を使った標準化仕様やフォーマットがたくさんある。同じDeflate圧縮アルゴリズムを使用していながら、ヘッダー・フッターの異なる物としては、gzip () や zlib () などがある。その他、よく似た名前の異なるファイルフォーマットや圧縮アルゴリズムとして7z、bzip2、rzipなどがある。

 バージョン履歴 

.ZIPファイルフォーマット仕様にはバージョン番号がある。しかし、それは必ずしもPKZIPツールのバージョン番号とは対応せず、特にPKZIPバージョン 6以降がそれに該当する。PKWAREは、 PKZIP製品が先進的な機能を利用してアーカイブを展開できるように予備的な機能を幾度も追加している。しかし、そのようなアーカイブを作成するPKWARE仕様はPKZIPの次の主要なリリースまで公開されない。他の会社や組織は自分たちのペースでPKWAREの仕様をサポートしている。

PKWARE仕様による各バージョンの主な機能は以下の通り。

 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: Unicode (UTF-8) ファイル名のストレージについて記載した。サポートされるハッシュ、圧縮、暗号化アルゴリズムが追加された。
 6.3.1: SHA-256 / 384 / 512の標準的なハッシュ値に訂正した。
 6.3.2: 圧縮メソッド 97 (WavPack) について記載した。

WinZipのバージョン12.1からDeflateよりも新しい圧縮メソッド、特にBZipやLZMA、PPMd、Jpeg、Wavpackのメソッドを使用したファイルの拡張子に.zipxが使用されている。JpegとWavPackは「最適メソッド」圧縮が選択されたときに適切なファイル種別に対して適用されている。

 標準化 

2010年4月ISO/IEC JTC 1で、ZIP互換のISO / IECの国際標準フォーマットを作成するために開始されるプロジェクトを決めるための投票が行われた。

現在のZIPフォーマットはオープンフォーマットの要求仕様にあわないことがある。それは目に見える形で公開されたコミュニティ駆動開発を通して開発されていないからである。オープンな産業機構や標準化団体が賛同してメンテナンスされているものでもない。現在の ZIP フォーマットの一部は 自由 なファイルフォーマットの要求仕様にあっていない。誰もが ZIP フォーマットを、如何なる目的であっても金銭的な負担がなく利用できるようにするため、著作権、特許、商標などの制約がない。 PKWARE サイトにある最新の資料は、著作権表示があるが、フォーマット仕様とその機能拡張がパブリックドメインに置かれていることを認めている。

 技術的な情報 

 構造 

2007年9月にPKZIPは、UTF-8のファイル名を格納するための仕組みを含むZIP仕様のリビジョンをリリースした。それは最終的にZIPに対するユニコード互換を追加するものである。

 ファイルヘッダ 

+ ZIPローカルファイルヘッダ オフセット サイズ 内容 0 4 ローカルファイルヘッダのシグネチャ = 0x504B0304（PK\003\004） 4 2 展開に必要なバージョン (最小バージョン) 6 2 汎用目的のビットフラグ 8 2 圧縮メソッド 10 2 ファイルの最終変更時間 12 2 ファイルの最終変更日付 14 4 CRC-32 18 4 圧縮サイズ 22 4 非圧縮サイズ 26 2 ファイル名の長さ (n) 28 2 拡張フィールドの長さ (m) 30 n ファイル名 30+n m 拡張フィールド

+ Data descriptor オフセット サイズ 内容 0 0/4 （オプショナル） data descriptor シグネチャ = 0x08074b50 0/4 4 CRC-32 4/8 4 圧縮サイズ 8/12 4 非圧縮サイズ

+ セントラルディレクトリエントリ オフセット サイズ 内容 0 4 セントラルディレクトリエントリのシグネチャ = 0x504B0102（PK\001\002） 4 2 作成されたバージョン 6 2 展開に必要なバージョン (最小バージョン) 8 2 汎用目的のビットフラグ 10 2 圧縮メソッド 12 2 ファイルの最終変更時間 14 2 ファイルの最終変更日付 16 4 CRC-32 20 4 圧縮サイズ 24 4 非圧縮サイズ 28 2 ファイル名の長さ (n) 30 2 拡張フィールドの長さ (m) 32 2 ファイルコメントの長さ (k) 34 2 ファイルが開始するディスク番号 36 2 内部ファイル属性 38 4 外部ファイル属性 42 4 ローカルファイルヘッダの相対オフセット 46 n ファイル名 46+n m 拡張フィールド 46+n+m k ファイルコメント

+ ZIPセントラルディレクトリの終端レコード(EOCD) オフセット サイズ 内容 0 4 セントラルディレクトリの終端レコードのシグネチャ = 0x504B0506（PK\005\006） 4 2 このディスクの数 6 2 セントラルディレクトリが開始するディスク 8 2 このディスク上のセントラルディレクトリレコードの数 10 2 セントラルディレクトリレコードの合計数 12 4 セントラルディレクトリのサイズ (バイト) 16 4 セントラルディレクトリの開始位置のオフセット 20 2 ZIPファイルのコメントの長さ (n) 22 n ZIPファイルのコメント

 圧縮メソッド 

現在のZIPファイルフォーマット仕様では次のメソッドの詳細が記載されている。
stored（無圧縮）
Shrunk
Reduced（メソッド 1-4）
Imploded
Tokenizing
Deflated
Deflate64
BZIP2
LZMA (EFS)
WavPack
PPMd
最も一般的な圧縮メソッドはDEFLATEでIETF に記載されている。

 暗号化 

ZIPはシンプルなパスワードベースの共通鍵暗号をサポートすると仕様に記載されている。但し、重大な脆弱性があることが知られている。特に、既知平文攻撃に対して脆弱性があり、貧弱なランダム数生成器の実装によってさらに安全性が低くなる場合もある。

バージョン5.2以降の.ZIPファイルフォーマット仕様には、圧縮 と 暗号化 (例えば AES) を含む新しい機能のメソッドが追加されている、と記載されている。WinZipはAESベースの標準規格を使用し、それは7-Zip、XCeedやDotNetZipでも使用されている。しかし、ベンダによっては他のフォーマットを使用するものである PKZIP また、SecureZIP は RC2, RC4, DES, Triple DES 暗号メソッド, 電子証明書ベースの暗号 / 認証 (X.509) やアーカイブヘッダ暗号化をサポートする。

 ZIP64 

オリジナルのZIPフォーマットは、ZIPアーカイブ内のエントリに 65535 の制限があるのと同様に、様々なサイズ（ファイルの圧縮/非圧縮サイズ、アーカイブの合計サイズ）に4 GiBの制限があった。仕様のバージョン4.5（それは特定ツールのバージョン4.5と同じではない） では、PKWAREはこういった制限を回避するために16 EiB（264 バイト）まで増加させた "ZIP64" フォーマット拡張を導入した。ZIP64サポートは新規に発生したものである。例えば、Windows XPのファイルエクスプローラーはZIP64をサポートしないが、 Windows Vistaのエクスプローラーではサポートする。同様にDotNetZipやPerlのIO::Compress::Zip、PythonのzipfileのようなライブラリはZIP64をサポートする。Javaの組み込みモジュールjava.util.zipは 2010年9月現在ではサポートしていない。今後、OpenJDKに追加されてJava 7への同梱を予定している。

 長所と短所 

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

この圧縮の手法は一般的に小さなファイルが大量にあるときのアーカイブとしては適切ではない。ZIPアーカイブフォーマットでは、個々のエントリに関する情報を持つメタデータは圧縮しない。これは、特に個々のエントリのサイズを小さくして、そのエントリ向けのメタデータのサイズを扱うようにアーカイブ可能な最大圧縮比率を設けて制限されているためである。

別の手法としては 圧縮されたtarアーカイブ（.tar.gz または .tgz） が使用される。それはファイルデータとメタデータがgzipで圧縮される1つの単位として圧縮される。この手法の欠点はランダムアクセスの効率が悪くなってしまうことである。

 ZIPと他のファイルフォーマットとの組み合わせ 
ZIPファイルフォーマットでは、セントラルディレクトリの後（ファイルの末尾）に、65,535バイト以下のデータを入れることのできるコメント欄がある。

ZIPフォーマットやZIPの亜種であるJARフォーマットが持つこのような特性は、一見普通のファイルに見えるが、コンピューター内部に害を及ぼすJavaクラスを隠すことに悪用できてしまう。例えば、ウェブにアップロードされるGIFイメージがある。これはGIFARと呼ばれる手法で、Facebookのようなウェブアプリケーションに対して効率的な攻撃として知られている。

 実装 

.NETアプリケーションでは、.NET Framework 4.5で追加されたSystem.IO.Compression名前空間のZipArchiveクラスやZipFileクラスなどが使用できる。それ以前の場合、Microsoft Public License でソースとバイナリが利用できる DotNetZipと呼ばれる無償のオープンソースライブラリがある。従来のパスワードを用いたZIP暗号化、WinZip互換のAES暗号化、ユニコード、ZIP64、コメント、分割アーカイブ、自己展開アーカイブといった多くのZIP機能をサポートする。Microsoft .NET 3.5 ランタイムライブラリはZIPフォーマットをサポートするクラスSystem.IO.Packaging.Packageを含む。

 Windows 圧縮フォルダー 

Windowsでは、Windows 98のためにリリースされたPlus!パック以降、エクスプローラーからZIP形式の圧縮と展開をサポートしている。マイクロソフトはこの機能を「圧縮フォルダー」と呼んでいる。圧縮フォルダーはZIPの機能を全てサポートしているわけではなく、例えばWindows 10ではAES暗号化、分割アーカイブ、パスワード付き圧縮などが行えない。また圧縮時にはシステムロケールが日本語に設定されたWindowsではファイル名にMicrosoftコードページ932を使用している。（Windows NT系の内部文字コード及びファイルシステムの文字コードはUnicodeであるが、互換性のためにMicrosoftコードページ932に変換している。変換できない文字が含まれるファイル名は圧縮できない。）展開時はhotfixを適用したWindows 7もしくはWindows 8以降でUTF-8に対応したため、ファイル名がMicrosoftコードページ932とUTF-8のどちらであっても問題なく展開できる。

 強力な暗号化についての議論 
2003年にWinZip 9.0パブリックベータをリリースしたとき、WinZipは独自のAES-256暗号を導入した。それは違うファイルフォーマットを用いた新たな仕様としてドキュメントに記載された。

この欠点を克服するためにPentaZipのような同時期に存在したプロダクトは違うファイルフォーマットにZIPアーカイブを暗号化する強力なZIP暗号化を実装した。

また別の議論では、PKWAREは2003年7月16日に安全な.ZIPファイルを作成するために強力な暗号と.ZIPを組み合わせるための方法を記載した特許を適用した。

結局PKWAREとWinZipはお互いのプロダクトをサポートすることに同意した。2004年1月21日にPKWAREはWinZipベースのAES互換フォーマットをサポートするとアナウンスした。WinZipベータの次のバージョンではSESベースのZIPファイルのサポートが行われた。

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

、以下に示す例はその一部である。ただし、圧縮アルゴリズムにzlibを使っているものでも、ZIP互換の格納方式を使っていないものは掲載しない。

 apk
 Android のアプリケーションアーカイブ
 crx
 Google ChromeやChromiumの拡張機能のアーカイブファイル
 docx, xlsx, pptx
 Microsoft Office（2007以降）の文書フォーマット (Office Open XML)
 epub
 IDPFが提唱する電子書籍の標準フォーマット
ipa
 iPhoneシリーズをはじめとしたiOS搭載デバイス向けのアプリケーションアーカイブ
 ipg
 iPodゲームのアーカイブファイル
 jar
 Javaのアーカイブファイル
 kmz
 Google Earthの標準ファイル形式。kmlをZIP圧縮したもの。
 nar
 伺かのINSTALL/1.x仕様に準拠したアーカイブファイル
 odt, ods, odp, odb, odg, odf
 OpenDocumentの文書フォーマット
 smzip
 StepManiaの各種の自動インストール型パッケージファイル
 wgt
 W3C Packaged Web Apps (W3C Widgets) のパッケージファイル。Bada widget、Tizen Web application、Opera widget など。
 wsz
 Winamp用のスキンファイル
 wmz
 Windows Media Player用のスキンファイル
 xpi
 Mozilla Firefox（及びそれをベースとするNetscapeシリーズのウェブブラウザなど）やMozilla Thunderbirdなどの拡張機能（アドオン）のインストーラファイル (XPInstall)
 3mf
 3Dプリンター向けの3Dファイル