ZIP (ファイルフォーマット)
読み:ジップ
外語:ZIP
ファイルアーカイバー
の
PKZIP
で採用され、普及した
アーカイブファイル
形式の一つ。世界的なデファクトスタンダードの一つとなっている。
目次
情報
概要
由来等
ライブラリ
特徴
仕様
RFC
フォーマット
Deflateアルゴリズム
ヘッダーの拡張
圧縮アルゴリズム
暗号化アルゴリズム
ハッシュアルゴリズム
関連フォーマット
情報
種類: データ圧縮
拡張子: .zip
MIMEタイプ名
:
application/zip
ファイルタイプ: "ZIP "
UTI
: com.pkware.zip-archive
マジックナンバー
PK\x03\x04
PK\x05\x06 (空のアーカイブ)
PK\x07\x08 (分割されたアーカイブ)
開発者: Phillip Walter Katz (PKWARE)
概要
由来等
オリジナルの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 I, 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順)。
.docx
、
.xlsx
、
.pptx
Office Open XML Formats
.jar
Javaアーカイブ。実行形式や各種リソースを1ファイルにまとめたもの
.odtほか
OpenDocument Format
.xpi
Mozilla Firefox
(および派生品)等における拡張機能(アドオン)
.zip
ZIPコンテナー
(正式名称不明)
mimetypeというファイルを先頭に置くことで汎用の
コンテナーフォーマット
としたもの
再検索