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 之间是否存在不兼容问题?
找到了解决方案,发布在这里,以防它帮助其他面临同样问题的人。
显然,在 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可以这样互换使用)
| 归档时间: |
|
| 查看次数: |
2458 次 |
| 最近记录: |