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