You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CryptoJS与OpenSSL AES加解密无法互通问题如何解决

CryptoJS与OpenSSL AES加解密互通解决方案

核心故障原因

解密失败是两边默认的密钥派生算法参数不匹配导致的:

  • CryptoJS 4.x的AES.encrypt传入字符串密码时,默认使用OpenSSL兼容的EVP_BytesToKey派生密钥,但默认哈希算法为MD5,迭代次数固定为1
  • 新版OpenSSL默认的EVP_BytesToKey哈希算法为SHA256,两边派生得到的密钥、IV完全不一致,因此解密失败
  • 额外坑点:echo命令默认会在输出末尾追加换行符,会导致明文内容两边不一致

互通方案(默认EVP_BytesToKey模式)

1. CryptoJS加密 → OpenSSL解密

原有JS加密代码不需要修改:

// 加密代码无需调整
const ciphertext = CryptoJS.AES.encrypt("This is a message", "secret").toString();

对应OpenSSL解密命令需指定哈希算法为MD5:

echo -n "替换为CryptoJS输出的密文" | openssl enc -d -a -aes-256-cbc -k "secret" -md md5

你给出的密文用上述命令即可正常解密出This is a message

2. OpenSSL加密 → CryptoJS解密

OpenSSL加密时指定哈希算法为MD5,同时加-n参数避免追加换行:

echo -n "This is a message" | openssl enc -e -a -aes-256-cbc -k "secret" -md md5

原有CryptoJS解密代码不需要修改,直接传入OpenSSL输出的密文即可:

const plaintext = CryptoJS.AES.decrypt("替换为OpenSSL输出的密文", "secret").toString(CryptoJS.enc.Utf8);

PBKDF2模式互通方案

如果你需要使用安全性更高的PBKDF2派生,需要手动对齐两边的参数:

OpenSSL加密命令示例

echo -n "This is a message" | openssl enc -e -a -aes-256-cbc -k "secret" -pbkdf2 -iter 10000 -md sha256

对应CryptoJS解密代码(需手动派生密钥)

const ciphertext = "替换为OpenSSL输出的密文";
const password = "secret";
// 解析OpenSSL输出的密文结构提取盐
const ciphertextRaw = CryptoJS.enc.Base64.parse(ciphertext);
const salt = ciphertextRaw.clone().words.slice(2, 4); // 前8字节是Salted__标识,接下来8字节是盐
const saltWordArray = CryptoJS.lib.WordArray.create(salt);
// 按OpenSSL参数派生密钥和IV
const keyIv = CryptoJS.PBKDF2(password, saltWordArray, {
  keySize: (256 + 128)/32, // 256位密钥 + 128位IV
  iterations: 10000,
  hasher: CryptoJS.algo.SHA256
});
const key = CryptoJS.lib.WordArray.create(keyIv.words.slice(0, 8));
const iv = CryptoJS.lib.WordArray.create(keyIv.words.slice(8, 12));
// 解密密文
const encryptedData = CryptoJS.lib.WordArray.create(ciphertextRaw.words.slice(4));
const plaintext = CryptoJS.AES.decrypt(
  {ciphertext: encryptedData},
  key,
  {iv: iv}
).toString(CryptoJS.enc.Utf8);

内容的提问来源于stack exchange,提问作者Quent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:36:02