14.7. A Better Random Number Generator

Problem

You need a random number with which to generate items such as a sequence of session keys. The random number must be as unpredictable as possible so that the likelihood of predicting the sequence of keys is as low as possible.

Solution

Use the classes System.Security.Cryptography.RNGCryptoServiceProvider and System.Random.

The RNGCryptoServiceProvider is used to populate a random byte array using the GetBytes method that is then printed out as a string in the following example:

public static void BetterRandomString( )
{
    // create a stronger hash code using RNGCryptoServiceProvider
    byte[] random = new byte[64];
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider( );
    // populate with random bytes
    rng.GetBytes(random);

    // convert random bytes to string
    string randomBase64 = Convert.ToBase64String(random);
    // display
    Console.WriteLine("Random string: {0}\r\n ",randomBase64);
}

Discussion

Random provides methods like Next, NextBytes, and NextDouble to generate random information for integers, arrays of bytes, and doubles, respectively. These methods can produce a moderate level of unpredictability, but to truly generate a more unpredictable random series, you would want to use the RNGCryptoServiceProvider.

RNGCryptoServiceProvider can be customized to use any of the underlying Win32 Crypto API providers by passing a CspParameters structure in the constructor to determine exactly which provider is responsible for generating the random ...

Get C# Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.