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

DsaKeyPairGenerator

using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC.Multiplier; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Crypto.Generators { public class DsaKeyPairGenerator : IAsymmetricCipherKeyPairGenerator { private static readonly BigInteger One = BigInteger.One; private DsaKeyGenerationParameters param; public void Init(KeyGenerationParameters parameters) { if (parameters == null) throw new ArgumentNullException("parameters"); param = (DsaKeyGenerationParameters)parameters; } public AsymmetricCipherKeyPair GenerateKeyPair() { DsaParameters parameters = param.Parameters; BigInteger x = GeneratePrivateKey(parameters.Q, param.Random); return new AsymmetricCipherKeyPair(new DsaPublicKeyParameters(CalculatePublicKey(parameters.P, parameters.G, x), parameters), new DsaPrivateKeyParameters(x, parameters)); } private static BigInteger GeneratePrivateKey(BigInteger q, SecureRandom random) { int num = q.BitLength >> 2; BigInteger bigInteger; do { bigInteger = BigIntegers.CreateRandomInRange(One, q.Subtract(One), random); } while (WNafUtilities.GetNafWeight(bigInteger) < num); return bigInteger; } private static BigInteger CalculatePublicKey(BigInteger p, BigInteger g, BigInteger x) { return g.ModPow(x, p); } } }