如何在Python中使用相同IV的AES-CTR加密模式?
AES-CTR模式加密密文不同的问题解析
问题原因
你遇到的情况核心原因是同一个AES cipher对象的计数器会持续递增:
- CTR模式属于流加密,每次加密数据时,内部计数器会根据加密的字节数推进。第一次加密
message后,计数器已偏离初始值,第二次加密会使用新计数器生成的密钥流,因此密文必然不同。 - 另外
MODE_CTR确实不支持iv参数,CTR模式依赖nonce初始化计数器(PyCryptodome中,nonce会和默认初始计数器值0组合)。
解决办法
要让同一消息加密得到相同密文,需每次加密都创建新的AES实例,确保每次都从初始计数器开始:
from Crypto.Cipher import AES key = b'1111111111111111' # 注意:key必须是字节类型,原代码字符串会报错 message = b'Hello, world!' # encrypt方法要求输入为字节类型 # 每次加密新建cipher对象,保证计数器从头开始 cipher1 = AES.new(key, AES.MODE_CTR, nonce=b'0') ciphertext1 = cipher1.encrypt(message) cipher2 = AES.new(key, AES.MODE_CTR, nonce=b'0') ciphertext2 = cipher2.encrypt(message) print(ciphertext1 == ciphertext2) # 输出True
重要注意事项
- nonce必须唯一:同一密钥下绝不能重复使用相同nonce,否则攻击者可通过异或两次密文得到明文异或结果,进而破解内容。生产环境建议使用随机生成的nonce(PyCryptodome默认会自动生成8字节随机nonce,无需手动指定)。
- 数据类型要求:
AES.new的key和encrypt的输入都必须是字节类型,原代码中的字符串会触发类型错误,需转换为b''格式。
内容的提问来源于stack exchange,提问作者user8624
相关产品推荐
相关产品推荐

