2014-02-20 146 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) 

知道,我尝试所有,但一个将无法解密,我在我的Python脚本不会崩溃的方式处理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

谢谢。我得到完全相同的结果,再加上另一个新错误:'在处理上述异常期间,发生了另一个异常: 回溯(最近调用最后一次): 文件“/ Users/randy/Development/ADT_Workspace/NetworkSecurityProject00/Project0/Project0.py“,第24行,在 print(”{key} failed“.format(key)) KeyError:'key'' – Alex

+0

@ usr55410哎呀,这是因为我错过了什么。做'print(“{key}失败”.format(key = key))'。 'key = key'是关键! ;) –

+0

它正在运行!非常感谢。只要SO允许,我会尽快接受。 – Alex

0

按照文档:check_output

“如果返回代码为非零它提出了一个CalledProcessError的CalledProcessError对象将在返回码属性的返回码和输出属性中的任何输出“。

因此,您可以使用try/catch并检查异常对象的输出属性。

或者,您可以使用subprocess.Popen()与stdout = PIPE和.communicate()来获取输出,而不管返回值如何。然后您可以自己搜索输出以获得预期的字符串。