🔐

解凍できないzipファイルを作った話

2024/03/24に公開

gaiyou

表題の通り、パスワード付きのzipファイルを作成、共有後開くことができない!という事象が発生しました👀
手元で再現をしてみたところ、正しいパスワードを入力しても、再度入力を求められてしまう…

いろいろ調べてみたところ、

  • Finderから右クリックでzipファイルを作成する
  • zipcloakでそのzipにパスワードをかける

この条件が揃うと上記のことが起こってしまう
ということがわかりました。

Finder上からファイル圧縮し、zipcloakでパスワードをかける際は下記のように実施します。

zipcloak /Users/akane/Downloads/test.docx.zip

解決法

結論から言うと、unzipコマンドを使用することで、開けなかったzipファイルを開けるようになりました。

解凍できなかったファイルをunzipコマンドでみてみると、
さっき見つけた__MACOSXというディレクトリが一緒にできてしまっています。

これは、Mac OS特有の事象らしく、zipファイルのメタデータとリソースフォークを兼ねるファイルのようです。Finderから圧縮を実行すると作成されるファイルのようでした。
https://news.mynavi.jp/article/osxhack-30/#:~:text=AppleDoubleのデータフォーク以外の部分(リソースフォーク+メタデータ)

これに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