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

为何CryptoJS Base64.parse不同长度文本返回同长WordArray?及Python 3DES适配

问题1:Base64解析疑问

当执行以下CryptoJS代码时,输入不同长度的Base64字符串:

CryptoJS.enc.Base64.parse('3DJ3XmbByr2y6w1113159151954972672')
CryptoJS.enc.Base64.parse('3DJ3XmbByr2y6w1113159151954972672').toString()
CryptoJS.enc.Base64.parse('3DJ3XmbByr2y6w1113159151954972672').toString(CryptoJS.enc.Base64)
CryptoJS.enc.Base64.parse('3DJ3XmbByr2y6w111315915195497267')
CryptoJS.enc.Base64.parse('3DJ3XmbByr2y6w111315915195497267').toString()
CryptoJS.enc.Base64.parse('3DJ3XmbByr2y6w111315915195497267').toString(CryptoJS.enc.Base64)

运行结果显示两者均返回24字节长度的WordArray,原因如下:

  • Base64编码的核心规则是每4个合法Base64字符对应3个字节,输入字符串长度必须是4的倍数,不足时会用=补全。
  • CryptoJS的Base64.parse()方法不会严格校验输入长度是否为4的倍数,它会按4字符为一组处理输入,超出组的部分直接丢弃。
  • 你的第一个输入是33位Base64字符串,33除以4余1,方法会自动截取前32位(4的倍数)解码,32位Base64对应32*6/8=24字节;第二个输入是32位(刚好4的倍数),解码后同样得到24字节,因此最终返回的WordArray长度一致。
问题2:Python与CryptoJS的3DES加密兼容

以下是CryptoJS的TripleDES加密实现:

function encryptByTripleDES(msg, key) {
    const keyHex = CryptoJS.enc.Base64.parse(key)
    const encrypted = CryptoJS.TripleDES.encrypt(msg, keyHex, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    })
    return encrypted.toString()
  }

输入33位Base64密钥时可正常运行,但Python代码提示密钥长度错误,原因是两者对密钥的处理逻辑不同:

  • CryptoJS的TripleDES实现会自动处理密钥长度:如果传入的密钥字节数超过24字节(3DES-EDE3的标准密钥长度),会直接截断到前24字节使用。
  • Python的DES3.new()要求密钥必须是16字节(双密钥3DES)或24字节(三密钥3DES),不允许长度不符的密钥。

要让Python代码兼容,只需对齐CryptoJS的密钥处理逻辑,修改后的代码如下:

import base64
from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad

def encrypt_by_triple_des(data: str, key: str):
    key_bytes = base64.b64decode(key)
    # 截断密钥到前24字节,对齐CryptoJS逻辑
    key_bytes = key_bytes[:24]
    msg_bytes = data.encode('utf-8')
    # 初始化ECB模式的3DES cipher
    cipher = DES3.new(key_bytes, DES3.MODE_ECB)
    # 使用Pkcs7填充,与CryptoJS保持一致
    padded_msg = pad(msg_bytes, DES3.block_size, style='pkcs7')
    encrypted_msg = cipher.encrypt(padded_msg)
    return base64.b64encode(encrypted_msg).decode('utf-8')

注意事项:

  • 确保安装了pycryptodome库(推荐),可通过pip install pycryptodome安装。
  • pad函数的style='pkcs7'参数明确指定填充方式,避免因默认值不同导致兼容问题。

内容的提问来源于stack exchange,提问作者v1nw1n

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:55:35