RNGCryptoServiceProvider.GetBytes メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
オーバーロード
| 名前 | 説明 |
|---|---|
| GetBytes(Byte[]) |
バイトの配列に、暗号的に強力なランダム値のシーケンスを格納します。 |
| GetBytes(Span<Byte>) |
スパンに暗号的に強力なランダム バイトを格納します。 |
| GetBytes(Byte[], Int32, Int32) |
指定したバイト数の指定したインデックスから始まる、暗号的に強力なランダムな値シーケンスを指定したバイト配列に格納します。 |
GetBytes(Byte[])
バイトの配列に、暗号的に強力なランダム値のシーケンスを格納します。
public:
override void GetBytes(cli::array <System::Byte> ^ data);
public override void GetBytes(byte[] data);
override this.GetBytes : byte[] -> unit
Public Overrides Sub GetBytes (data As Byte())
パラメーター
- data
- Byte[]
暗号的に強力なランダム値のシーケンスで埋める配列。
例外
暗号化サービス プロバイダー (CSP) を取得できません。
data は nullです。
例
次のコード例は、 RNGCryptoServiceProvider クラスを使用して乱数を作成する方法を示しています。
//The following sample uses the Cryptography class to simulate the roll of a dice.
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
class RNGCSP
{
private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
// Main method.
public static void Main()
{
const int totalRolls = 25000;
int[] results = new int[6];
// Roll the dice 25000 times and display
// the results to the console.
for (int x = 0; x < totalRolls; x++)
{
byte roll = RollDice((byte)results.Length);
results[roll - 1]++;
}
for (int i = 0; i < results.Length; ++i)
{
Console.WriteLine("{0}: {1} ({2:p1})", i + 1, results[i], (double)results[i] / (double)totalRolls);
}
rngCsp.Dispose();
}
// This method simulates a roll of the dice. The input parameter is the
// number of sides of the dice.
public static byte RollDice(byte numberSides)
{
if (numberSides <= 0)
throw new ArgumentOutOfRangeException("numberSides");
// Create a byte array to hold the random value.
byte[] randomNumber = new byte[1];
do
{
// Fill the array with a random value.
rngCsp.GetBytes(randomNumber);
}
while (!IsFairRoll(randomNumber[0], numberSides));
// Return the random number mod the number
// of sides. The possible values are zero-
// based, so we add one.
return (byte)((randomNumber[0] % numberSides) + 1);
}
private static bool IsFairRoll(byte roll, byte numSides)
{
// There are MaxValue / numSides full sets of numbers that can come up
// in a single byte. For instance, if we have a 6 sided die, there are
// 42 full sets of 1-6 that come up. The 43rd set is incomplete.
int fullSetsOfValues = Byte.MaxValue / numSides;
// If the roll is within this range of fair values, then we let it continue.
// In the 6 sided die case, a roll between 0 and 251 is allowed. (We use
// < rather than <= since the = portion allows through an extra 0 value).
// 252 through 255 would provide an extra 0, 1, 2, 3 so they are not fair
// to use.
return roll < numSides * fullSetsOfValues;
}
}
'The following sample uses the Cryptography class to simulate the roll of a dice.
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography
Class RNGCSP
Private Shared rngCsp As New RNGCryptoServiceProvider()
' Main method.
Public Shared Sub Main()
Const totalRolls As Integer = 25000
Dim results(5) As Integer
' Roll the dice 25000 times and display
' the results to the console.
Dim x As Integer
For x = 0 To totalRolls
Dim roll As Byte = RollDice(System.Convert.ToByte(results.Length))
results((roll - 1)) += 1
Next x
Dim i As Integer
While i < results.Length
Console.WriteLine("{0}: {1} ({2:p1})", i + 1, results(i), System.Convert.ToDouble(results(i)) / System.Convert.ToDouble(totalRolls))
i += 1
End While
rngCsp.Dispose()
End Sub
' This method simulates a roll of the dice. The input parameter is the
' number of sides of the dice.
Public Shared Function RollDice(ByVal numberSides As Byte) As Byte
If numberSides <= 0 Then
Throw New ArgumentOutOfRangeException("NumSides")
End If
' Create a byte array to hold the random value.
Dim randomNumber(0) As Byte
Do
' Fill the array with a random value.
rngCsp.GetBytes(randomNumber)
Loop While Not IsFairRoll(randomNumber(0), numberSides)
' Return the random number mod the number
' of sides. The possible values are zero-
' based, so we add one.
Return System.Convert.ToByte(randomNumber(0) Mod numberSides + 1)
End Function
Private Shared Function IsFairRoll(ByVal roll As Byte, ByVal numSides As Byte) As Boolean
' There are MaxValue / numSides full sets of numbers that can come up
' in a single byte. For instance, if we have a 6 sided die, there are
' 42 full sets of 1-6 that come up. The 43rd set is incomplete.
Dim fullSetsOfValues As Integer = [Byte].MaxValue / numSides
' If the roll is within this range of fair values, then we let it continue.
' In the 6 sided die case, a roll between 0 and 251 is allowed. (We use
' < rather than <= since the = portion allows through an extra 0 value).
' 252 through 255 would provide an extra 0, 1, 2, 3 so they are not fair
' to use.
Return roll < numSides * fullSetsOfValues
End Function 'IsFairRoll
End Class
注釈
バイト配列の長さは、生成される暗号強度の高いランダム バイトの数を決定します。
このメソッドはスレッド セーフです。
こちらもご覧ください
適用対象
GetBytes(Span<Byte>)
スパンに暗号的に強力なランダム バイトを格納します。
public:
override void GetBytes(Span<System::Byte> data);
public override void GetBytes(Span<byte> data);
override this.GetBytes : Span<byte> -> unit
Public Overrides Sub GetBytes (data As Span(Of Byte))
パラメーター
適用対象
GetBytes(Byte[], Int32, Int32)
指定したバイト数の指定したインデックスから始まる、暗号的に強力なランダムな値シーケンスを指定したバイト配列に格納します。
public:
override void GetBytes(cli::array <System::Byte> ^ data, int offset, int count);
public override void GetBytes(byte[] data, int offset, int count);
override this.GetBytes : byte[] * int * int -> unit
Public Overrides Sub GetBytes (data As Byte(), offset As Integer, count As Integer)
パラメーター
- data
- Byte[]
暗号強度の高いランダム バイトで埋める配列。
- offset
- Int32
塗りつぶし操作を開始する配列のインデックス。
- count
- Int32
入力するバイト数。
例外
data は nullです。
offset または count が 0 未満です。
offset プラス count が dataの長さを超えています。