为何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
相关产品推荐
相关产品推荐

