Cryptology Academy · 课时

重放攻击与随机数重复使用漏洞

了解在 GCM 及其他模式中重复使用随机数如何彻底破坏密文机密性。

第 2 / 4 课13 个步骤

重放攻击与随机数重复使用漏洞 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。

随机数在密码学中的用途

随机数(只使用一次的数值)可以确保同一条明文消息加密两次后产生不同的密文。这对于语义安全至关重要:攻击者即使观察到多条密文,也无法得知它们加密的是相同还是不同的明文。在流密码和 CTR 模式分组密码中,随机数会为密钥流生成过程提供种子,因此对安全性极为重要。

GCM 随机数作为计数器初始化

在 AES-GCM 中,96 位随机数用于初始化 CTR 模式加密的计数器,同时也参与 GHASH 认证计算。每个 AES 分组的计数器值都通过从该随机数开始递增得到。如果两次加密使用相同的随机数和密钥,就会生成相同的密钥流,使两段密文的 XOR 等于两段明文的 XOR。

GCM 中灾难性的随机数重用

使用相同的(密钥、随机数)组合加密得到的两段 GCM 密文,其 XOR 等于对应两段明文的 XOR。如果攻击者知道其中一段明文(在选择明文场景中很常见),就能立即恢复另一段明文。即使不知道任何明文,密文的 XOR 也会泄露语言模式,并且可以通过明文猜测拖拽技术进行攻击。这是密码学中最灾难性的误用模式之一。

从随机数重用中恢复认证密钥

GCM 随机数重用除了会导致明文泄露,还会带来另一个灾难性后果。GHASH 认证密钥 H 完全由加密密钥派生而来。如果两条消息共享同一个(密钥、随机数)组合,攻击者就可以求解多项式方程来恢复 H。获知 H 后,攻击者可以为任意密文伪造有效的 GCM 认证标签,从而彻底破坏消息完整性。

TLS 1.3 随机数构造

TLS 1.3 吸取了 TLS 1.2 实现中随机数重用风险的教训。TLS 1.3 通过将 12 字节的写入 IV(由握手派生)与 8 字节的序列号(零扩展为 12 字节)进行 XOR,生成 GCM 随机数。由于序列号会随每条记录递增,每条记录都会使用唯一的随机数。这既消除了生成随机数的风险,又通过序列号机制确保了随机数的唯一性。

重放攻击概述

重放攻击会捕获一条有效消息或认证令牌,稍后重新发送,以造成欺诈性结果。例如:重放银行交易以重复扣款,重放有效的认证响应以冒充用户,或重放已签名的设备命令。攻击者不需要理解或修改消息;只需重新发送捕获的数据即可完成攻击。

使用时间戳防止重放

在经过认证的消息中加入时间戳,可以提供重放保护。接收方只接受处于短时间窗口内的消息(例如,声称的时间戳前后 5 分钟内)。数小时前重放的消息超出该窗口,就会被拒绝。时间戳必须经过认证(包含在 HMAC 或 AEAD 附加数据中),以防止攻击者修改时间戳,使消息看起来像是刚刚生成的。

使用序列号防止重放

与时间戳相比,序列号可以提供更强的重放保护,因为它不仅能检测旧消息的重放,还能检测重复投递和乱序投递。接收方会维护预期的下一个序列号,以及一个记录近期已见序列号的滑动窗口。每条消息的序列号都必须处于可接受的窗口内,且此前未出现过。TLS 使用序列号来防止会话内的记录重放。

生成安全的随机数

对于 AES-GCM,随机随机数的推荐生成策略是使用密码学安全的伪随机数生成器(CSPRNG)生成 96 位随机数。对于 96 位随机数,经过 2^32 次加密(约 40 亿次)后,按照生日界计算的碰撞概率会达到 2^-32。对于高吞吐量应用,应改用基于计数器的随机数,或使用其他 AEAD(例如采用 192 位随机数的 XChaCha20-Poly1305),以扩大安全使用上限。

确定性随机数:计数器管理

确定性的基于计数器的随机数可以避免生日界问题,但需要谨慎管理状态。计数器必须在应用重启后继续保留;如果计数器在重启时重置为零,就会立即与相同密钥产生随机数重用。计数器必须在随机数使用之前以原子方式更新(而不是之后更新)。对于分布式系统,基于计数器的随机数需要进行协调,以防两个节点使用相同的计数器值。

使用 XChaCha20-Poly1305 获取更大的随机数

XChaCha20-Poly1305 将 ChaCha20-Poly1305 的随机数长度从 96 位扩展到 192 位。对于 192 位随机数,即使经过 2^96 次加密(消息数量大到几乎无法想象),按照生日界计算的碰撞概率仍然可以忽略不计。因此,生成随机数时无需担心实际的生日界问题。libsodium 的 crypto_secretbox(XSalsa20-Poly1305)也使用 192 位随机数,原因相同。

GCM 随机数重用的后果

如果两段 GCM 密文使用相同的密钥和随机数生成,攻击者可以恢复什么?

随机数与重放攻击回顾

随机数重用回顾:随机数确保密文具有唯一性;GCM 中重用随机数会泄露明文的 XOR,并通过恢复 H 破坏认证;TLS 1.3 使用序列号与 IV 的 XOR 来保证随机数唯一;重放攻击会在不修改有效消息的情况下重新发送它们;在经过认证的消息中加入时间戳和序列号可以防止重放;对于 GCM,应使用 96 位随机随机数(注意生日界),或者使用 XChaCha20 以获得更大的随机数空间。

免费开始

用 AI 导师学习 Cryptology Academy — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
67
课程
261

常见问题解答

「重放攻击与随机数重复使用漏洞」课时是免费的吗?

是的 — 「重放攻击与随机数重复使用漏洞」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。

「重放攻击与随机数重复使用漏洞」这节课中我会学到什么?

了解在 GCM 及其他模式中重复使用随机数如何彻底破坏密文机密性。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cryptology Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「重放攻击与随机数重复使用漏洞」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cryptology Academy 课中编写并运行代码吗?

能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 深入了解填充预言机攻击
  2. 重放攻击与随机数重复使用漏洞
  3. 应用层代码中的时序攻击
  4. 常见密码学误用模式
← 返回 Cryptology Academy