LibreSSL aes 加密与 OpenSSL 不兼容?

Roc*_*uts 5 encryption openssl aes

机器 A 有 OpenSSL 1.0.2k,我加密了一个虚拟文件,如下所示:

openssl enc -aes-256-cbc -salt -in plain.txt -e -pass pass:abcd1234 -out cipher.enc
Run Code Online (Sandbox Code Playgroud)

机器 B 具有 LibreSSL 3.3.3,当我从机器 A 解密文件时,如下所示:

openssl enc -aes-256-cbc -in cipher.enc -d -pass pass:abcd1234 -out plain.txt
Run Code Online (Sandbox Code Playgroud)

解密失败,出现以下错误:

解密错误
4444794304:错误:06FFF064:数字信封例程:CRYPTO_internal:解密错误:evp/evp_enc.c:549:

请注意,如果我尝试在机器 A 上使用相同的命令行对其进行解密,它工作正常。

我不知道 OpenSSL 1.0.2k 有多过时,但不幸的是我无法控制升级它(它是远程第 3 方服务器)。

使用 AES 加密时,OpenSSL 和 LibreSSL 之间是否存在不兼容问题?

Roc*_*uts 7

找到了解决方案,发布在这里,以防它帮助其他面临同样问题的人。

显然,在 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
Run Code Online (Sandbox Code Playgroud)

在机器B上解密:

libressl enc -aes-256-cbc -in cipher.enc -d -pass pass:abcd1234 -md sha256 -out plain.txt
Run Code Online (Sandbox Code Playgroud)

现在效果很好。

[编辑] - 如果默认的密钥派生参数将来可能会发生变化,或者旧的隐式默认值在某些时候被认为是不够的,也许最好也明确定义这些参数。例如通过包含-pbkdf2 -iter 100000.
那么接下来就变成了:

openssl enc -aes-256-cbc -salt -in plain.txt -e -pass pass:abcd1234 -md sha256 -pbkdf2 -iter 100000 -out cipher.enc
Run Code Online (Sandbox Code Playgroud)

加密和解密:

libressl enc -aes-256-cbc -in cipher.enc -d -pass pass:abcd1234 -md sha256 -pbkdf2 -iter 100000 -out plain.txt
Run Code Online (Sandbox Code Playgroud)

(openssl和libressl可以这样互换使用)