如何利用PyCryptodome模块在Python中对敏感数据进行AES加密?
- 内容介绍
- 文章标签
- 相关推荐
本文共计795个文字,预计阅读时间需要4分钟。
由于AES是分组加密算法,原始明文长度必须是16字节(AES-128)的整数倍,且不能直接处理任意字符字符串。常见错误是输入UTF-8字符串后报错ValueError: Data must be a multiple of block length。正确做法是:
PyCryptodome 不提供自动填充,得自己补。推荐用 PKCS#7 填充(注意不是 PKCS#5,虽然对 AES 来说二者等价):
from Crypto.Util.Padding import pad, unpad from Crypto.Cipher import AES <p>key = b'0123456789abcdef' # 16字节密钥 data = b'secret message' padded = pad(data, AES.block_size) # 补到16/24/32字节对齐 cipher = AES.new(key, AES.MODE_CBC) ciphertext = cipher.encrypt(padded)
AES.MODE_CBC 必须配随机 iv,别硬编码
CBC 模式下,相同的明文+密钥总会生成相同密文,这会暴露数据模式(比如大量重复的“STATUS:OK”)。攻击者可能通过观察密文长度和重复性推测内容。所以每次加密都必须用新 iv,且要和密文一起保存或传输。
别写 iv = b'1234567890123456' —— 这等于没加 IV。
本文共计795个文字,预计阅读时间需要4分钟。
由于AES是分组加密算法,原始明文长度必须是16字节(AES-128)的整数倍,且不能直接处理任意字符字符串。常见错误是输入UTF-8字符串后报错ValueError: Data must be a multiple of block length。正确做法是:
PyCryptodome 不提供自动填充,得自己补。推荐用 PKCS#7 填充(注意不是 PKCS#5,虽然对 AES 来说二者等价):
from Crypto.Util.Padding import pad, unpad from Crypto.Cipher import AES <p>key = b'0123456789abcdef' # 16字节密钥 data = b'secret message' padded = pad(data, AES.block_size) # 补到16/24/32字节对齐 cipher = AES.new(key, AES.MODE_CBC) ciphertext = cipher.encrypt(padded)
AES.MODE_CBC 必须配随机 iv,别硬编码
CBC 模式下,相同的明文+密钥总会生成相同密文,这会暴露数据模式(比如大量重复的“STATUS:OK”)。攻击者可能通过观察密文长度和重复性推测内容。所以每次加密都必须用新 iv,且要和密文一起保存或传输。
别写 iv = b'1234567890123456' —— 这等于没加 IV。

