在 windows 上使用 OpenSSL AES 加密的文件在 linux 中解密失败

如题,在 windows 上测试正常的 AES 加密脚本,放到构建平台(linux docker)上执行后产出的内容,无法被客户端解密。错误提示大致如下:

bad decrypt
232864:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto\evp\evp_enc.c:541:

在经过反复对比测试后发现,在 windows 上加密的内容可以自行解密,但放到 linux docker 中则解密失败;反之亦然,在 linux 上加密的内容可以自行解密,放到 windows 上则解密失败。

由于执行的是由 nodejs 编写的同一脚本,唯一不同的就是调用了 OpenSSL(其版本不同),那么应该是 OpenSSL 的差异导致的。可是为什么会有这种差异?

经过反复搜索查阅,在该文章【OpenSSL AES 算法中 Key 和 IV 是如何生成的?】中介绍了 OpenSSL AES-256-CBC 算法生成 KEY 与 IV 的具体逻辑,其中指出了 OpenSSL 1.1.0 版本前后使用的默认 digest 摘要算法改变了:1.1.0 版本之前默认使用 md5,而之后使用 sha256。

在结合官方仓库的提交验证后,前面遇到的问题原因就很明显了。解决方法则是明确指定要使用的消息摘要类型,即增加 -md 参数指定 hash 函数类型即可。示例如下:

# 将 app.asar 加密为 app.enc
openssl enc -e -md sha256 -aes-256-cbc -salt -in app.asar -out app.enc -pass pass:123456789 -p

# 将 app.enc 加密为 app.asar
openssl enc -d -md sha256 -aes-256-cbc -salt -in app.enc -out app.asar -pass pass:123456789 -p

相关参考:

点赞 (2)

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

169 911 841 631 340 674 037 474 265 568 184 657 152 534 373 353 917 402 174 145 003 686 805 837 313 714 160 551 669 758 881 663 660 448 920 544 445 015 742 821 172 887 264 128