1

私は学校の課題に取り組んでおり、要件の 1 つはランダムな 128 ビット数を生成することです。C# でこれを行う方法を知りたいのですが、この方法は機能しますか?

byte[] RND128NUMBYTE = new byte[128];
Random Rand = new Random();
Rand.NextBytes(RND128NUMBYTE);

よろしくお願いします

編集:まず、ご回答いただきありがとうございます。とにかく、割り当てを明確にしたほうがよいでしょう。サーバー/クライアント アプリケーションを安全な方法で構築しています。ユーザーがサーバーに接続した後、そのサーバーに接続している他のユーザーと通信するには、認証を受ける必要があります。ユーザーがサーバーに認証を要求すると、サーバーは 128 ビットの乱数でクライアントに応答します。その後、他のプロセスが実行されます。

4

4 に答える 4

13

配列のサイズは要素で指定されます。したがって、バイト配列の場合、128 要素ではなく、それぞれ 8 ビットの 16 要素が必要です。

System.Random.NextBytesまたはのいずれかを使用できますRNGCryptoServiceProvider.GetBytes

しかし、 の不適切なシードは、ランダムな 128 ビット数に期待されるプロパティを取得できないことを意味するSystem.Random.NextBytesため、おそらく良い選択ではありません。System.Randomたとえば、生成する数値が 2^64 未満であっても、衝突が発生する可能性が高くなります。優れた PRNG からの 128 ビットの数値は、GUID と同じくらいグローバルに一意ですが、そこから引き出されたものはSystem.Random確かにそうではありません。

byte[] bytes = new byte[16];
using(var rng = new RNGCryptoServiceProvider())
{
    rng.GetBytes(bytes);
}
于 2013-05-10T22:24:02.510 に答える
8

まず、ランダム ビットではなく、128 のランダム バイトを生成しています。しかし、あなたの明確化はすべての違いを生みます:

サーバー/クライアント アプリケーションを安全な方法で構築しています。ユーザーがサーバーに接続した後、そのサーバーに接続している他のユーザーと通信するには、認証を受ける必要があります。ユーザーがサーバーに認証を要求すると、サーバーは 128 ビットの乱数でクライアントに応答します。

その場合、 8 倍のビットを生成しているという事実を考慮した後でも、ソリューションは非常に間違っています。疑似乱数System.Randomのみであり、実際にシードされた場合、エントロピーは 31 ビットしかありません。(*) 安全であるためには、128 ビットすべてのエントロピーが必要です。

ビットが欠落するたびに、問題が攻撃しやすくなることを忘れないでください。128 ビットのエントロピーが必要で 31 ビットある場合、問題は4倍簡単に攻撃できません。問題は 2 128-31 = 10 29倍攻撃しやすい!

偶然にも、私はこれについてブログ記事を書きました。Random最初の 5 つか 6 枚のカードだけを与えられたときにシャッフルしたカードのデッキの残りを理解するよう読者に挑戦しました。誰かが数時間で力ずくで解決策を見つけました。ランダムは非常に弱いです。. http://ericlippert.com/2013/05/06/producing-permutations-part-seven/を参照してください。

セキュリティ システムに暗号強度のランダム性が必要な場合は、128 ビットを超えるエントロピーを持つ特別な目的のランダム性ソースを使用する必要があります。

したがって、CodeInChaos の答えは正しいものです。

この話には 2 つの教訓があります。

まず、これがセキュリティ システムの設計が非常に難しい理由です。正しく処理すべき詳細が非常に多く、それらすべてを正しく処理する必要があります。そうしないと、システムは安全ではありません。

次に、適切な回答が得られるように、質問に十分な情報を入力してください。


(*) 実際には、これらの 2 31の可能なシードのいくつかは他のシードよりもはるかに可能性が高いため、それよりもかなり少ないです。

于 2013-05-11T00:06:48.037 に答える
3

割り当てが何であるかを理解していませんか?

このようにしてください:
あなたの理論を実装してください。何度も実行し、結果を保存します。制限内にいることを知るために、最低値と最高値をチェックするなど、いくつかの統計を行います。余分なプラスについては、各結果を数え、それらが均等に広がっていることを確認してください.

于 2013-05-10T22:24:11.847 に答える
2

要件は、128 ビットの乱数を生成することです。

代入は少し厳しすぎると思います。疑似乱数を意味することを願っています。問題を理解できる部分に分割する必要があることを指摘したいと思います。

PRNGを正しく初期化し、バイト配列を埋める方法を知っています。

Random Rand = new Random();
Rand.NextBytes(RND128NUMBYTE);

ここで、128 ビットのスペースをランダム性で埋める必要があります。128 ビットとは何ですか? .NET または C# はビットへのアクセスを提供しますか? 直接ではありませんが、byteタイプがあります。このタイプは 8 ビットを使用するため、128 / 8 = 16 バイトしか必要ありません。

128 ではなく 16 バイトの配列を作成するだけです。

byte[] RND128NUMBYTE = new byte[16];

これらのバイトを「数値」に変換する方法は、お任せします。

于 2013-05-10T22:25:12.867 に答える