12

我正在制作一个使用 AES 加密的数据包(即,不是流)的协议。我决定使用 GCM(基于 CTR),因为它提供集成身份验证并且是 NSA 套件 B 的一部分。使用 ECDH 协商 AES 密钥,其中公钥由受信任的联系人签名,作为网络的一部分-使用 ECDSA 之类的信任。我相信我需要一个用于 GCM 的 128 位随机数/初始化向量,因为即使我为 AES 使用 256 位密钥,它始终是 128 位分组密码(对吗?) 我将在之后使用 96 位 IV阅读BC代码。

我绝对没有实现我自己的算法(只是协议——我的加密提供者是 BouncyCastle),但我仍然需要知道如何使用这个随机数而不是自找麻烦。使用相同 DH 密钥的两个人之间使用的 AES 密钥将保持不变,因此我知道不应将相同的 nonce 用于多个数据包。

我可以简单地在数据包中添加一个 96 位的伪随机数并让接收者将其用作随机数吗?这是点对点软件,数据包可以随时发送(例如,即时消息、文件传输请求等),速度是一个大问题,所以最好不要使用安全的随机数来源。随机数根本不必保密,对吗?还是必须像“加密安全”的 PNRG 一样随机?维基百科说它应该是随机的,否则它很容易受到选择的明文攻击——但在这两种说法旁边都有一个“需要引用”,我不确定这是否适用于分组密码。我真的可以使用一个计数器来计算使用给定 AES 密钥发送的数据包数量(与 128 位块数量的计数器分开)吗?从 1 开始?显然,这将使随机数可预测。考虑到 GCM 会进行身份验证和加密,这会损害其身份验证功能吗?

4

2 回答 2

7

GCM是一种带身份验证的分组密码计数器模式。计数器模式有效地将块密码转换为流密码,因此流密码的许多规则仍然适用。需要注意的是,相同的 Key+IV 将始终产生相同的 PRNG 流,并且重复使用此 PRNG 流可能导致攻击者通过简单的 XOR 获得明文。在一个协议中,相同的 Key+IV 可以用于会话的生命周期,只要模式的计数器不换行(int 溢出)。例如,一个协议可以有两方,并且他们有一个预先共享的密钥,然后他们可以协商一个新的加密 Nonce,用作每个会话的 IV(记住 nonce 意味着使用一次)。

如果您想使用 AES 作为分组密码,您应该查看CMAC 模式或 OMAC1 变体。在 CMAC 模式下,仍然适用 CBC 的所有规则。在这种情况下,您必须确保每个数据包都使用一个唯一的 IV,该 IV也是随机的。然而,重要的是要注意重用 IV 并没有像重用 PRNG 流那样可怕的后果。

于 2011-04-17T18:00:39.640 回答
1

我建议不要制定自己的安全协议。您需要考虑几件事,即使是合格的密码学家也可能会弄错。我建议您参考 TLS 协议 (RFC5246) 和数据报 TLS 协议 (RFC 4347)。选择一个图书馆并使用它们。

关于 GCM 模式下 IV 的问题。我会告诉你 DTLS 和 TLS 是如何做到的。它们使用显式随机数,即包含在每个数据包中的消息序列号(64 位),以及不传输的秘密部分(高 32 位),并且来自初始密钥交换(请参阅 RFC 5288更多信息)。

于 2011-04-18T13:05:52.030 回答