<PackageReference Include="BouncyCastle.Cryptography" Version="2.5.1" />

CryptoApiRandomGenerator

Uses RandomNumberGenerator.Create() to get randomness generator
using System; using System.Security.Cryptography; namespace Org.BouncyCastle.Crypto.Prng { public sealed class CryptoApiRandomGenerator : IRandomGenerator, IDisposable { private readonly RandomNumberGenerator m_randomNumberGenerator; public CryptoApiRandomGenerator() : this(RandomNumberGenerator.Create()) { } public CryptoApiRandomGenerator(RandomNumberGenerator randomNumberGenerator) { if (randomNumberGenerator == null) throw new ArgumentNullException("randomNumberGenerator"); m_randomNumberGenerator = randomNumberGenerator; } public void AddSeedMaterial(byte[] seed) { } public void AddSeedMaterial(long seed) { } public void NextBytes(byte[] bytes) { m_randomNumberGenerator.GetBytes(bytes); } public void NextBytes(byte[] bytes, int start, int len) { if (start < 0) throw new ArgumentException("Start offset cannot be negative", "start"); if (start > bytes.Length - len) throw new ArgumentException("Byte array too small for requested offset and length"); if (bytes.Length == len && start == 0) NextBytes(bytes); else { byte[] array = new byte[len]; NextBytes(array); array.CopyTo(bytes, start); } } public void Dispose() { m_randomNumberGenerator.Dispose(); GC.SuppressFinalize(this); } } }