C# C语言中的安全随机#

C# C语言中的安全随机#,c#,java,C#,Java,以下是java代码: SecureRandom=SecureRandom.getInstance(“SHA1PRNG”); 随机设置种子(某些字节)//有些字节是种子 在C#中有任何相等的方法吗?我得到的不正确: RandomNumberGenerator rng = RNGCryptoServiceProvider.Create(); rng.GetBytes(someBytes);// out someBytes 我确实需要种子,因为java代码需要,我必须将java代码翻译成C。当我传

以下是java代码:

SecureRandom=SecureRandom.getInstance(“SHA1PRNG”);
随机设置种子(某些字节)//有些字节是种子
在C#中有任何相等的方法吗?我得到的不正确:

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

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

根据MSDN文档,因为似乎没有一种方法可以自己手动为其添加值。有些构造函数采用and,但这两个参数都被忽略


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

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

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

如果你看一下具体的实现,
RNGCryptoServiceProvider
,它确实公开了一个接受
字节[]
的构造函数来初始化PRNG,它的文档中说

此值将被忽略

评论接着说

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


有关所使用的种子类型的信息,请参阅MSDN文档,了解您的代码有哪些错误?在java代码中,“someBytes”是种子,在C#“someBytes”中是容器。请评论为什么需要种子?例如,对于单元测试,您可以创建自己版本的RandomGenerator,它可以执行任何您想要的操作…这不是“为什么”的一个非常有用的答案。您是希望C#RNG提供与Java RNG相同的值序列,还是每次传递相同的种子时都试图获得相同的值序列?这不会发生。这些值是特定于实现的,因此不仅取决于种子,还取决于算法。您不会获得相同的值是的。是否有任何可能的种子方法?为什么您认为必须对其进行种子设定?指定特定种子的唯一原因是为了获得可重复的结果(例如,对测试有用)。即使您可以为
RNGCryptoServiceProvider
,获得完全相同的流值的唯一方法是两个实现使用完全相同的算法。而且Microsoft的文档没有指定我可以找到的正在使用的算法。
CryptGenRandom()的文档
表明算法因操作系统而异。理论上,一个实现可以使用Intel的,此时种子不能保证相同的数字输出。不管怎样,这个问题是完全没有意义的。你不能给这个类种子。如果你想用预定义的数字串进行测试,那么就制作一个interf问题是,SHA1PRNG类经常被错误地用作确定性(基于密码的)密钥派生函数。在这种情况下,仅仅设置种子是不够的,您必须模拟SHA1PRNG算法,而这一算法是没有帮助的。