解凍できないzipファイルを作った話
gaiyou
表題の通り、パスワード付きのzipファイルを作成、共有後開くことができない!という事象が発生しました👀
手元で再現をしてみたところ、正しいパスワードを入力しても、再度入力を求められてしまう…
いろいろ調べてみたところ、
- Finderから右クリックでzipファイルを作成する
- zipcloakでそのzipにパスワードをかける
この条件が揃うと上記のことが起こってしまう
ということがわかりました。
Finder上からファイル圧縮し、zipcloakでパスワードをかける際は下記のように実施します。
zipcloak /Users/akane/Downloads/test.docx.zip
解決法
結論から言うと、unzipコマンドを使用することで、開けなかったzipファイルを開けるようになりました。
解凍できなかったファイルをunzipコマンドでみてみると、
さっき見つけた__MACOSXというディレクトリが一緒にできてしまっています。
これは、Mac OS特有の事象らしく、zipファイルのメタデータとリソースフォークを兼ねるファイルのようです。Finderから圧縮を実行すると作成されるファイルのようでした。
これにzipcloakでパスワード付与する際、__MACOSXがあることで、Local Entry CRC does not muchというwarningが出てしまい、結果Finderから元のパスワードで解凍ができなくなったようです。
zipコマンドで作成したファイルにzipcloakを適用してみて、様子を見てみましょう。
zip -r test2.zip test.docx
で対象のファイルを圧縮し、
zipcloak test2.zip
でパスワードをかけます。
問題なく展開できました。
これまでの挙動をまとめると、このような形になります。
zipcloakでパスワードをかけた時にも出ていた、「CRC doesn't much CD」というwarningが気になりますね。
CRCとは何か
そもそもzipファイルとCRCの関係性についてですが、
データ破損の保護機構としてCRCが存在するようです。
CRC (Cyclic Redundancy Check) は、ファイルのデータ破損を検出するためのアルゴリズムで、
ZIPファイルでは、各ファイルのCRC値がローカルエントリとCDに保存されます。ファイルが解凍されると、CRC値が再度計算され、保存された値と比較されます。値が一致しない場合、ファイルが破損している可能性があるようです。
結論
今回はFinderで圧縮時に作成された__MACOSXが原因でCRCの値に差分が出てしまったようです。
該当のファイルについては、zipcloakを実施後、下記コマンドを実行、__MACOSXを削除することでFinder上で開くことができるようになりました。
zip -d filename.zip __MACOSX/\*
Discussion