这是 Sweet32 攻击(CVE-2016-2183)的演示:https://sweet32.info/
该攻击是生日攻击的一个实例,利用 CBC 模式下具有小分组大小(64 位)的加密算法,例如 3DES 和 Blowfish。 攻击需要生成大量已知明文的加密分组。 生成后,可以识别出相同的加密分组,并用于识别未知分组的明文值。
此实现使用 3DES(三重 DES) 作为其加密算法, 其分组大小为 64 位(8 字节)——与使现实世界中的 3DES 易受 Sweet32 攻击的相同分组大小。
当两个密文分组碰撞(c_i = c_j)时,我们可以使用以下方法恢复未知明文:
p_i = p_j ⊕ c_{i-1} ⊕ c_{j-1}
其中:
p_i 是未知明文(例如,秘密 Cookie)p_j 是已知明文(例如,HTTP 头部)c_{i-1} 和 c_{j-1} 是前一个密文分组这是因为在 CBC 模式下,碰撞意味着分组密码的输入相等,从而无需知道加密密钥即可通过 XOR 恢复。
运行带有保证碰撞的演示:
# 步骤1:生成带有秘密 Cookie 的加密数据包
python generate_rigged_packets.py rigged_demo.bin
# 步骤2:执行攻击以恢复 Cookie
python sweet32.py --block-size 8 rigged_demo.bin
攻击将显示 SECRET COOKIE 值,然后仅使用密文恢复它!
generate_rigged_packets.py创建一个具有保证碰撞的数据包以用于演示。 Cookie 值被精心构造,使其与一个已知明文分组发生碰撞。
sweet32.py执行 Sweet32 生日攻击以恢复 Cookie。
Sweet32 攻击利用生日悖论。对于 64 位分组密码:
这使得 3DES(以及其他 64 位分组密码)在长期存在的 HTTPS 会话中容易受到攻击。
对于实际的针对 3DES(64 位分组)的 Sweet32 攻击:
| 分组大小 | 分组大小 | 数据包数量 | 所需数据 | 块计数 |
|---|---|---|---|---|
| 8 字节 | 64 位 | ~785GB | ~785GB | ~2^32 块 |
实际攻击需要约 785GB 的相同密钥下加密的数据,这就是为什么它主要影响长期存在的 HTTPS 连接。