# 挑战18:实现CTR流密码模式 字符串: ``` L77na/nrFsKvynd6HzOoG7GHTLXsTVu9qvY/2syLXzhPweyyMTJULu/6/kXX0KSvoOLSFQ== ``` ...在CTR模式下解密为近似英语的内容,CTR是一种将AES分组密码转换为流密码的AES分组密码模式,参数如下: ``` key=YELLOW SUBMARINE nonce=0 format=64位无符号小端nonce, 64位小端块计数(字节计数 / 16) ``` CTR模式非常简单。 CTR模式不是加密明文,而是加密运行计数器,产生16字节的密钥流块,与明文进行XOR。 例如,对于具有这些参数的消息的前16字节: ``` keystream = AES("YELLOW SUBMARINE", "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") ``` ...对于下一个16字节: ``` keystream = AES("YELLOW SUBMARINE", "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00") ``` ...然后: ``` keystream = AES("YELLOW SUBMARINE", "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00") ``` CTR模式不需要填充;当你用完明文时,你只需停止XOR密钥流并停止生成密钥流。 解密与加密相同。生成相同的密钥流,XOR,并恢复明文。 解密此函数顶部的字符串,然后使用你的CTR函数来加密和解密其他东西。 ## 这是好代码中唯一重要的分组密码模式 大多数现代密码学依靠CTR模式将分组密码适配为流密码,因为我们想要加密的大部分内容更好地描述为流而不是块序列。Daniel Bernstein曾经对Phil Rogaway开玩笑说,好的密码系统不需要"解密"变换。像CTR这样的构造就是他所说的。