Zipのパスワードを解析するコード
先にExcelのパスワードを解析するコードをのサンプルを書いた。
だがあまりにも遅いので、例えばZipのパスワードを解析するコードならどうだろうと試してみると、やはり速度が全然違う。例えば、先のExcelでは数字4桁のパスワードでも結構時間がかかったが、Zipであれば数字4桁なら数秒で終わるかと思う。
- 出版社/メーカー: デネット
- 発売日: 2014/12/12
- メディア: CD-ROM
- この商品を含むブログを見る
これは、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()