C#中的SecureRandom

时间:2012-11-20 01:32:05

标签: c# java

这是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相同。

3 个答案:

答案 0 :(得分:8)

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

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

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

  

忽略此值。

这些评论继续说

  

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

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

答案 1 :(得分:6)

根据RNGCryptoServiceProvider的MSDN文档,似乎没有办法用自己手动为其赋值。有一些构造函数采用byte[]string,但这两个参数都被忽略

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

答案 2 :(得分:0)

RNGCryptoServiceProvider类不需要手动播种。