08 March 2012

(Linux) unzipで解凍できないパスワード付きzipファイル

パスワードをつけて圧縮したファイルを、別のパソコンで解凍しようとしたところ、解凍できない…

$ unzip rhy.zip Archive: rhy.zip skipping: playlists.xml unsupported compression method 99

これはコマンドラインで実行した結果だが、実際はGnomeデスクトップ上の書庫マネージャーを使っている。出てくるメッセージは同じもの。

コマンドラインで詳しく調べてみると

$ zipinfo -v rhy.zip Archive: rhy.zip 6664 bytes 2 files End-of-central-directory record: ------------------------------- Actual offset of end-of-central-dir record: 6642 (000019F2h) Expected offset of end-of-central-dir record: 6642 (000019F2h) (based on the length of the central directory and its expected offset) This zipfile constitutes the sole disk of a single-part archive; its central directory contains 2 entries. The central directory is 139 (0000008Bh) bytes long, and its (expected) offset in bytes from the beginning of the zipfile is 6503 (00001967h). There is no zipfile comment. Central directory entry #1: --------------------------- playlists.xml offset of local header from start of archive: 0 (00000000h) bytes file system or operating system of origin: Unix version of encoding software: 2.0 minimum file system compatibility required: Unix minimum software version required to extract: 2.0 compression method: unknown (99) file security status: encrypted extended local header: no file last modified on (DOS date/time): 2012 Mar 7 07:38:02 32-bit CRC value (hex): 00000000 compressed size: 358 bytes uncompressed size: 1248 bytes length of filename: 13 characters length of extra field: 11 bytes length of file comment: 0 characters disk number on which file begins: disk 1 apparent file type: binary Unix file attributes (100644 octal): -rw-r--r-- MS-DOS file attributes (20 hex): arc The central-directory extra field contains: - A subfield with ID 0x9901 (unknown) and 7 data bytes: 02 00 41 45 01 08 00. There is a local extra field with ID 0x5855 (old Info-ZIP Unix/OS2/NT) and 8 data bytes (GMT modification/access times only). There is no file comment.

どうも圧縮手法がunzipでは対応していない新方式かなにからしい…

Googleで検索すると、ZIP-2.0, AES-128, AES-192, AES-256 方式で暗号化されるらしく、UbuntuにインストールされているunzipはZIP-2.0しか対応していないようだ。

ということで、p7zipパッケージをインストールすると、ちゃんと解凍できるようになる。

$ 7z t rhy.zip 7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 p7zip Version 9.20 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,4 CPUs) Processing archive: rhy.zip Testing playlists.xml Enter password (will not be echoed) : Testing rhythmdb.xml Everything is Ok Files: 2 Size: 77568 Compressed: 6664

つまり…、p7zipがインストールされているUbuntuの書庫マネージャでは、ZIPを作成するときにp7zipが用いられているようだ。

■ zipの暗号化方式を制御する

7zipの詳細マニュアルが /usr/share/doc/p7zip-full/DOCS/MANUAL/switches/method.htm に格納されている。それには、暗号化方式の制御は -mスイッチに続いて

em={EncryptionMethodID} Sets a encryption method: ZipCrypto, AES128, AES192, AES256

のように指定するとなっている。

例:ZipCrypto方式で暗号化する場合(最も互換性あり)

7za a -tzip -p****** -mem=ZipCrypto output.zip input.txt

例:AES256方式で暗号化する場合

7za a -tzip -p****** -mem=AES256 output.zip input.txt

例:zipコマンドはZipCrypto方式でしか暗号化できない

zip -e output.zip input.txt

■ どの暗号化方式なのかを表示する

$ 7z l -slt test.zip 7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 p7zip Version 9.20 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,4 CPUs) Listing archive: test.zip -- Path = test.zip Type = zip Physical Size = 19937919 ---------- Path = 01.pdf Folder = - Size = 22551568 Packed Size = 19937787 Modified = 2012-06-22 19:43:06 Created = Accessed = Attributes = ..... Encrypted = + Comment = CRC = Method = AES-128 Deflate Host OS = Unix Version = 51