为什么RNGCryptoServiceProvider的构造函数忽略其参数?

时间:2015-08-13 18:51:11

标签: c# cryptography

我在编码时看到了这一点并认为它看起来很奇怪:

enter image description here

果然,MSDNRNGCryptoServiceProvider(byte[] rgb)RNGCryptoServiceProvider(string str)都忽略了他们的参数。 据我所知,这两者和RNGCryptoServiceProvider()之间没有实际区别。到底是怎么回事?我怀疑我遗漏了一些与密码学有关的奇怪事情。

1 个答案:

答案 0 :(得分:1)

它可能是以前旧版本的遗留物,可能会回溯到1.x,因为即使2.0 API包含相同的描述。然而,2.0和2.1 API可能会在平均时间内发生变化。

如果您查看Mono源,那么您会找到

_handle = RngInitialize (rgb);

_handle = RngInitialize (Encoding.UTF8.GetBytes (str));

所以我假设数据被用作平台提供的随机数生成器的附加或初始种子。这也是最有意义的。 Mono源通常尽可能遵循MS实现。

如果平台提供的RNG是安全的,则可能几乎不需要从应用程序中播种它。使用RNG作为一次又一次地生成相同流的方法(即,当参数用作初始种子时)充满危险,特别是如果底层实现未知并且平台和系统更新之间可能不同。所以这是弃用构造函数的一个很好的理由。

显然,如果它们刚被删除,那么旧的源代码将不再编译。因此,将实现留空是更合乎逻辑的,因为生成的实例无论如何都应该生成随机数据。

最后,这只是一个(非常)受过教育的猜测,原因并未在当前的API文档中指定。似乎构造函数没有标记为过时。换句话说,我对Microsofts加密API文档所期望的一切都是。