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

Pkcs8Generator

using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Pkcs; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities.IO.Pem; using System; namespace Org.BouncyCastle.OpenSsl { public class Pkcs8Generator : PemObjectGenerator { public static readonly string PbeSha1_RC4_128 = PkcsObjectIdentifiers.PbeWithShaAnd128BitRC4.Id; public static readonly string PbeSha1_RC4_40 = PkcsObjectIdentifiers.PbeWithShaAnd40BitRC4.Id; public static readonly string PbeSha1_3DES = PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc.Id; public static readonly string PbeSha1_2DES = PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc.Id; public static readonly string PbeSha1_RC2_128 = PkcsObjectIdentifiers.PbeWithShaAnd128BitRC2Cbc.Id; public static readonly string PbeSha1_RC2_40 = PkcsObjectIdentifiers.PbewithShaAnd40BitRC2Cbc.Id; private char[] password; private string algorithm; private int iterationCount; private AsymmetricKeyParameter privKey; private SecureRandom random; public SecureRandom SecureRandom { set { random = value; } } public char[] Password { set { password = value; } } public int IterationCount { set { iterationCount = value; } } public Pkcs8Generator(AsymmetricKeyParameter privKey) { this.privKey = privKey; } public Pkcs8Generator(AsymmetricKeyParameter privKey, string algorithm) { this.privKey = privKey; this.algorithm = algorithm; iterationCount = 2048; } public PemObject Generate() { if (algorithm != null) { byte[] array = new byte[20]; random = CryptoServicesRegistrar.GetSecureRandom(random); random.NextBytes(array); try { EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = EncryptedPrivateKeyInfoFactory.CreateEncryptedPrivateKeyInfo(algorithm, password, array, iterationCount, privKey); return new PemObject("ENCRYPTED PRIVATE KEY", encryptedPrivateKeyInfo.GetEncoded()); } catch (Exception innerException) { throw new PemGenerationException("Couldn't encrypt private key", innerException); } } PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privKey); return new PemObject("PRIVATE KEY", privateKeyInfo.GetEncoded()); } } }