OpenSSL 1.0.2o与1.1.0g AES-256-CBC解密兼容命令咨询
解决OpenSSL 1.0.2o与1.1.0g之间AES-256-CBC解密的兼容性问题
这确实是OpenSSL跨版本的典型行为差异,核心问题出在命令行参数的解析逻辑变化上:
为什么原命令在两个版本表现不同?
你原命令末尾的foobar是多余参数:
- 在OpenSSL 1.0.2o中,当通过管道(
|)提供输入时,程序会自动忽略后续的文件名参数,直接使用标准输入的密文完成解密,所以命令能正常执行。 - 但从OpenSSL 1.1.0开始,
enc子命令会严格解析所有参数,把foobar当作要读取的输入文件。如果这个文件不存在、内容为空,或者和管道输入的密文冲突,就会触发bad decrypt错误。
兼容两个版本的命令行
最简单的修复方式是去掉末尾多余的foobar参数,让程序明确使用管道输入的密文:
echo s+pQpLgAQKY6z9fNtBz63A== | openssl enc -a -d -aes-256-cbc -k a -nosalt
这个命令在1.0.2o和1.1.0g中都能正常执行,解密出正确内容。
如果必须保留foobar参数(比如遗留脚本)
如果你因为脚本兼容性等原因必须保留这个参数,可以通过-in -明确指定从标准输入读取密文,这样两个版本都会忽略后续的文件名参数:
echo s+pQpLgAQKY6z9fNtBz63A== | openssl enc -a -d -aes-256-cbc -k a -nosalt -in - foobar
针对OpenSSL 1.1.0g的单独调整
如果你只需要适配1.1.0g,除了上面的兼容方案,还可以直接删除多余的foobar参数;若你本意是让foobar作为输入文件,则改用重定向方式传递输入(这样逻辑更清晰,也符合新版本的参数规范):
openssl enc -a -d -aes-256-cbc -k a -nosalt < foobar
内容的提问来源于stack exchange,提问作者pts
相关产品推荐
相关产品推荐

