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.

4

2 に答える 2

8

抽象クラスSystem.Security.Cryptography.RandomNumberGeneratorとその具体的な実装は、開発者にシードを設定するためのメソッドを公開していません(ただし、内部的には、実際にシードを使用していると思われます)。

そこにあった設計の理論的根拠は、再現性が「暗号的に強い」ランダムな値の流れを生み出さないことだと私は思う。

具体的な実装を見ると、おそらくPRNGを初期化するために、をRNGCryptoServiceProvider受け入れるコンストラクターが公開されていますが、そのドキュメントには次のように書かれています。byte[]

この値は無視されます。

そして、発言は続けて言います

このメソッドは、RNGCryptoServiceProviderクラスを直接初期化しません。このメソッドを呼び出すことは、RNGCryptoServiceProviderコンストラクターを呼び出してnullを渡すことと同じです。

使用されるシードに含まれるものの種類については、MSDNのドキュメントを参照してください。CryptGenRandom

于 2012-11-20T01:47:28.643 に答える
7

MSDNのドキュメントによると、RNGCryptoServiceProvider自分で値を手動でシードする方法はないようです。byte[]とを取るコンストラクタがありますがstringこれらの引数は両方とも無視されます。

これは重要ではありません。salt での重みに見合う乱数ジェネレーターは、作成時に適切にシードされるためです。あなたが提供する値は、内部シードメカニズム (おそらく高解像度の時間派生値) よりも優れているとは考えられません。

于 2012-11-20T01:44:22.190 に答える