Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RNGCryptoServiceProvider in .Net Core

I cannot find the System.Security.Cryptography.RNGCryptoServiceProvider class in .NetCore.

It is essential to the application I am trying to port from .Net Framework, as it is being used to generate an initialisation vector for encryption.

Does it exist under a different name, or is there another way of achieving this functionality?

like image 371
Hughgo Avatar asked Jul 28 '16 09:07

Hughgo


People also ask

What is RNGCryptoServiceProvider in c#?

The RNGCryptoServiceProvider returns random numbers in the form of bytes, so you need a way to get a more convenient random number from it: public static int GetInt(RNGCryptoServiceProvider rnd, int max) { byte[] r = new byte[4]; int value; do { rnd.GetBytes(r); value = BitConverter.ToInt32(r, 0) & Int32.MaxValue; } ...

Is RNGCryptoServiceProvider obsolete?

RNGCryptoServiceProvider is marked as obsolete, starting in . NET 6.

What is cryptography security?

Provides cryptographic services, including secure encoding and decoding of data, as well as many other operations, such as hashing, random number generation, and message authentication.


2 Answers

System.Security.Cryptography.RandomNumberGenerator is the base class for Cryptographically-Secure Pseudo-Random Number Generator (CSPRNG) implementations. In .NET Framework RandomNumberGenerator.Create() returns an RNGCryptoServiceProvider instance (unless configured differently by CryptoConfig). In .NET Core RandomNumberGenerator.Create() returns an opaque type which is based on BCryptGenRandom (Windows) or OpenSSL's random number generator (!Windows).

RandomNumberGenerator.Create() is the only way to get an RNG instance on .NET Core, and since it works on both .NET Core and .NET Framework is the most portable.

Of course, if you're generating an IV, you can also just call the instance method SymmetricAlgorithm.GenerateIV() to have it use the CSPRNG internally; though as the documentation says, calling it is unnecessary as a random IV is created with the instance (GenerateIV can be used to force it to generate a new one before the next call to CreateEncryptor).

like image 76
bartonjs Avatar answered Sep 30 '22 14:09

bartonjs


One of the solutions suggested is to use RandomNumberGenerator.Create() https://github.com/dotnet/corefx/issues/2881

like image 35
Ivan Zaruba Avatar answered Sep 30 '22 14:09

Ivan Zaruba