ValueError: Data must be padded to 16 byte boundary in CBC mode

ValueError: Data must be padded to 16 byte boundary in CBC mode

raise ValueError(“Data must be padded to %d byte boundary in CBC mode” % self.block_size)

最近有在用AES-128解码文件的时候,出现了这个报错,当时很苦恼,这是怎么回事?其实很简单,就是我解码的内容不是16的倍数,我就不放代码了。请自己用len()函数检查

### AES-CBC 模式下解密时出现 `ValueError` 的原因 在使用 AES-CBC 模式进行加密和解密操作时,如果数据未按照规定的方式填充至 16 字节边界,则会出现 `ValueError: Data must be padded to 16 byte boundary in CBC mode` 错误。这是因为 AES 是一种分组密码算法,在 CBC(Cipher Block Chaining)模式下要求输入的数据长度必须是块大小(通常为 16 字节)的整数倍[^1]。 当数据长度不足时,需要通过特定的填充方法将其扩展到满足条件的长度。常见的填充方式有 PKCS#7 和 ISO/IEC 7816-4 等标准定义的方法。这些方法会在最后一个数据块中补充额外的字节来达到所需的长度,并记录实际填充的数量以便后续移除多余部分[^2]。 #### 解决方案 为了处理上述问题并实现正确的加解密流程,可以采用如下措施: 1. **引入填充函数** 使用 PyCryptodome 提供的功能完成自动化的填充工作。例如导入 `Crypto.Util.Padding` 中的 `pad()` 方法用于加密前调整明文尺寸;同样存在对应的去垫片功能 `unpad()`, 它将在成功接收端恢复原始消息内容之前去除多余的填充字符。 下面展示了一个完整的例子说明如何应用这两个工具来进行安全通信中的信息保护过程: ```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes from Crypto.Util.Padding import pad, unpad key = get_random_bytes(16) # 密钥应该保密存储并且保持一致 iv = get_random_bytes(16) # 初始化向量也需要共享给对方但不需要像密钥那样严格保管 def encrypt_message(message): cipher = AES.new(key, AES.MODE_CBC, iv) ct_bytes = cipher.encrypt(pad(message.encode(), AES.block_size)) return ct_bytes def decrypt_message(ct_bytes): decipher = AES.new(key, AES.MODE_CBC, iv) pt = unpad(decipher.decrypt(ct_bytes), AES.block_size).decode() return pt original_text = "This is a test message" encrypted_data = encrypt_message(original_text) try: decrypted_text = decrypt_message(encrypted_data) print(f"Decrypted text matches original: {decrypted_text == original_text}") except ValueError as e: print(e) ``` 此脚本展示了从创建随机初始化矢量 (IV),执行加密直到最后一步尝试重新获取初始字符串整个周期内的每一步骤都遵循最佳实践指南。 另外值得注意的是虽然这里讨论的重点在于解决由于缺少适当填充所引发的具体异常情况之外还应注意其他潜在风险因素比如密钥管理不当可能导致的安全隐患以及选择合适的工作模式等方面考虑整体安全性设计[^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值