0

我很困惑。根据下面我的IV“必须”对于每一轮加密都是唯一的。

IV 的属性取决于使用的加密方案。一个基本 要求是唯一性,这意味着不能在同一个密钥下重复使用任何 IV。对于分组密码,重复的 IV 值将加密方案转变为电子密码本模式:相等的 IV 和相等的明文导致相等的密文。- https://en.wikipedia.org/wiki/Initialization_vector

我正在使用.NET AesCryptoServiceProvider 类。我正在使用GenerateIV生成一个新的 IV 并将该 IV 与密文一起发送到远程端点,然后该端点将使用 IV 和私有共享密钥解密数据包。

我的数据包是 XML,因此总是以相同的前导文本开头。(例如“<SomeTag ...>unique_text</SomeTag>”)

在密钥的 5 到 10 分钟生命周期内,我的密钥可能会经历数千次加密/解密周期。在两次生成相同的 IV 之前,我可以调用 GenerateIV 多少次?或者换一种说法,GenerateIV 适合多少个周期?五,十,数百,数千,数百万?

这是有问题的代码:

_sessionKeys[_currentSessionKeyId].GenerateIV();
var key = _sessionKeys[_currentSessionKeyId].Key;
var iv = _sessionKeys[_currentSessionKeyId].IV;

ICryptoTransform encryptor = _sessionKeys[_currentSessionKeyId].CreateEncryptor(key,iv);

似乎鉴于 AesCryptoServiceProvider.GenerateIV 生成的 IV 的大小是有限的,那么在生成重复的 IV 之前可以调用它的次数也是有限的。但是那个有限的数字是什么。

4

1 回答 1

2

IV中有128位(16字节)。根据生日攻击的维基百科页面(您将看到从池中随机提取的重复值的概率)有 0.0000000000000001% 的机会看到任何数字两次,您必须调用该函数大约 26,000,000,000 次。要让它有 1% 的机会看到任何数字两次,您必须调用它 2,600,000,000,000,000,000 次。

这假设 GenerateIV 有一个“好的”随机数生成器,它给出了它应该具有的均匀分布。

于 2015-09-09T06:11:14.080 回答