在 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

相关参考:

点赞 (5)

发表回复

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

Captcha Code