我在编码时看到了这一点并认为它看起来很奇怪:
果然,MSDN说RNGCryptoServiceProvider(byte[] rgb)
和RNGCryptoServiceProvider(string str)
都忽略了他们的参数。
据我所知,这两者和RNGCryptoServiceProvider()
之间没有实际区别。到底是怎么回事?我怀疑我遗漏了一些与密码学有关的奇怪事情。
答案 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文档所期望的一切都是。