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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:31:02