C#中的SecureRandom

use*_*475 7 c# java

这是java代码:

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(someBytes);//someBytes is the seed
Run Code Online (Sandbox Code Playgroud)

C#中有相同的方法吗?我得到的是不正确的:

RandomNumberGenerator rng = RNGCryptoServiceProvider.Create();
rng.GetBytes(someBytes);// out someBytes
Run Code Online (Sandbox Code Playgroud)

我确实需要种子,因为java代码确实如此,我必须将java代码翻译成C#.当我传递相同的种子时,我从C#获得的序列必须与java相同.

Nic*_*rey 8

抽象类System.Security.Cryptography.RandomNumberGenerator及其具体实现没有公开将种子设置给开发人员的方法(虽然在内部,我怀疑他们确实使用了一个.)

我怀疑,设计的基本原理是,可重复性不会产生"密码强"的随机值流.

如果你看一下具体的实现,RNGCryptoServiceProvider虽然它确实暴露了一个接受a的构造函数byte[],可能初始化PRNG,但它的文档说

该值被忽略.

这些评论继续说

此方法不直接初始化RNGCryptoServiceProvider类.调用此方法等同于调用RNGCryptoServiceProvider构造函数并传递null.

有关进入种子的东西的信息,请参阅MSDN文档 CryptGenRandom


Jon*_*art 6

根据MSDN文档,RNGCryptoServiceProvider似乎没有办法用自己的值手动播种它.有迹象表明,采取构造函数byte[]string,但双方的这些参数被忽略.

这没关系,因为任何在盐中值得重量的随机数发生器都会在创建时适当地播种.您提供的任何值都不可能比内部播种机制(可能是高分辨率的时间导出值)更好.

  • 指定特定种子的唯一原因是获得可重复的结果(例如,对于测试很有用)。即使您可以“种子” RNGCryptoServiceProvider,也将获得完全相同的流值的唯一方法是两个实现都使用完全相同的算法。而且Microsoft的文档没有指定我可以找到的使用中的算法。“ CryptGenRandom()”的文档建议算法随操作系统的不同而不同。 (2认同)
  • 理论上,可以使用英特尔的 [DRNG](http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide) 进行实现,此时种子不能保证相同的数字输出。无论如何,这个问题完全没有意义。你*不能*为这个班级播种。如果您想使用预定义的数字字符串进行测试,请创建一个接口,并用模拟 RNG 替换它。鳍。 (2认同)