<PackageReference Include="SSH.NET" Version="2020.0.2" />

ECKeyPairGenerator

using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters; using Renci.SshNet.Security.Org.BouncyCastle.Math; using Renci.SshNet.Security.Org.BouncyCastle.Math.EC; using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier; using Renci.SshNet.Security.Org.BouncyCastle.Security; using System; namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Generators { internal class ECKeyPairGenerator : IAsymmetricCipherKeyPairGenerator { private readonly string algorithm; private ECDomainParameters parameters; private SecureRandom random; public ECKeyPairGenerator() : this("EC") { } public ECKeyPairGenerator(string algorithm) { if (algorithm == null) throw new ArgumentNullException("algorithm"); this.algorithm = ECKeyParameters.VerifyAlgorithmName(algorithm); } public void Init(KeyGenerationParameters parameters) { if (parameters is ECKeyGenerationParameters) { ECKeyGenerationParameters eCKeyGenerationParameters = (ECKeyGenerationParameters)parameters; this.parameters = eCKeyGenerationParameters.DomainParameters; } random = parameters.Random; if (random == null) random = new SecureRandom(); } public AsymmetricCipherKeyPair GenerateKeyPair() { BigInteger n = parameters.N; int num = n.BitLength >> 2; BigInteger bigInteger; do { bigInteger = new BigInteger(n.BitLength, random); } while (bigInteger.CompareTo(BigInteger.Two) < 0 || bigInteger.CompareTo(n) >= 0 || WNafUtilities.GetNafWeight(bigInteger) < num); ECPoint q = CreateBasePointMultiplier().Multiply(parameters.G, bigInteger); return new AsymmetricCipherKeyPair(new ECPublicKeyParameters(algorithm, q, parameters), new ECPrivateKeyParameters(algorithm, bigInteger, parameters)); } protected virtual ECMultiplier CreateBasePointMultiplier() { return new FixedPointCombMultiplier(); } internal static ECPublicKeyParameters GetCorrespondingPublicKey(ECPrivateKeyParameters privKey) { ECDomainParameters eCDomainParameters = privKey.Parameters; ECPoint q = new FixedPointCombMultiplier().Multiply(eCDomainParameters.G, privKey.D); return new ECPublicKeyParameters(privKey.AlgorithmName, q, eCDomainParameters); } } }