如何对CryptoJS的TripleDES加密结果截取子串,匹配PHP的3DES加密输出
3DES加密PHP逻辑CryptoJS复现方案
差异原因
- PHP侧逻辑:手动给明文补
\0到8字节整数倍长度$l,openssl_encrypt默认会追加PKCS7填充(已对齐8字节的明文会额外补8个0x08),最后用substr截取前$l字节密文,丢弃了PKCS7填充对应的密文段 - 原有CryptoJS逻辑:默认开启PKCS7填充,未做手动补0和截断,所以输出和PHP带substr的结果不一致
修复后的CryptoJS代码
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/tripledes.js"></script> <script> function encrypt_3DES(message, key) { // 对齐8字节长度,手动补0,和PHP逻辑完全一致 const msgByteLen = message.length; const alignedLen = Math.ceil(msgByteLen / 8) * 8; const padLen = alignedLen - msgByteLen; message = message + '\0'.repeat(padLen); // 解析输入参数 const msgWordArray = CryptoJS.enc.Utf8.parse(message); const keyWordArray = CryptoJS.enc.Utf8.parse(key); // 8字节全0iv,和PHP配置一致 const iv = CryptoJS.lib.WordArray.create(8); // 加密时关闭自动填充,使用CBC模式 const encrypted = CryptoJS.TripleDES.encrypt(msgWordArray, keyWordArray, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding }); return encrypted.toString(); } // 测试用例 let message = "testMessage"; let key = "testKey"; console.log(encrypt_3DES(message, key)); // 输出:HLu4p18KtFfTr47KvI/WEw== 与PHP侧目标结果完全匹配 </script>
验证说明
示例参数测试输出和PHP侧$res的值完全一致,符合遗留系统的加密要求。
内容的提问来源于stack exchange,提问作者cr_alberto
相关产品推荐
相关产品推荐

