直接在控制台上我可以使用openssl加密和解密字符串。由于openssl需要一个输入文件,我可以告诉它从我输入的echo中使用less-than symbol(<)来获取它,如下所示:
加密:
# openssl enc -aes-256-cbc -in <(echo "helloworld") -a -k 12345678 -S 12345678 -iv 12345678
U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF/87Y=
解密:
# openssl enc -aes-256-cbc -in <(echo "U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF/87Y=") -d -a -k 12345678 -S 12345678 -iv 12345678
helloworld
使用Python我需要解密字符串“U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF / 87Y =”并打印出“helloworld”。
到目前为止,我已经尝试了这个,但我总是遇到错误:
from subprocess import Popen, PIPE
cmd = 'openssl enc -aes-256-cbc -in < (echo U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF/87Y=) ' \
'-d -a -k 12345678 -S 12345678 -iv 12345678'
x = Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = x.communicate()[0]
print output
我得到的错误是:/ bin / sh:1:语法错误:“(”意外
有没有办法达到我的需要?
答案 0 :(得分:2)
$ openssl enc --help
...
-in file Input file to read from (default stdin)
默认情况下,该命令从stdin
读取,如果您希望-in
从文件而不是管道读取,则只需要openssl
参数。即,默认情况下,这样做也会很好:
echo helloworld | openssl enc ...
# (no -in!)
Python的等价物是:
x = Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = x.communicate(input='helloworld')[0]
(同样,-in
中没有cmd
,让openssl
从stdin
读取。)
答案 1 :(得分:2)
Python默认使用/bin/sh
来执行您的命令,但sh
不支持<(...)
构造。您需要use another shell(例如bash
),而是使用Popen
的{{1}}参数:
executable
(那就是说,我会考虑使用更加pythonic的提供输入的方法来探索deceze's suggestion。)
答案 2 :(得分:-1)
您是否直接在shell中测试了该命令以查看它是否有效?
最后,似乎没有什么能阻止你分开这些电话。
您可以echo U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF/87Y
并将其传递给stdin=subprocess.PIPE
来自其他子进程,其中包含openssl命令。