CTR 模式下的 nonce 有什么意义?

信息安全 加密 密码学 随机数 初始化向量
2021-08-12 08:13:05

在 CTR 模式下使用 nonce 是否真的可以提高安全性(与仅使用 1、2、3 等相比 - 基本上是一个恒定的随机数 0)?

据我所知,最好的安全场景是 nonce 可以充当一种第二密钥,它也可以在通信双方之间安全地共享。但是,如果底层的分组密码是安全的(比如说 AES-128),那应该是不必要且无益的……对吧?

在我看来,指定随机数只会给人一种增加安全性的错误感觉。我错过了什么吗?

2个回答

“nonce”更好地称为初始化向量——“IV”是该概念的通用简称。CTR 模式通过加密计数器的连续值来工作(CTR 代表“Counter”),因此 CTR 模式中的 IV 仅仅是计数器开始的值。

CTR 基本上会产生一个长的依赖于密钥的伪随机流,并且通过将该流与要加密的数据进行异或运算来进行加密;从这个意义上说,它与One-Time Pad非常相似,除了密钥流是使用 AES 生成的(作为一种 PRNG):这使 OTP 的数学优势(即其绝对安全性)无效,但它使该方案可用在实践中。

使用值为零的 IV 很好......只要你只做一次。如果您在另一次运行中重复使用计数器值(使用相同的键),那么您最终会得到与 OTP 相同的东西,其中“pad”不是“一次性”。这是一个经典的休息。这个想法是,对于给定的 key,无论何时使用它,您都应该将每个计数器值视为“烧毁”。如果您从计数器值 0 开始执行第一次加密运行,那么您将使用计数器值 0 到例如 12782(例如,如果当时加密的数据长度为 276525 字节)。如果您不更改密钥,则不得重复使用 0 到 12782 之间的任何计数器值。使用该密钥运行的下一次加密应该以 IV = 12783 开始。

相反,只要您只使用一次 AES 密钥,坚持值为 0 的 IV 始终是安全的。这在类似 SSL 的协议中是有意义的,其中特定于连接的加密密钥在初始握手期间协商,用于该连接,然后永远丢弃。


更一般地说,分组密码的大多数操作模式都使用 IV(因为它们有一些必须从某个地方开始的“运行状态”),并且对这些 IV 的要求取决于模式。如果您从不将密钥重复用于另一次运行,CTR 可以容忍固定的 IV。CBC 甚至不能容忍这种情况,因为可以利用可预测的 IV 进行选择明文攻击。

这是一个随机的猜测,因为我不是专家......

要回答标题中的问题,“CTR 模式下的 nonce 有什么意义?”,我会说是让协议无状态这意味着双方不需要存储任何信息来加密/解密多次运行,除了密钥。

为了理解上面的陈述,让我们看一下分组密码和一些协议,如 SSL。

分组密码就像一个有两个参数的函数,密钥和输入。如果您两次提供相同的两个参数(键 + 输入),它将始终产生相同的输出。

在 SSL 中,您在开始时生成一个对称密钥,您将使用它来加密/解密许多不同的消息。因此,对于整个转换,您在分组密码中的一个论点已经是固定的。这意味着您绝不能重复第二个,否则您将从分组密码中产生相同的输出两次。

为什么两次从分组密码中产生相同的输出是不好的?

这很糟糕,因为它使您容易受到重放攻击。如果可以两次从分组密码中产生相同的输出,则意味着攻击者可以在对话期间重新发送您的一条旧消息,并且服务器将很乐意接受它。

那么,这就是我们需要随机数的原因吗?

是和不是。

如果您有固定的随机数,那么只要您在可能包含许多消息的整个对话期间从不使用相同的计数器重复使用相同的密钥就可以了。因此,客户端和服务器都需要知道计数器的最后一个值,因此他们需要保持一个状态。

通过使用随机数,我们假设我们永远不会有由随机数和计数器组合形成的相同输入。所以,我们不需要维护任何状态。