PHP AES-128-CFB解密逻辑如何使用CryptoJS在JavaScript中复现
问题原因
你的代码核心错误为未关闭CryptoJS默认的Pkcs7填充校验:
AES-128-CFB属于流加密模式,加密过程不需要追加填充,PHP端openssl_decrypt使用OPENSSL_RAW_DATA参数时默认不做填充处理,CryptoJS默认开启Pkcs7填充校验,校验失败就会返回空结果。
另外你初始化WordArray时没有显式指定字节长度,特殊场景下可能出现截断问题,建议补充长度参数。
修正后可运行代码
// 需确保已引入所有依赖:CryptoJS核心库、enc-base64、aes、mode-cfb、pad-nopadding var key = '1234567890123456'; var base64data = CryptoJS.enc.Base64.parse("1EwMDT20BELrEixvrSGswDC4GZIn5BWGor6MP6ERi9Ux"); // 提取前16字节作为IV var iv = CryptoJS.lib.WordArray.create(base64data.words.slice(0, 4), 16); // 提取16字节后的内容作为密文 var encrypted = CryptoJS.lib.WordArray.create(base64data.words.slice(4), base64data.sigBytes - 16); var decrypted = CryptoJS.AES.decrypt( { ciphertext: encrypted }, CryptoJS.enc.Utf8.parse(key), { iv: iv, mode: CryptoJS.mode.CFB, padding: CryptoJS.pad.NoPadding // 核心修正项:关闭填充校验 } ); console.log("Decrypted: " + decrypted.toString(CryptoJS.enc.Utf8));
运行上述代码将正确输出Decrypted Message,与PHP端运行结果一致。
注意事项
如果运行仍无结果,请检查是否完整引入了mode-cfb和pad-nopadding两个扩展模块,这两个模块不属于CryptoJS核心默认包,需要单独引入。
内容的提问来源于stack exchange,提问作者user2643679
相关产品推荐
相关产品推荐

