处理衍生的过程结果

时间:2014-02-20 17:37:11

标签: python

我正在进行暴力解密练习,而且我对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返回值,以便我的python脚本不会崩溃。例如,如果第一次尝试无法解密(几乎肯定会解密),openssl会返回'bad decrypt'以及其他一些垃圾。我只是想抛弃这个尝试并转移到下一个迭代。但相反,我的程序崩溃了:

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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

根据文档:check_output

“如果返回代码非零,则会引发CalledProcessError.CalledProcessError对象将返回returncode属性中的返回代码以及输出属性中的任何输出。”

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

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