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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:06:02