Crypto-JS解密Cryptopals第7题AES-ECB密文报Malformed UTF-8 data错误
问题根因
CryptoJS 的 AES.decrypt 接口存在一个容易踩的设计坑:当你传入字符串类型作为第二个密钥参数时,CryptoJS 不会把这个字符串直接当作 AES 运算的原始密钥,而是会将其视为密码,默认走 OpenSSL 兼容的密钥派生流程生成实际运算用的密钥,和你当前场景下直接使用固定 16 字节密钥的需求完全不匹配,才会导致解密结果是乱码,转 UTF8 时抛出格式错误。
修复方案
你需要做两处调整即可:
- 先将密钥字符串显式转换为 CryptoJS 内部的
WordArray类型,告诉库这就是直接用于运算的原始密钥,不需要做派生 - 显式指定填充规则为 PKCS7 和加密侧对齐,ECB 模式不需要配置 IV
正确代码示例
// 1. 处理密钥:转成WordArray,不要直接传原始字符串 const key = CryptoJS.enc.Utf8.parse('YELLOW SUBMARINE'); // 2. base64格式的密文可以直接传入 const decrypted = CryptoJS.AES.decrypt(message, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); // 此时转UTF8就不会报错了 return decrypted.toString(CryptoJS.enc.Utf8);
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

