8

这是java代码:

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(someBytes);//someBytes is the seed

C#中是否有任何相等的方法?我得到的不正确:

RandomNumberGenerator rng = RNGCryptoServiceProvider.Create();
rng.GetBytes(someBytes);// out someBytes

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

4

2 回答 2

8

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

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

如果您查看具体的实现,RNGCryptoServiceProvider虽然它确实公开了一个接受 abyte[]来大概初始化 PRNG 的构造函数,但它的文档说

该值被忽略。

评论继续说

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

有关进入所使用种子的内容类型的信息,请参阅 MSDN 文档CryptGenRandom

于 2012-11-20T01:47:28.643 回答
7

根据 MSDN 文档,RNGCryptoServiceProvider似乎没有一种方法可以自己手动为其播种值。有些构造函数采用byte[]and string,但是这两个参数都被忽略了

这无关紧要,因为任何有价值的随机数生成器都会在创建时正确地播种。您提供的任何值都不太可能比内部播种机制更好(这可能是一个高分辨率的时间衍生值)。

于 2012-11-20T01:44:22.190 回答