机器 A 有 OpenSSL 1.0.2k,我加密了一个虚拟文件,如下所示:
openssl enc -aes-256-cbc -salt -in plain.txt -e -pass pass:abcd1234 -out cipher.enc
机器 B 有 LibreSSL 3.3.3,当我从机器 A 解密文件时,如下所示:
openssl enc -aes-256-cbc -in cipher.enc -d -pass pass:abcd1234 -out plain.txt
解密失败,出现以下错误:
错误解密
4444794304:错误:06FFF064:数字信封例程:CRYPTO_internal:错误解密:evp/evp_enc.c:549:
请注意,如果我尝试在机器 A 上使用相同的命令行对其进行解密,则可以正常工作。
我不知道 OpenSSL 1.0.2k 有多过时,但不幸的是我无法控制升级它(它是一个远程第三方服务器)。
使用 AES 加密时 OpenSSL 和 LibreSSL 之间是否存在不兼容?
答案1
找到了解决方案,发布在这里,希望它能帮助其他遇到同样问题的人。
显然,在 OpenSSL 的更高版本(后来的 LibreSSL)中,密钥派生的默认哈希算法从 md5 更改为 sha256。
更多详情请点击这里: https://github.com/libressl-portable/portable/issues/378
因此,现在我在两个命令行中明确指定哈希算法。要在机器 A 上加密:
openssl enc -aes-256-cbc -salt -in plain.txt -e -pass pass:abcd1234 -md sha256 -out cipher.enc
在机器B上解密:
libressl enc -aes-256-cbc -in cipher.enc -d -pass pass:abcd1234 -md sha256 -out plain.txt
现在它运行良好。
[编辑]——如果默认密钥派生参数将来可能会发生变化,或者旧的隐式默认值在某些时候被认为不够用,也许最好也明确定义它们。例如,通过包括-pbkdf2 -iter 100000
。
这样就变成了:
openssl enc -aes-256-cbc -salt -in plain.txt -e -pass pass:abcd1234 -md sha256 -pbkdf2 -iter 100000 -out cipher.enc
加密和解密:
libressl enc -aes-256-cbc -in cipher.enc -d -pass pass:abcd1234 -md sha256 -pbkdf2 -iter 100000 -out plain.txt
(openssl和libressl可以这样互换使用)