使用CryptoJS的TripleDES解密返回空字符串问题求助
问题排查与修复方案
核心问题分析
你的解密代码存在三个关键错误,导致解密结果为空:
1. 密钥生成逻辑错误
你当前通过CryptoJS.MD5(SharedKey).toString()生成密钥,但实际加密使用的共享密钥是16进制字符串36fd14ddcd755bb37879cbe99ca26c92,并非ClientSecret和ApiKey拼接后的MD5值。此外,直接用字符串作为密钥时,CryptoJS会默认以UTF-8编码解析,而16进制密钥需要用Hex编码解析为字节数组。
2. 未匹配加密模式与IV
在线工具默认使用CBC模式,且未手动设置IV时,会采用全8字节0的IV(TripleDES块大小为8字节)。你的代码未指定模式和IV,CryptoJS默认使用ECB模式,与加密时的模式不匹配,直接导致解密失败。
3. 密钥格式处理错误
解密时密钥需要转换为WordArray类型,而非字符串,否则会引发密钥解析异常,无法正确解密。
修复后的代码
export const decryptData = () => { // 加密时使用的16进制共享密钥 const sharedKeyHex = '36fd14ddcd755bb37879cbe99ca26c92'; const encryptedData = 'NbU4PoYHR9IJtSLmHRubpg=='; // 将16进制密钥解析为WordArray const key = CryptoJS.enc.Hex.parse(sharedKeyHex); // 在线工具默认使用的全0IV(8字节,对应16个16进制字符) const iv = CryptoJS.enc.Hex.parse('0000000000000000'); const decrypted = CryptoJS.TripleDES.decrypt( encryptedData, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); // 转换为UTF-8明文输出 console.log('decrypt', decrypted.toString(CryptoJS.enc.Utf8)); };
额外验证说明
- 如果你生成加密串时手动设置了IV,需要将代码中的
iv替换为当时使用的16进制IV值(必须是8字节,即16个16进制字符)。 - 若加密时使用了非PKCS7的填充方式,需同步修改
padding参数为对应值(如CryptoJS.pad.ZeroPadding)。
内容的提问来源于stack exchange,提问作者Jc John
相关产品推荐
相关产品推荐

