2017-02-07 2 views
-1

Для выполнения задания, которое я сейчас делаю, я должен взломать заблокированный файл PDF. У меня есть цикл while, который создает потенциальные пароли, один из которых взломает файл PDF. У меня также есть программа, которая разбивает файлы PDF с помощью словарного списка. Код для обеих программ заключается в следующем:Cracking PDF File, Python 2.7

While Loop:

from random import shuffle 
with open('randomwords.txt', 'r') as data: 
    data = data.read().split() 
    while(True): 
     shuffle(data) 
     password = '' 
     for x in data[:3]: 
      password += x 
     print password.replace('o', '0') 

PDF Cracker:

import PyPDF2 
import sys 
import optparse 

parser = optparse.OptionParser() 
parser.add_option('-f', '--file', dest='file', help='encrypted file') 
parser.add_option('-w', '--wordlist', dest='word', help='wordlist file') 
(options, args) = parser.parse_args() 
if options.file == None or options.word == None: 
    print('') 
    sys.exit() 

file = options.file 
word = options.word 
wordlist = open(word) 

pdf = PyPDF2.PdfFileReader(open(file,'rb')) 
if not pdf.isEncrypted: 
    print('This PDF has no password') 
else: 
    for line in wordlist.readlines(): 
     if pdf.decrypt(line.rstrip()): 
      print('[+] Password: ' +line) 
      sys.exit() 
     print('[-] Password not found') 

Для того, чтобы завершить это задание, я взломать PDF-файл, является его возможно объединить эти две программы, поэтому я могу использовать цикл, чтобы взломать файл, а не использовать список слов.

Это немного выше моего нынешнего уровня мастерства с помощью Python, которые боролись с этой проблемой в течение нескольких дней.

ответ

1

1) Если вы хотите, чтобы программа завершилась, нам нужно избавиться от бесконечного цикла while.

Мы можем использовать itertools.permutations, чтобы получить все перестановки в выборе слова из списка слов.

Например

wordlist = ['dog', 'cat', 'bat'] 
for p in itertools.permutations(wordlist, 2): 
    print p 

выведет

('dog', 'cat') 
('dog', 'bat') 
('cat', 'dog') 
('cat', 'bat') 
('bat', 'dog') 
('bat', 'cat') 

Так вместо

while(True): 
     shuffle(data) 
     password = '' 
     for x in data[:3]: 
      password += x 
     password.replace('o', '0') 

мы итерацию по всем перестановкам

for perm in itertools.permutations(data, 3): 
    password = "".join(perm) 
    password.replace('o', '0') 
    if pdf.decrypt(password): 
     print('[+] Password: ' +line) 
     sys.exit() 
    print('[-] Password not found') 

Тогда вместо того, чтобы пытаться расшифровать внутри этого цикла for line in wordlist.readlines(): вы пытаетесь расшифровать внутри for perm in itertools.permutations(data, 3):

+0

Я хотел бы программу, чтобы попробовать каждый пароль цикл, пока генерирует до тех пор, пока не найдет правильный пароль, а затем прекратить. Я не полностью понимаю itertools.permutations. Делает то, что вы написали, позволяет моему коду работать так, как мне хотелось бы? Или есть еще немного? – Quarismo

+0

Я обновил свой ответ на примере itertools.permutations и добавил, как будет выглядеть цикл. Скажите, если использование таких перестановок не так, как вы планировали. – avodo