誰が得するのかよくわからないadvent calendar 4,5日目です。朝4時までアレコレしてたら流石に眠くて4日目めげたので手抜きご容赦ください・・・・
たまにはテクニカルなこと書いたほうが良いかなと思ってなにか無いかなと思ってたんですが、最近、国がPPAP方式のファイル送信をやめるというながれでZIP暗号の安全性が話題になっていて丁度良いかなと思って斜め読みした話でも書こうかなと。
今日はZipの暗号強度の話です。
詳細理解する元気がなかったので、大まかな流れご説明します。ガチ勢は A Known Plaintext Attack on the PKZIP Stream Cipherで検索してお読みください。
どうして今更Zip暗号が話題なの?
結論から言うとAES暗号方式のZIPで"安全な方法で"パスワードを送れば何も問題ないんですが、社会人お作法としてPPAP方式というファイル送付手段があるのでした。
安全なファイル送信手段というのは考え始めると結構深くて、「クラウド使えばいいじゃん」みたいな単純な話でもなく、メーリングリストの運用だとかファイルの転送だとかいろんなユースケースを考えると結構頭が痛くなります。世界中の人がGoogle Driveの上で生きていたら問題も少ないのでしょうが、なかなかそういうわけにも行きません。
そんな流れの中で、「そもそもZipの暗号クソじゃない」みたいのがそこかしこで話題になっています。
4桁数字のパスワード暗号化済ZIPのクラック実験 https://t.co/mKYAQttn6V
— 及川卓也 / Takuya Oikawa (@takoratta) 2020年12月5日
もちろん「みんな短いパスワード使いすぎじゃない?」みたいな話も大いにあるんですが、ことZipファイルの暗号についてはもっと根深い問題があるらしいんですね。
それが、こちらの論文の話で、ざっくり要約すると部分的にでも内容がわかっていると、鍵の候補が絞れるので総当りでも簡単に複合できてしまうという話なのでした。
一体なんでなんでしょう?ざっくりこの論文の内容を要約します。よく検索するとPDFが落ちているので興味がある方はタイトルで検索してください。
超訳:Zip暗号化の流れ
手早く記事を書き上げるのがこの誰得advent calendarの趣旨なので、詳細の理解を諦めて超ざっくりしたポイントだけ書いていきます。
まず、そもそも原理的にZipがどう暗号化されているのでしょうか?「ささのは」を暗号化してみましょう。ゴールイメージはこうです。
暗号化をするには鍵を使います。標準のZip暗号化では1文字ずつ暗号化をしていきます。
鍵1を使って「さ」を「あ」に暗号化しました。ちなみに、同じ鍵を使うと「あ」を「さ」に複合できます。
次の「さ」を暗号化するために、新しい鍵2を「さ」と鍵1から作り出します。
鍵1と鍵2は違う鍵です。なので鍵2で「さ」を暗号化すると違う言葉になります。
このように、Zipの標準の暗号化では順々に鍵を新しくしながら一文字ずつ暗号化を行っていきます。なので、同じ「さ」であっても違う文字に暗号化されるのでより元の文章が推測しにくくなっているのかもしれません(?)。「?」と書いたのは、パット見の推測のしずらさと暗号強度ってあんまり関係ないんですよね。
この要領で繰り返していくと「ささのは」が「あぬめほ」に変換されます。見事によくわからない文章に暗号化されました。
ポイント1: 鍵が96bit固定
さて、この暗号化方式のどのへんが問題なのでしょうか?まず、問題の一つはこの鍵が96bitの長さで固定であるところです。
「あれ?Zipってパスワード何桁でも入れられたよね?」と思った人いらっしゃると思いますが、Zip標準の暗号化方式では入力されたパスワードを色々計算して96bitに縮めて使ってるんですね。なので、なんとパスワードなんか関係ないんです。ここがまずポイントの1つ目。
ポイント2: 平文が部分的にでもわかると、その部分を暗号化する鍵の組み合わせが絞れてしまう
例えばですが、「ささ」が含まれていることがわかっていれば、それを暗号化した鍵1,2の組み合わせが絞り込めてしまいます。下記の論文中の図表は鍵の一部(key2と呼ばれている)の組合わせが、既知の平文の長さに対して候補がどんどん絞れる様子を示しています。
論文では、だいたい12、13文字程度がわかってれば十分であると述べています。
ポイント3: 鍵の一部がわかると鍵1が計算できてしまう
鍵3とか鍵4とかがわかってしまうとそこからさかのぼって鍵1が計算できてしまいます。鍵1はすべての鍵のもとになるものなのでこれを持って全ての暗号文が復号化できてしまうのでした。
ここで面白いのは、パスワードが分かるかというとまた別問題なんですよね。
既知の平文の長さごとの計算量
13文字わかっていれば2^38=2750億通りくらいということのようです。
英数大文字小文字と数字の62文字種でいうと大体6.4文字程度の強度です。あまり比較にはならないかもしれないですが、下記のような総当りの結果と合わせると数時間くらいで複合できそうです。
13文字って結構長いように思えますが、ファイルには固定のヘッダやら何やらがたくさんあるので案外長くもありません。
それでもZip使いますか?