这是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相同。
答案 0 :(得分:8)
抽象类System.Security.Cryptography.RandomNumberGenerator
及其具体实现没有公开将种子设置给开发人员的方法(虽然在内部,我怀疑他们确实使用了种子。)
我怀疑,设计的基本原理是重复性不会产生“加密强”的随机值流。
如果你看一下具体的实现,RNGCryptoServiceProvider
,虽然它确实暴露了一个接受byte[]
的构造函数来推测初始化PRNG,但它的文档说明
忽略此值。
这些评论继续说
此方法不直接初始化RNGCryptoServiceProvider类。 调用此方法等同于调用RNGCryptoServiceProvider 构造函数并传递 null 。
有关使用种子的内容类型的信息,请参阅CryptGenRandom
的MSDN文档
答案 1 :(得分:6)
根据RNGCryptoServiceProvider
的MSDN文档,似乎没有办法用自己手动为其赋值。有一些构造函数采用byte[]
和string
,但这两个参数都被忽略。
这没关系,因为任何在盐中值得重量的随机数发生器都会在创建时适当地播种。您提供的任何值都不可能比内部播种机制(可能是高分辨率的时间导出值)更好。
答案 2 :(得分:0)
RNGCryptoServiceProvider
类不需要手动播种。