エクセルのパスワードを解析するコード
mon0.hatenablog.jp
以前の記事に書いた、エクセルのパスワードを解析するプログラムをサンプルのため掲載しておく。
- 作者: きたみあきこ
- 出版社/メーカー: 青春出版社
- 発売日: 2018/06/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
import concurrent.futures from itertools import product from string import digits import tempfile import os import sys import signal import msoffcrypto FILE_PATH = './read.xlsx' repeats = 4 chars = digits f = open(FILE_PATH, mode='rb') office_file = msoffcrypto.OfficeFile(f) def unlock(password): print(password) office_file.load_key(password=password) tf = tempfile.TemporaryFile() office_file.decrypt(tf) open('pass.txt', mode="w").write(password) # e.cancel() # os.kill(os.getpid(), signal.SIGKILL) def try_unlock_mt(): executor = concurrent.futures.ProcessPoolExecutor(max_workers=os.cpu_count()) results = [] for n in range(1, 4): for password in product(chars, repeat=n): results.append(executor.submit(unlock, "".join(password))) def main(): try_unlock_mt() if __name__ == '__main__': main()
Pythonで書いたコードだが、15分程度調べて書いた。マルチスレッド処理を初めて書いたため、途中でプロセスの止め方がわからず、終わるまでスキャンするし、大分効率も悪いかと思う。
マッチしたパスワードはファイルに書き出すため、ファイルの更新日時を見ていればパスワードが見つかったことの通知になる。
先の記事の通り前提条件を4桁の数字だけとしたので数分もあれば見つかるが、英数大文字小文字記号を足すと、指数倍的に解析時間がかかる。パスワード解析のパフォーマンスのために書いたコードであるため力技で1から9999までパスワードを開きながら試しているが、本当にパスワードを解析したいと思ったら、暗号化ファイルをGPUなりで生成し比較することで比較にならないほど早くなるだろう。
本当はそれをしたかったのだが、エクセルの暗号化仕様が見つからず、片っ端から開きながら調べようとしたのがこのコードになる。
もっと効率の良い調べ方でも、マルチプロセスコードの止め方でも教えてほしい。