2020年3月6日金曜日

開発環境

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング (Al Sweigart(著)、相川 愛三(翻訳)、オライリージャパン)の第Ⅱ部(処理の自動化)、13章(PDFファイルとWordファイル文書)、13.6(演習プロジェクト)、13.6.3(総当たり方式のPDFパスワード解除)の解答を求めてみる。

コード

#!/usr/bin/env python3
import random
import PyPDF2

filename = 'dictionary.txt'
with open(filename) as f:
    password = random.choice([line.strip() for line in f])
print(password)
writer = PyPDF2.PdfFileWriter()
writer.encrypt(password)

filename_pdf = 'encrypted.pdf'
with open(filename_pdf, 'wb') as f:
    writer.write(f)

with open(filename) as in_file1, \
        open(filename_pdf, 'rb') as in_file2:
    reader = PyPDF2.PdfFileReader(in_file2)
    for line in in_file1:
        password = line.strip()
        if reader.decrypt(password) == 1 or \
                reader.decrypt(password.lower()) == 1:
            print(f'{filename_pdf}のパスワードは「{password}」。')
            break
    else:
        print('パスワードは見つからず。。')

入出力結果(Zsh、PowerShell、Terminal、Jupyter(IPython))

% time ./sample3.py 
BLACKSTONE
encrypted.pdfのパスワードは「BLACKSTONE」。
./sample3.py  127.67s user 0.93s system 93% cpu 2:17.61 total
% time ./sample3.py
VIEWING
encrypted.pdfのパスワードは「VIEWING」。
./sample3.py  1074.55s user 5.31s system 96% cpu 18:42.01 total
% 

0 コメント:

コメントを投稿