我正在制作一个使用 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 会进行身份验证和加密,这会损害其身份验证功能吗?