AES-256-CBC加密:cryptoBrowserify与PyCrypto输出长度不一致问题排查
问题原因及修复方案
你的Python实现多做了一步填充(padding),导致密文长度变长,和TS端结果不一致,具体原因和修复如下:
核心差异点
TS端逻辑:
你的TS代码里,输入的data是32字节,刚好是AES-256-CBC块大小(16字节)的2倍。cryptoBrowserify.createCipheriv在使用CBC模式时,如果输入数据长度刚好是块大小的整数倍,且只调用cipher.update(data)而不调用cipher.final(),会直接加密原始数据,不会添加额外的PKCS7填充。最终得到的密文长度和原始数据一致(32字节)。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
相关产品推荐
相关产品推荐

