我正在制作一个使用AES加密的数据包(即非流)的协议.我决定使用GCM(基于CTR),因为它提供了集成身份验证,并且是NSA套件B的一部分.使用ECDH协商AES密钥,其中公钥由可信联系人签名,作为网络的一部分 - 使用像ECDSA这样的信任.我相信我需要一个用于GCM的128位随机数/初始化向量,因为即使我使用256位密钥进行AES,它总是一个128位分组密码(对吗?) 我将使用96位IV后阅读BC代码.
我绝对没有实现我自己的算法(只是协议 - 我的加密提供程序是BouncyCastle),但我仍然需要知道如何使用这个nonce而不用自己的脚.在具有相同DH密钥的两个人之间使用的AES密钥将保持不变,因此我知道不应将同一个随机数用于多个数据包.
我可以简单地在数据包前加一个96位伪随机数,并让收件人将其用作nonce吗?这是点对点软件,数据包可以随时发送(例如,即时消息,文件传输请求等),速度是一个大问题,所以最好不要使用安全随机数源.nonce根本不必是秘密的,对吧?或者必然像"加密安全"PNRG一样随机?维基百科说它应该是随机的,否则它很容易受到选择的明文攻击 - 但是两个声明旁边都有一个"需要引用",我不确定这是否适用于分组密码.我是否可以使用一个计数器来计算从给定的AES密钥开始的1个发送的数据包数(与128位数的计数器分开)?显然这会使nonce可预测.考虑到GCM进行身份验证以及加密,这是否会损害其身份验证功能?