GNOME環境で作成したパスワード付きZIPが解凍できない時は - 2018-06-13 - ククログ

ククログ

株式会社クリアコード > ククログ > GNOME環境で作成したパスワード付きZIPが解凍できない時は

GNOME環境で作成したパスワード付きZIPが解凍できない時は

p7zipパッケージをシステムから取り除くと、 解凍できるZIPファイルが作れるようになるかもしれません。

こんにちは、クリアコードの藤本です。今回の記事では:

  1. GNOME標準のアーカイバでパスワード付きZIPファイルを作成したら、

  2. Windowsのエクスプローラやunzipコマンドで開けなかった。

という方向けに、この問題の原因と対策をお伝えしたいと思います。

問題の要点

GNOMEには標準のアーカイバとして「File Roller」というプログラムが付属しています。 普段意識して使うことは少ないかもしれないのですが、例えば、 Nautilusの「ファイルを圧縮する」メニューはこのプログラムが提供しており、 意外と多くの場面で利用されています。

今回取り上げる問題は、このプログラムでパスワード付きZIPファイルを作成すると、 他のプログラムで解凍できなくなることがある、というものです。 実際に、私の環境でFile Rollerを使ってパスワード付きZIPファイルを作成し、 unzipコマンドで解凍しようとすると、次のような警告が表示されます:

$ unzip  password.zip
Archive:  password.zip
   skipping: test.txt               need PK compat. v5.1 (can do v4.6)

また、このZIPファイルをWindows 10のエクスプローラで展開しようとすると、 例外が発生して処理が中断してしまいます。

予期しないエラーのため、ファイルをコピーできません。このエラーが再発する場合は、
エラーコードを利用して、この問題についてのヘルプを検索してください。

エラー 0x80004005: エラーを特定できません。

何が原因なのか?

この現象の本質的な原因は、File Rollerが「AES-128」でファイルを暗号化することにあります。

まず話の前提として、ZIPファイルの暗号化方式について簡単に整理します:

  1. もともと、ZIPには(PKZIP v1.0の時代から)単純なストリーム暗号が備え付けられており、 これが2018年現在も最もよく使われる暗号化方式となっています。

  2. しかし、この方式は暗号としては非常に弱く、 比較的簡単に突破できることが既に20年以上前から知られています。

  3. このため、「もっと強固な暗号化方式を導入して、セキュリティの向上を図ろう」という改良が、 いくつかのグループで進められており、その改良案の中でも現在最も有力なのが、 WinZipが2003年に導入したAESベースの暗号化仕様です。

  4. ただし「有力」とは言っても、他の実装の追従は極めて遅く、 公開から15年近く経った今でも、多くのZIPアーカイバはこの暗号化仕様をサポートしていません。

ここで、File Rollerに話を戻すと、 このプログラムは『7-Zipがインストールされている時は、AES-128を利用して暗号化する』 という実装になっています。システムに7-Zipが見つからない場合は、伝統的な暗号化方式が使われます。 File Rollerで生成したZIPファイルが、他のアーカイバで解凍できなくなったりする原因はここにあります。 要するに、実行時のシステムの状態によって、適用される暗号アルゴリズムがバックグラウンドで切り替わるのです。

実際に、先ほど解凍できなかったZIPアーカイブを検査してみると、 格納されているファイルがAES-128で暗号化されていることが確認できます:

$ 7z l -slt password.zip | grep Method
Method = AES-128 Store

暫定的な対応策

結論を先に述べると、File Rollerの暗号化方式を互換性のある旧方式に戻したい場合、 ユーザーには「7-Zipをアンインストールする」という選択肢しか現状はありません。 というのも、前節で解説した処理はソースに(暗号化アルゴリズムの選択含めて) ハードコードされており、設定やオプションで変えられる仕組みになっていないからです。

# Red Hat系なら `dnf remove p7zip`
$ sudo apt remove p7zip-full

参考までに、以下に該当するソースコードの箇所を示します:

もちろん、適切な環境があれば、 該当箇所を変更した独自ビルドを作ることで問題を迂回することもできます。 しかし、手元でコードをいじって回避するよりは、 アップストリームで根本から問題を解決したいものです。

根本的な解決に向けて

そこで私たちは、今回の問題についてGNOMEプロジェクトに修正パッチを投げています。

https://gitlab.gnome.org/GNOME/file-roller/merge_requests/1

ただし、このパッチがそのまま取り込まれることはさほど期待しておらず、 これを起点に議論を進めていきたい、というのが基本的な立場です (というのも、最終的な解決までに議論が必要な論点がいくつかあるためです)。 詳細はパッチに付けた説明をご参照ください。

もし読者の皆様の中で、「これは」という意見をお持ちの方がいらっしゃれば、 ぜひとも上のスレッドにコメントをお寄せください。 皆様のご意見をお待ちしています。