python - 数字信封例程:EVP_DecryptFinal_ex:bad decrypt
问题描述
我正在尝试制作一个运行 OpenSSL 命令来加密和解密文件的 Python 程序。
在我制作的命令行中:
vagrant@vagrant:~$ openssl enc -aes256 -base64 -k $(base64 alice_shared_secret.bin) -e -in plain.txt -out cipher.txt
vagrant@vagrant:~$ openssl enc -aes256 -base64 -k $(base64 bob_shared_secret.bin) -d -in cipher.txt -out plain_again.txt
它有效。但是,如果我用我的 Python 程序加密文本,我就无法解密。
vagrant@vagrant:~$ openssl enc -aes256 -base64 -k $(base64 bob_shared_secret.bin) -d -in cipher.txt -out plain_again.txt
bad decrypt
140321401345688:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:529:
我的程序和命令行的密码有什么区别?
代码:
#!/System/Library/Frameworks/Python.framework/Versions/2.6/bin/python
openssl = '/usr/bin/openssl'
from subprocess import Popen, PIPE, STDOUT
def encrypt():
arguments = [
openssl,
'enc',
'-aes256',
'-base64',
'-k',
'$(base64 alice_shared_secret.bin)',
'-e',
'-in',
'plain.txt',
'-out',
'cipher.txt',
]
execute = Popen(arguments, stdout=PIPE)
out, err = execute.communicate()
encrypt()
有什么帮助吗?
解决方案
AFAIK,您不能使用 Popen 参数(您的“$(...)”表达式)中的 shell 字符串插值。尝试直接对 base64 数据进行编码,它会正常工作:
import base64
with open('secret.bin') as x: secret = x.read()
def encrypt():
arguments = [
openssl,
'enc',
'-aes256',
'-base64',
'-k',
base64.b64encode(secret),
'-e',
'-in',
'plain.txt',
'-out',
'cipher.txt',
]
推荐阅读
- unit-testing - Angular 6 - Jasmine - 模拟 httpClient 获取地图和错误流
- javascript - 如何在对象中分配对象
- ruby - 默认使用空数组初始化 Ruby 哈希
- javascript - 如何获得纯色背景色和半透明叠加色的有效结果(6位十六进制值)?
- javascript - 一个函数在它应该执行之前执行
- javascript - 在 hooks.js 文件中添加 BeforeScenario 时,Selenium-cucumber.js 测试无法运行
- python - Python:使用熊猫匹配替换部分文件路径
- android - imageView 导致父布局在约束布局中收缩
- javascript - 您可以在引导模式上使用“x”(关闭)按钮来调用 javascript 函数而不是关闭模式吗?
- r - R Shiny - 我真的需要所有这些 REACTIVE 功能吗?