プログラミング

忘れてしまったエクセルの読み取りパスワードをpythonで総当たりで解除する方法

 

 

仕事で今はいない担当者が付けたパスワードがわからず困った際に作ったpythonプログラムについて公開します。

忘れてしまったエクセルパスワードを総当たりで探す

総当たりで探すのでパスワードの文字数と文字の種類によって検索時間が大きく変わります。

目安としては英文字小文字だけで4文字の前提条件の場合は約3秒ですが、

英文字小文字だけではなく大文字と数字を加えると最大数日間かかると思います。。(PCのスペックにもよります。)

実行環境

Python 3.6.2

msoffcryptonのインストールが必要なのでコマンドプロンプトで下記を実行する

pip install msoffcrypto-tool

import time
from itertools import product
import msoffcrypto

#パスワードに使用されている可能性のある文字列をすべてcharsにいれておく
chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!'
#拡張子が違う場合は.xlsx部分を変更してください
file = msoffcrypto.OfficeFile(open("AAA.xlsx", "rb"))


def check(chars, repeat):
pws = product(chars, repeat=repeat)

for pw in pws:
file.load_key(password=''.join(pw))
print(''.join(pw))
try:
#パスワード解除した状態で保存する(ファイル名)
file.decrypt(open("AAA_after.xlsx", "wb"))
print(''.join(pw))
return ''.join(pw)
except:
continue

start = time.time()
pw = check(chars, 4)
#上記はパスワード4文字を想定しているのでそれ以外の文字数の場合は数字を変更してください。
if (pw is None):
print('failure')
print(pw)
else:
print('got it! -->', pw)

finish = time.time() - start
print(finish, ' sec');

実際は会社のPCではmsoffcryptonのインストールの際にプロキシサーバーを通過できずインストールができなかったために使えなかったのですが自分のPCでは問題なく稼働しました。