我正在进行暴力解密练习,而且我对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很陌生,所以我正在转动我的车轮。谢谢!
答案 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()来获取输出,而不管返回值如何。然后,您可以自己搜索输出中的预期字符串。