暴力破解密码

Brute force password breaker

通过阅读此文件创建一个单词字符串列表。然后遍历此列表中的每个单词,将其传递给 decrypt() 方法。如果此方法 returns 整数 0,则密码错误,您的程序应继续输入下一个密码。如果 decrypt() returns 1,那么您的程序应该跳出循环并打印破解的密码。您应该尝试每个单词的大写和小写形式。 此 dictionary.txt 文件包含大写字母的单词。

> import PyPDF2

pdfFile = open('reverse.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdfReader.numPages):
    pdfWriter.addPage(pdfReader.getPage(pageNum))
wrd = input('Please enter one word as a password: ')
pdfWriter.encrypt(wrd)
resultPdf = open('encryptedreverse.pdf', 'wb')
pdfWriter.write(resultPdf)
resultPdf.close()
print(pdfReader.isEncrypted)

helloDict = open('dictionary.txt')
helloDictCont = helloDict.read().splitlines()

liDict = []
for word in helloDictCont:
    liDict.extend(word.split())

PdfFile2 = open('encryptedreverse.pdf', 'rb')
pdfReader2 = PyPDF2.PdfFileReader(PdfFile2)
print(pdfReader2.isEncrypted)

for word in liDict:
    if pdfReader2.decrypt(word) == 1:
        break
        print(word)
    elif pdfReader2.decrypt(word.lower()) == 1:
        break
        print(word)

几分钟后处理结束,我既没有打印密码也没有解密 pdf 文件。知道我做错了什么吗?

这对我来说很好:

import PyPDF2

pdfFile = open('reverse.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdfReader.numPages):
    pdfWriter.addPage(pdfReader.getPage(pageNum))
wrd = input('Please enter one word as a password: ')
pdfWriter.encrypt(wrd)
resultPdf = open('encryptedreverse.pdf', 'wb')
pdfWriter.write(resultPdf)
resultPdf.close()
print(pdfReader.isEncrypted)

helloDict = open('t.txt')
helloDictCont = helloDict.read().splitlines()

liDict = []
for word in helloDictCont:
    liDict.extend(word.split())

PdfFile2 = open('encryptedreverse.pdf', 'rb')
pdfReader2 = PyPDF2.PdfFileReader(PdfFile2)
print(pdfReader2.isEncrypted)

for word in liDict:
    if pdfReader2.decrypt(word) == 1:
        print('The correct PWD as upper case: ' + word)
        break
    elif pdfReader2.decrypt(word.lower()) == 1:
        print('The correct PWD as lower case: ' + word)
        break
    else:
        print('PWD is not correct: ' + word)

这是我的解决方案:

'''
Brute-Force PDF Password Breaker
Say you have an encrypted PDF that you have forgotten the password to, 
but you remember it was a single English word. Trying to guess your forgot-
ten password is quite a boring task. Instead you can write a program that 
will decrypt the PDF by trying every possible English word until it finds one 
that works. This is called a brute-force password attack. Download the text file 
dictionary.txt from https://nostarch.com/automatestuff2/. This dictionary file 
contains over 44,000 English words with one word per line.
Using the file-reading skills you learned in Chapter 9, create a list of 
word strings by reading this file. Then loop over each word in this list, pass -
ing it to the decrypt() method. If this method returns the integer 0, the pass-
word was wrong and your program should continue to the next password. 
If decrypt() returns 1, then your program should break out of the loop and 
print the hacked password. You should try both the uppercase and lower-
case form of each word. (On my laptop, going through all 88,000 uppercase 
and lowercase words from the dictionary file takes a couple of minutes. This 
is why you shouldn’t use a simple English word for your passwords.)
'''
import PyPDF2
import time
import os
import sys


def decrypt():
    ok = False
    print(f'Working... {time.asctime()}')
    start = time.time()
    passwords = open(dictionary).read().split('\n')
    pdfReader = PyPDF2.PdfFileReader(pdf)
    if pdfReader.isEncrypted:
        for password in passwords:
            if pdfReader.decrypt(password) or pdfReader.decrypt(password.lower()):
                print(f'Password: {password}')
                ok = True
                break
        end = time.time()
        hours = int((end - start) / 3600)
        minutes = int((end - start) / 60)
        secondes = int(end - start - (hours * 3600) - (minutes * 60))
        if ok:
            print(f'Has been decrypted in {hours}H:{minutes}M:{secondes}S!')
        else:
            print(f'{pdf} hasn\'t been decrypted... Maybe need a better dictionary?')
    else:
        print(f'{pdf} isn\'t encrypted')


if len(sys.argv) == 3:    
    dictionary, pdf = sys.argv[1], sys.argv[2]
    if os.path.isfile(dictionary) and dictionary.endswith('.txt'):
        if os.path.isfile(pdf) and pdf.endswith('.pdf'):
            decrypt()
        else:
            print('Invalid path to pdf or pdf file')
    else:
        print('Invalid path to dictionary or dictionary file')
else:
    print('Please enter arguments as example:\
        \ndictionaryName.txt pdfName.pdf')