Generate Random Numbers in .NET using RNGCryptoServiceProvider

I have written a couple of posts in the past about generating random numbers in .NET. Generating a random number is as simple as doing the following:

static void Main(string[] args)
{
// code from DevCurry.com
byte[] randomBytes = new byte[4];
Random rando = new Random();
rando.NextBytes(randomBytes);
foreach (byte byteValue in randomBytes)
Console.Write("{0, 4}", byteValue);

Console.ReadLine();
}

The Random class generates pseudo random numbers, based on a seed value. It uses the system clock to generate its seed value. However we were working on a security API and needed an algorithm with a more sophisticated seed value to generate cryptographically secure random numbers. Here’s how we did it using the RNGCryptoServiceProvider class:

static void Main(string[] args)
{
// code from DevCurry.com
byte[] randomBytes = new byte[4];
RNGCryptoServiceProvider rngCrypto =
new RNGCryptoServiceProvider();

rngCrypto.GetBytes(randomBytes);
Int32 rngNum = BitConverter.ToInt32(randomBytes, 0);

Console.WriteLine(rngNum);

Console.ReadLine();
}

The RNGCryptoServiceProvider uses a combination of OS counters, processing info etc. to generate random numbers. Here the GetBytes() fills an array of bytes with a cryptographically strong sequence of random values.

OUTPUT (random)

1187354021

Note: You cannot run a foreach loop here as you did above, since foreach cannot operate on variables of the RNGCryptoServiceProvider as it does not expose GetEnumerator.

Will you give this article a +1 ? Thanks in advance


About The Author

Suprotim Agarwal
Suprotim Agarwal, ASP.NET Architecture MVP (Microsoft Most Valuable Professional) works as an Architect Consultant and provides consultancy on how to design and develop Web applications.

Suprotim is also the founder and primary contributor to DevCurry, DotNetCurry and SQLServerCurry. He is the Editor of a Developer Magazine called DNC Magazine. He has also written two EBooks 51 Recipes using jQuery with ASP.NET Controls. and The Absolutely Awesome jQuery CookBook

Follow him on twitter @suprotimagarwal

No comments: