# 挑战16:CBC位翻转攻击 生成随机AES密钥。 结合你的填充代码和CBC代码来编写两个函数。 第一个函数应该接受任意输入字符串,前置字符串: ``` "comment1=cooking%20MCs;userdata=" ``` ...并附加字符串: ``` ";comment2=%20like%20a%20pound%20of%20bacon" ``` 函数应该转义";"和"="字符。 然后函数应该将输入填充到16字节AES块长度,并在随机AES密钥下加密它。 第二个函数应该解密字符串并查找字符";admin=true;"(或者,等价地,解密,用";"分割字符串,将每个结果字符串转换为2元组,并查找"admin"元组)。 根据字符串是否存在返回true或false。 如果你正确编写了第一个函数,应该*不*可能向其提供会生成第二个函数正在寻找的字符串的用户输入。我们必须破解密码才能做到这一点。 相反,修改**密文**(不知道AES密钥)来完成这个目标。 你依赖的事实是,在CBC模式中,密文块中的1位错误: - 完全打乱发生错误的块 - 在下一个密文块中产生相同的1位错误(/编辑) ## 停下来思考一下 在你实施这个攻击之前,回答这个问题:为什么CBC模式具有这个属性?