2014-02-20 4 views
0

Я выполняю упражнение дешифровки грубой силы, и я относительно новичок в Python. Мой код работает отлично, когда я делаю этот вызов openSSL-дешифрования в тестовый файл, когда знаю ключ. Однако упражнение, которое я выполняю, требует от меня повторения всех возможных значений ключа, отправляя вызов openSSL с каждым возможным значением.Обработка порожденных результатов процесса

for x in range(0,10): 
    for y in range(0,10): 
     key = "pass:" + str(x) + str(y) 
     plaintext = subprocess.check_output(['openssl', 'aes-128-cbc', '-d', '-in', 'ciphertext', '-base64', '-pass', key]) 
     print (plaintext) 

Зная, что все, но один из моих попыток не сможет расшифровать, я борюсь с обработкой возврата значения OpenSSL таким образом, что мой питон скрипт не будет врезаться. Например, если первая попытка не может дешифровать (что почти наверняка будет), openssl возвращает «плохой расшифровать» вместе с некоторым другим нежелательным файлом. Я просто хочу отбросить эту попытку и перейти к следующей итерации. Но вместо этого, моя программа выходит из строя, как это:

bad decrypt 
140735254008672:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539: 
Traceback (most recent call last): 
    File "/Users/.../Project.py", line 20, in <module> 
    plaintext = subprocess.check_output(['openssl', 'aes-128-cbc', '-d', '-in', CIPHERTEXT_FILE, '-base64', '-pass', key]) 
    File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/subprocess.py", line 589, in check_output 
    raise CalledProcessError(retcode, process.args, output=output) 
subprocess.CalledProcessError: Command '['openssl', 'aes-128-cbc', '-d', '-in', 'proj0.enc', '-base64', '-pass', 'pass:xx']' returned non-zero exit status 1 

Я даже не могу проверить строку bad decrypt, так как программа уже разбился.

Может кто-нибудь мне помочь. Я довольно новичок в Python, поэтому я вращаю свои колеса. Благодаря!

ответ

2

Использование try/except

for x in range(0,10): 
    for y in range(0,10): 
     key = "pass:" + str(x) + str(y) 
     try: 
      plaintext = subprocess.check_output(['openssl', 'aes-128-cbc', '-d', '-in', 'ciphertext', '-base64', '-pass', key]) 
     except subprocess.CalledProcessError as e: 
      print("{key} failed".format(key=key)) 
     else: 
      print (plaintext) 
+0

Спасибо. Я получаю тот же результат, плюс еще одна новая ошибка: «Во время обработки вышеупомянутого исключения произошло другое исключение: Traceback (последний последний звонок): Файл«/Пользователи/randy/Development/ADT_Workspace/NetworkSecurityProject00/Project0/Project0.py ", строка 24, в print (" {key} failed ".format (key)) KeyError: 'key'' – Alex

+0

@ usr55410, потому что я что-то пропустил. do 'print (" {key} failed ".format (key = key))'. Клавиша «ключ = ключ» является ключом! ;) –

+0

Он работает! Огромное спасибо. Я соглашусь, как только SO позволит мне это сделать. – Alex

0

Согласно Документах. check_output

«Если код возврата был отличен от нуля, возникает CalledProcessError объект CalledProcessError будет иметь код возврата в атрибуте код возврата и любой выход в атрибуте вывода. "

Таким образом, вы можете использовать try/catch и изучить атрибут output объекта исключения.

В качестве альтернативы вы можете использовать subprocess.Popen() с помощью stdout = PIPE и .communicate(), чтобы получить выход независимо от возвращаемого значения. Затем вы можете самостоятельно искать результат для ожидаемых строк.

Смежные вопросы