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

CryptoApiEntropySourceProvider

using System; using System.Security.Cryptography; namespace Org.BouncyCastle.Crypto.Prng { public class CryptoApiEntropySourceProvider : IEntropySourceProvider { private class CryptoApiEntropySource : IEntropySource { private readonly RandomNumberGenerator mRng; private readonly bool mPredictionResistant; private readonly int mEntropySize; bool IEntropySource.IsPredictionResistant { get { return mPredictionResistant; } } int IEntropySource.EntropySize { get { return mEntropySize; } } internal CryptoApiEntropySource(RandomNumberGenerator rng, bool predictionResistant, int entropySize) { mRng = rng; mPredictionResistant = predictionResistant; mEntropySize = entropySize; } byte[] IEntropySource.GetEntropy() { byte[] array = new byte[(mEntropySize + 7) / 8]; mRng.GetBytes(array); return array; } } private readonly RandomNumberGenerator mRng; private readonly bool mPredictionResistant; public CryptoApiEntropySourceProvider() : this(RandomNumberGenerator.Create(), true) { } public CryptoApiEntropySourceProvider(RandomNumberGenerator rng, bool isPredictionResistant) { if (rng == null) throw new ArgumentNullException("rng"); mRng = rng; mPredictionResistant = isPredictionResistant; } public IEntropySource Get(int bitsRequired) { return new CryptoApiEntropySource(mRng, mPredictionResistant, bitsRequired); } } }