Zipファイルのクラック

メールでZipファイルを送って次のメールでパスワードを送るという無意味より悪いセキュリティ対策が問題になっている。なぜ無意味より悪いかというと,Zip暗号化は強度が十分でない上に,次のメールで送るパスワードは無意味で,さらにゲートウェイでのウイルス対策ができなくなるのでウイルス送付に利用されやすいためである。

PythonでZipファイルを展開する方法は文字コードのところに書いたが,同様にしてパスワードをブルートフォースで破ることも原理的には可能である。6桁数字のパスワードで暗号化した test.zip をクラックするには次のようにすればよいであろう:

from zipfile import ZipFile

with ZipFile('test.zip') as z:
    for i in range(1000000):
        pw = f'{i:06d}'
        try:
            z.setpassword(pw.encode('utf-8'))
            if z.testzip() is None:
                print(pw)
                break
        except:
            pass

試しに「ほげほげふがふが」とだけ書いたテキストファイルを 999999 というパスワードで Zip 化し,iPython の %%time で実行時間を測ったところ,M1 Mac mini (2020) では 17.7 秒でクラック成功した。

解読時間はファイルサイズにもよる。実際に某所から送られてきた現実的な暗号化Zipファイル(66kB)で同じことを行ったところ、2分45秒かかった。ただし数字6桁ではなかったので成功しなかった。64通りの文字×8桁のパスワードであれば1000年以上かかりそうである。

本当にパスワードをクラックしたいなら,より高速かつ便利な専用のツールがいろいろ出回っているので,ネットで検索されたい。

一般的な暗号の解読時間については例えば dit の セキュリティ調査レポートVol.3(2012年)に実測値が載っている。例えば英大小数字(62通り)×8文字では通常のZip暗号化は13.5時間で解読できるとのことである。同じZipでも拡張仕様の256ビットAESならずっと時間がかかるが,Windowsの機能だけでは復号できないのであまり使われていない。Microsoft Officeファイル(*.docx,*.xlsx など)の暗号化は,さらに強い。

GPUでZIPパスワードを解析するも参考になる。


Last modified: