暴力破解密码

时间:2019-01-22 13:29:37

标签: python pypdf2

通过阅读此文件来创建单词字符串列表。然后循环遍历此列表中的每个单词,并将其传递给crypto()方法。如果此方法返回整数0,则密码错误,您的程序应继续使用下一个密码。如果crypto()返回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文件。知道我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

这对我来说很好:

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)

答案 1 :(得分:-1)

这是我的解决方案:

'''
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')