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

NtruKeyPairGenerator

using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Pqc.Crypto.Ntru.Owcpa; using Org.BouncyCastle.Pqc.Crypto.Ntru.ParameterSets; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Pqc.Crypto.Ntru { public class NtruKeyPairGenerator : IAsymmetricCipherKeyPairGenerator { private NtruKeyGenerationParameters m_keyGenParameters; private SecureRandom m_random; public void Init(KeyGenerationParameters parameters) { if (parameters == null) throw new ArgumentNullException("parameters"); m_keyGenParameters = (NtruKeyGenerationParameters)parameters; m_random = parameters.Random; } public AsymmetricCipherKeyPair GenerateKeyPair() { NtruParameters ntruParameters = m_keyGenParameters.NtruParameters; NtruParameterSet parameterSet = ntruParameters.ParameterSet; byte[] nextBytes = SecureRandom.GetNextBytes(m_random, parameterSet.SampleFgBytes()); OwcpaKeyPair owcpaKeyPair = new NtruOwcpa(parameterSet).KeyPair(nextBytes); byte[] publicKey = owcpaKeyPair.PublicKey; byte[] array = Arrays.CopyOf(owcpaKeyPair.PrivateKey, parameterSet.NtruSecretKeyBytes()); m_random.NextBytes(array, parameterSet.OwcpaSecretKeyBytes(), parameterSet.PrfKeyBytes); return new AsymmetricCipherKeyPair(new NtruPublicKeyParameters(ntruParameters, publicKey), new NtruPrivateKeyParameters(ntruParameters, array)); } } }