在耗尽唯一IV的数量之前,可以安全地调用AesCryptoServiceProvider.GenerateIV多少次?

时间:2015-09-09 01:38:32

标签: .net aes encryption-symmetric encryption-asymmetric initialization-vector

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

  

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

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

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

在密钥的五到十分钟生命期内,我的密钥可能存在数千个加密/解密周期。在我生成相同的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之前可以调用它的次数也是有限的。但那个有限数字是什么。

1 个答案:

答案 0 :(得分:2)

IV中有128位(16字节)。根据{{​​3}}上的维基数据页面(您将看到从池中随机抽取重复值的概率),有两次看到任意数字的概率为0.0000000000000001%,您必须调用该函数大约26,000,000,000次。为了使任何数字看到两次的可能性为1%,您必须将其称为2,600,000,000,000,000,000次。

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