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

読み:ジップ
外語:ZIP 英語
品詞:名詞

ファイルアーカイバーPKZIPで採用され、普及したアーカイブファイル形式の一つ。世界的なデファクトスタンダードの一つとなっている。

目次

由来等

オリジナルのPKZIPは、Phillip Walter Katzにより作られたシェアウェアであった。またMicrosoft Windows用として作られたWinZipは製品である。

但し、ZIPファイルフォーマットの仕様自体は無償で公開されており、PKZIPと互換のあるファイルを作成できるソフトウェアがオープンソースソフトウェアなどとしても広く流通している。

ZIPファイルフォーマットには様々な圧縮アルゴリズムを含めることができるが、現在の主流は古くからあるDeflate方式である。ファイルを暗号化をすることもでき、標準の方法は古くからあるZipCryptoではあるが極めて脆弱で、ZIPファイルフォーマット自体はAES-128などに対応できる仕様に更新されているものの対応するソフトウェアは少ない。

ライブラリ

ZIP形式で圧縮、アーカイブするためのライブラリは様々なものがある。

日本国内で使われている主流は、次のものがある。

  • ZIP32.DLL (Info-ZIP)
  • 7-ZIP32.DLL (秋田稔、統合アーカイバプロジェクト)
  • UNZIP32.DLL (庄田隆司、統合アーカイバプロジェクト、Info-ZIP 5.42ベース)
  • ARCEXT.DLL (pon software、Explzhで使用)

庄田隆司版UNZIP32.DLLはフリーではないため、互換DLLがある。

  • unzip32.dll (新山義文、7-zip32.dllを呼び出すUNZIP32.DLL互換の仲介DLL)

仕様

RFC

ZIPは、大きく器となるファイルフォーマットと圧縮アルゴリズムとに分けることができ、それぞれRFCとなっている。

  • RFC 1950 ‐ ZLIB Compressed Data Format Specification version 3.3
  • RFC 1951 ‐ DEFLATE Compressed Data Format Specification version 1.3
  • RFC 1952 ‐ GZIP file format specification version 4.3

フォーマット

RFC 1950(ZLIB Compressed Data Format Specification version 3.3)は、zlibとして知られるデータ圧縮ライブラリで使われるファイルフォーマットの仕様

このRFCでチェックサム計算「adler-32アルゴリズム」についても述べられている。

しかし実際には、これを読んでも殆ど実装の役に立たない。PKWARE Inc.が公開していたAPPNOTE.TXTにフォーマットの詳細がある。

なお、gzipのフォーマットはRFC 1952に書かれている。

Deflateアルゴリズム

主流であるDeflateアルゴリズムは、RFC 1951に書かれている。

PKZIPや互換ソフトウェアのほか、gzipなどでも使われている方式である。

ヘッダーの拡張

元々MS-DOS用に作られたフォーマットであるため、ZIPファイルフォーマットのヘッダーには、もはやそのままでは時代遅れで使い物にならない情報欄が多々ある。

日付と時刻のフィールドはMS-DOS形式の各2バイトであったり、CRC-32を格納する4バイトの欄があったりするほか、圧縮サイズや非圧縮サイズは4バイトしかない。当時はこれで充分だったが、いまでは不足する。

そこで、こういった足りない情報を補うために、追加ヘッダーを挿入することが可能になっている。大きなファイルはヘッダーID 0x0001でファイルサイズが指定できたり、UNIXのユーザーID等はヘッダーID 0x000dを用いて格納したりできる。機能が不足するタイムスタンプの格納については0x0020が予約されているが使われている形跡がなく、NTFS用の0x000aで8バイト形式、UNIX用の0x000dで4バイト形式で、おのおののシステム向けのタイムスタンプ情報が格納できるようにはなっている。

フォーマット仕様書6.3.9(2020(令和2)年7月15日)時点では以下がPKWAREによって予約されているとされる。

  • 0x0001 ‐ Zip64拡張情報 追加フィールド
  • 0x0007 ‐ AV情報
  • 0x0008 ‐ 拡張言語エンコーディングデータ(PFS)用に予約
  • 0x0009 ‐ OS/2 追加フィールド
  • 0x000a ‐ NTFS 追加フィールド
  • 0x000c ‐ OpenVMS 追加フィールド
  • 0x000d ‐ UNIX 追加フィールド
  • 0x000e ‐ ファイルストリームとフォーク記述子用に予約済み
  • 0x000f ‐ パッチ記述子
  • 0x0014 ‐ PKCS#7X.509証明書のストア
  • 0x0015 ‐ 個々のファイルのX.509証明書IDと署名
  • 0x0016 ‐ X.509セントラルディレクトリの証明書ID
  • 0x0017 ‐ 強力な暗号化ヘッダー
  • 0x0018 ‐ レコード管理コントロール
  • 0x0019 ‐ PKCS#7暗号化受信者証明書リスト
  • 0x0020 ‐ タイムスタンプレコード用に予約
  • 0x0021 ‐ ポリシー復号化キーレコード
  • 0x0022 ‐ Smartcryptキープロバイダーレコード
  • 0x0023 ‐ Smartcryptポリシーキーデータレコード
  • 0x0065 ‐ IBM S/390 (Z390), AS/400 (I400)属性‐非圧縮
  • 0x0066 ‐ IBM S/390 (Z390), AS/400 (I400)属性‐圧縮 用に予約
  • 0x4690 ‐ POSZIP 4690(予約)

また、以下がサードパーティーによって使用されていることが確認されているとされる。

  • 0x07c8 ‐ Macintosh
  • 0x2605 ‐ ZipIt Macintosh
  • 0x2705 ‐ ZipIt Macintosh 1.3.5+
  • 0x2805 ‐ ZipIt Macintosh 1.3.5+
  • 0x334d ‐ Info-ZIP Macintosh
  • 0x4341 ‐ Acorn/SparkFS
  • 0x4453 ‐ Windows NTセキュリティ記述子 (バイナリーACL)
  • 0x4704 ‐ VM/CMS
  • 0x470f ‐ MVS
  • 0x4b46 ‐ FWKCS MD5
  • 0x4c41 ‐ OS/2アクセス制御リスト (テクストACL)
  • 0x4d49 ‐ Info-ZIP OpenVMS
  • 0x4f4c ‐ Xceed 元の場所の追加フィールド
  • 0x5356 ‐ AOS/VS (ACL)
  • 0x5455 ‐ 拡張タイムスタンプ
  • 0x554e ‐ Xceed ユニコード追加フィールド
  • 0x5855 ‐ Info-ZIP UNIX (オリジナル、OS/2、NTなど)
  • 0x6375 ‐ Info-ZIP Unicodeコメント追加フィールド
  • 0x6542 ‐ BeOS/BeBox
  • 0x7075 ‐ Info-ZIP Unicodeパス追加フィールド
  • 0x756e ‐ ASi UNIX
  • 0x7855 ‐ Info-ZIP UNIX (新規)
  • 0xa11e ‐ データストリームの調整(Apache Commons-Compress)
  • 0xa220 ‐ Microsoft Open Packaging GrowthHint
  • 0xfd4a ‐ SMS/QDOS
  • 0x9901 ‐ AE-x 暗号化構造
  • 0x9902 ‐ 不明

拡張されたヘッダーについては、対応するアプリでなければ当然処理できない。読み飛ばすことは可能だが、その内容に依存したデータが格納されている場合は、専用に対応したソフトウェアを用いなければそのファイルは利用できないことになる。

圧縮アルゴリズム

ZIP形式の基本は、32Kスライド窓の「Deflate/Inflate compression」と呼ばれる、初段にハッシュを用いたLZSS、後段にハフマン符号を用いるLZ77の変形アルゴリズムである。

日本のLZHUFと似たようなもので、DEFLATEについてはRFC 1951としてその仕様が公開されており、広く使われている。

フォーマット仕様書6.3.9(2020(令和2)年7月15日)時点では以下に対応する。

  • 0 Store (無圧縮)
  • 1 Shrink
  • 2 Reduce (compression factor 1)
  • 3 Reduce (compression factor 2)
  • 4 Reduce (compression factor 3)
  • 5 Reduce (compression factor 4)
  • 6 Implode
  • 7 Tokenize
  • 8 Deflate
  • 9 Deflate64
  • 10 PKWARE Data Compression Library Imploding (old IBM TERSE)
  • 11 (予約)
  • 12 bzip2
  • 13 (予約)
  • 14 LZMA (EFS)
  • 15 (予約)
  • 16 IBM z/OS CMPSC Compression
  • 17 (予約)
  • 18 IBM TERSE (new)
  • 19 IBM LZ77 z Architecture (PFS)
  • 20 (非推奨)
  • 93 Zstandard (zstd) Compression
  • 94 MP3
  • 95 XZ
  • 96 JPEG variant
  • 97 WavPack
  • 98 PPMd version Ⅰ, Rev 1
  • 99 AE-x encryption marker

様々なアルゴリズムに対応しているが、互換性などの問題から、古くて性能も普通ながら、今もDeflateが主流として使われている。無圧縮のまま格納するときは0を使うが、1〜6についてはレガシーアルゴリズムであり、もはや推奨されない。

暗号化アルゴリズム

書庫の暗号化も可能で、元々の暗号化(ZipCrypto)のほかに、拡張機能として様々な暗号化アルゴリズムにも対応する。当然、拡張された暗号化については、展開する側が対応していなければ復元することができない。

ZIPファイルフォーマット内の各ヘッダー内にある汎用ビットフラグには、暗号化されている場合TRUEになるフラグに加えて、強力な暗号化を使用する場合TRUEになるフラグが存在する。

強力な暗号化を使用する場合はその暗号化のIDを設定する仕様で、拡張性が考慮されている。フォーマット仕様書6.3.9(2020(令和2)年7月15日)時点では以下に対応する。

  • 0x6601 ‐ DES
  • 0x6602 ‐ RC2 (5.2より前)
  • 0x6603 ‐ 3DES 168
  • 0x6609 ‐ 3DES 112
  • 0x660E ‐ AES-128
  • 0x660F ‐ AES-192
  • 0x6610 ‐ AES-256
  • 0x6702 ‐ RC2 (5.2以降)
  • 0x6720 ‐ Blowfish
  • 0x6721 ‐ Twofish
  • 0x6801 ‐ RC4

現在はAESが使われている。AESの前は3DESが使われていた。

ハッシュアルゴリズム

ZIPファイルフォーマットは、書庫内にファイルが正しく格納されているか、ダウンロード中に破損や改竄がされていないかを確認するために、ファイルのハッシュを記録する機能を有する。

フォーマット仕様書6.3.9(2020(令和2)年7月15日)時点では以下に対応する。

  • 0x0000 ‐ なし
  • 0x0001 ‐ CRC-32
  • 0x8003 ‐ MD5
  • 0x8004 ‐ SHA-1
  • 0x8007 ‐ RIPEMD160
  • 0x800C ‐ SHA-256
  • 0x800D ‐ SHA-384
  • 0x800E ‐ SHA-512

元々はCRC-32が使われていた。ダウンロー中に生じうる破損検出には当時でも今でもこれで充分ではあるが、改竄検出などでよりセキュアが求められる時代になり、様々なハッシュアルゴリズムに対応するようになった。

関連フォーマット

拡張子は.zipではないが、ZIP形式(アルゴリズム、フォーマットの双方)を採用しているファイルフォーマットは多数確認されている。

以下、確認されたもの(拡張子ABC順)。

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club