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

AES-256-CBC加密:cryptoBrowserify与PyCrypto输出长度不一致问题排查

问题原因及修复方案

你的Python实现多做了一步填充(padding),导致密文长度变长,和TS端结果不一致,具体原因和修复如下:

核心差异点

  1. TS端逻辑:
    你的TS代码里,输入的data是32字节,刚好是AES-256-CBC块大小(16字节)的2倍。cryptoBrowserify.createCipheriv在使用CBC模式时,如果输入数据长度刚好是块大小的整数倍,且只调用cipher.update(data)而不调用cipher.final(),会直接加密原始数据,不会添加额外的PKCS7填充。最终得到的密文长度和原始数据一致(32字节)。

  2. Python端问题:
    你调用了pad(buf, 16),PKCS7填充规则会在数据长度是块大小整数倍时,额外添加一个完整的16字节填充块(每个字节值为0x10),导致原始32字节数据变成48字节,加密后密文自然也是48字节,和TS端结果不符。

修复后的Python代码

直接去掉填充步骤,因为输入数据已经满足块大小要求:

from Crypto.Cipher import AES

ZERO_IV = bytes([0] * 16)
def encrypt_buffer(key, buf):
    cipher = AES.new(key, AES.MODE_CBC, ZERO_IV)
    # 输入buf是32字节,刚好是16字节的整数倍,无需填充
    encrypted_buf = cipher.encrypt(buf)
    return encrypted_buf

这样修改后,加密后的密文长度就会和TS端一致,都是32字节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:57:15