RNGCryptoServiceProvider.GetBytes Method

Definition

Overloads

GetBytes(Byte[])

Fills an array of bytes with a cryptographically strong sequence of random values.

GetBytes(Span<Byte>)

Fills a span with cryptographically strong random bytes.

GetBytes(Byte[], Int32, Int32)

Fills the specified byte array with a cryptographically strong random sequence of values starting at a specified index for a specified number of bytes.

GetBytes(Byte[])

Source:
RNGCryptoServiceProvider.cs
Source:
RNGCryptoServiceProvider.cs
Source:
RNGCryptoServiceProvider.cs

Fills an array of bytes with a cryptographically strong sequence of random values.

C#
public override void GetBytes(byte[] data);

Parameters

data
Byte[]

The array to fill with a cryptographically strong sequence of random values.

Exceptions

The cryptographic service provider (CSP) cannot be acquired.

data is null.

Examples

The following code example shows how to create a random number with the RNGCryptoServiceProvider class.

C#
//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;
    }
}

Remarks

The length of the byte array determines how many cryptographically strong random bytes are produced.

This method is thread safe.

See also

Applies to

.NET 10 and other versions
Product Versions
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

GetBytes(Span<Byte>)

Source:
RNGCryptoServiceProvider.cs
Source:
RNGCryptoServiceProvider.cs
Source:
RNGCryptoServiceProvider.cs

Fills a span with cryptographically strong random bytes.

C#
public override void GetBytes(Span<byte> data);

Parameters

data
Span<Byte>

The span to fill with cryptographically strong random bytes.

Applies to

.NET 10 and other versions
Product Versions
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Standard 2.1

GetBytes(Byte[], Int32, Int32)

Source:
RNGCryptoServiceProvider.cs
Source:
RNGCryptoServiceProvider.cs
Source:
RNGCryptoServiceProvider.cs

Fills the specified byte array with a cryptographically strong random sequence of values starting at a specified index for a specified number of bytes.

C#
public override void GetBytes(byte[] data, int offset, int count);

Parameters

data
Byte[]

The array to fill with cryptographically strong random bytes.

offset
Int32

The index of the array to start the fill operation.

count
Int32

The number of bytes to fill.

Exceptions

data is null.

offset or count is less than 0.

offset plus count exceeds the length of data.

Applies to

.NET 10 and other versions
Product Versions
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Standard 2.1