ミニプログラム

PDFのパスワード解除プログラム

PDFのパスワード解除

36文字の英数字の組み合わせを総当たりで試して、PDFのパスワードを解除することを試みるプログラムです。

今回のライブラリ・コードでは、3桁で10分前後、4桁で6時間前後かかるものと思われます。

ソースコード

import PyPDF2
import itertools
import sys

pdf_file = open("test_encrypted.pdf", 'rb')
pdf_object = PyPDF2.PdfFileReader(pdf_file)
alphanumeric = "abcdefghijklmnopqrstuvwxyz0123456789"
for pw in itertools.product(alphanumeric, repeat=3):
    pw = ''.join(pw)
    print(pw)
    if pdf_object.decrypt(pw) == 1:
        print('パスワードは「{}」です'.format(pw))
        sys.exit(0)
print("パスワードが見つかりませんでした。")

コードの解説

ライブラリのインポート

まず1~3行目でライブラリをインポートします。 標準ライブラリであるループ処理のためのitertoolsとプログラムの終了に使うsysのほかに、PDFを取り扱う外部ライブラリPyPDF2を使用します。PyPDF2は最も一般的なライブラリですが、より高速に処理を実行したい場合や、パスワードの暗号化方式が対応していない場合などは他のライブラリも検討してみてください。

pip install pypdf2

パスワードの解除

次に5行目でファイルを開き、6行目でそのファイルをPDFファイルとしてPyPDF2を使って読み込みます。

7行目では総当たりとして組み合わせを試したい36文字「abcdefghijklmnopqrstuvwxyz0123456789」を変数に代入します。

8行目以降でitertools.productとfor文により、36文字の一つ一つのすべての組み合わせに対しそれぞれパスワードとして確認していきます。itertools.productの引数repeatは桁数で、今回のコードでは3桁になっています。

ループ内の変数pwは[a, 4, y, 2]のようなイテレータになっているので、 9行目でjoin()により文字列に変換しています。

10行目で試すパスワードをprint文により出力、

11行目でPyPDF2の関数decrypt()により解除を試みて、1が出力された場合、つまり成功した場合はprint文によりパスワードを改めて出力してプログラムを終了させます。

なお、バージョン1.26現在、PyPDF2では暗号化アルゴリズムとしてRC4しか対応していません。最近のPDF暗号化ソフトはAESが主流のようなので、本コードを試す場合は同じくPyPDF2を使って暗号化したものを復号すると問題なく動作するでしょう。

最後の14行目、つまり「aaa」から「999」まですべての組み合わせを試しても成功しなかった場合は、print文により「パスワードが見つかりませんでした。」と出力して終了です。

タイトルとURLをコピーしました