已知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
相关产品推荐
相关产品推荐

