ゴミ箱の中のメモ帳

まだ見ぬ息子たちへ綴る手記

Zipのパスワードを解析するコード

mon0.hatenablog.jp

先にExcelのパスワードを解析するコードをのサンプルを書いた。
だがあまりにも遅いので、例えばZipのパスワードを解析するコードならどうだろうと試してみると、やはり速度が全然違う。例えば、先のExcelでは数字4桁のパスワードでも結構時間がかかったが、Zipであれば数字4桁なら数秒で終わるかと思う。

ZIP圧縮・解凍パスワード

ZIP圧縮・解凍パスワード



これは、Excelのパスワードを開くパッケージが遅いのか、Excelの仕様でパスワードの解析が遅いのか、私のコードが遅いのかはわからない。

サンプルで書いたシングルスレッドのコードでも、英数字大文字小文字4桁のアタックで、"ZZZZ"が5年落ちのCore i3 PCで10分もかからず解けた。アッパーケースは2段めに持ってきているので最後までスキャンしたわけではないが、それでも4桁のパスワードが全く役に立たないことはわかるだろう。
これを先のExcelのコードのように4スレッドで動かしたら単純に4倍で終わる。そもそも、Zipパスワードの解析プログラムはGPUを使ったものも公開されており、8桁程度なら、一般のゲーム用PCなら現実的な速さで解析を行える。

それが高度な専門家が作ったプログラムだと思うかもしれないが、このような数行のPythonプログラムでも、調べたら10分程度でかけるコードでも解析できることを知っていればその危険性をわかってもらえるかと思う。

import sys
from itertools import product
from string import digits, ascii_uppercase, ascii_lowercase
import zipfile

FILE_PATH = "./read.zip"

repeats = 4
chars = digits + ascii_uppercase + ascii_lowercase
#chars = digits

f = zipfile.ZipFile(FILE_PATH, 'r')


def unlock(password):
    try:
        f.extractall('./tmp/', pwd=password.encode())
        print(password)
        sys.exit()
    except:
        pass


def main():
    for n in range(1, 5):
        for password in product(chars, repeat=n):
            unlock("".join(password))


if __name__ == "__main__":
    main()