# 挑战二十七:从IV=Key的CBC中恢复密钥 ## 题目描述 取用你在[CBC练习](../../2/challenges/16.html)中的代码并修改它,使其将CBC加密的密钥重新用作IV。 应用程序有时会将密钥用作IV,理由是发送方和接收方都必须知道密钥,通过同时用作密钥和IV可以节省一些空间。 将密钥用作IV是不安全的;能够修改传输中密文的攻击者可以让接收方解密一个值,该值将泄露密钥。 ## 攻击步骤 练习16中的CBC代码加密一个URL字符串。验证明文的每个字节是否符合ASCII标准(即,查找高ASCII值)。不符合标准的消息应该引发异常或返回包含解密明文的错误(在现实系统中这种情况经常发生)。 使用你的代码加密至少3个块长的消息: ``` AES-CBC(P_1, P_2, P_3) -> C_1, C_2, C_3 ``` 修改消息(你现在是攻击者): ``` C_1, C_2, C_3 -> C_1, 0, C_1 ``` 解密消息(你现在是接收方)并在发现高ASCII时引发适当的错误。 作为攻击者,从错误中恢复明文,提取密钥: ``` P'_1 XOR P'_3 ```