ゴミ箱の中のメモ帳

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

エクセルのパスワードを解析するコード

mon0.hatenablog.jp
以前の記事に書いた、エクセルのパスワードを解析するプログラムをサンプルのため掲載しておく。

社会人として最低限知っておきたいエクセル技これだけ!

社会人として最低限知っておきたいエクセル技これだけ!

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なりで生成し比較することで比較にならないほど早くなるだろう。

本当はそれをしたかったのだが、エクセルの暗号化仕様が見つからず、片っ端から開きながら調べようとしたのがこのコードになる。
もっと効率の良い調べ方でも、マルチプロセスコードの止め方でも教えてほしい。