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

已知CTR模式AES的密文、明文与计数器,能否获取密钥及Python实现?

已知AES-CTR模式的明文、密文和计数器,能否推导出密钥?

结论

仅通过单组或多组明文、密文及对应计数器值,无法直接推导AES密钥——AES是经过密码学安全设计的对称加密算法,其加密过程单向不可逆,不存在高效手段从加密输入(计数器)和输出(密钥流块)反推密钥。

原理说明

AES-CTR属于流加密模式,核心逻辑如下:

  • 加密时,用密钥对计数器值进行AES加密,生成密钥流(Keystream)
  • 明文与密钥流逐字节异或得到密文;反之,密文与密钥流逐字节异或可还原明文
  • 你观察到“相同计数器下CTR模式总是生成相同加密输出”是正确的:相同密钥+相同计数器会生成完全一致的密钥流,相同明文异或相同密钥流自然得到相同密文。

为什么无法推导密钥?

从已知明文和密文可以计算出对应块的密钥流:

keystream_block = bytes(p ^ c for p, c in zip(known_plaintext, known_ciphertext))

这个密钥流本质是AES_Encrypt(key, counter)的输出,但AES的加密函数是单向设计的——正向加密极易计算,但逆向推导密钥的难度极高:

  • 对于标准AES-128,密钥空间达2^128,暴力破解在现实中完全不可行;AES-256的密钥空间更大,更无可能。

替代方案:用密钥流解密/加密

虽然无法获取密钥,但如果有同密钥、同计数器序列的其他密文,可通过已得到的密钥流直接解密(或加密新明文),Python实现如下:

from Crypto.Cipher import AES
from Crypto.Util import Counter

# 已知参数
known_plaintext = b"your_known_plaintext_content"
known_ciphertext = b"your_known_ciphertext_content"
initial_ctr = 123456  # 加密时使用的初始计数器值,需与加密端一致

# 计算密钥流
keystream = bytes(p ^ c for p, c in zip(known_plaintext, known_ciphertext))

# 解密同序列的其他密文
def decrypt_ctr_with_keystream(ciphertext, keystream):
    return bytes(c ^ k for c, k in zip(ciphertext, keystream))

# 示例使用
target_ciphertext = b"ciphertext_encrypted_with_same_key_ctr"
decrypted_result = decrypt_ctr_with_keystream(target_ciphertext, keystream)
print(decrypted_result.decode('utf-8'))

# 加密新明文(同密钥同计数器场景)
def encrypt_ctr_with_keystream(plaintext, keystream):
    return bytes(p ^ k for p, k in zip(plaintext, keystream))

内容的提问来源于stack exchange,提问作者CY W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:20:36