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

OpenSslPbeParametersGenerator

using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System; namespace Org.BouncyCastle.Crypto.Generators { public class OpenSslPbeParametersGenerator : PbeParametersGenerator { private readonly IDigest digest; public OpenSslPbeParametersGenerator() : this(new MD5Digest()) { } public OpenSslPbeParametersGenerator(IDigest digest) { this.digest = digest; } public override void Init(byte[] password, byte[] salt, int iterationCount) { base.Init(password, salt, 1); } public virtual void Init(byte[] password, byte[] salt) { base.Init(password, salt, 1); } private byte[] GenerateDerivedKey(int bytesNeeded) { byte[] array = new byte[digest.GetDigestSize()]; byte[] array2 = new byte[bytesNeeded]; int num = 0; while (true) { digest.BlockUpdate(mPassword, 0, mPassword.Length); digest.BlockUpdate(mSalt, 0, mSalt.Length); digest.DoFinal(array, 0); int num2 = (bytesNeeded > array.Length) ? array.Length : bytesNeeded; Array.Copy(array, 0, array2, num, num2); num += num2; bytesNeeded -= num2; if (bytesNeeded == 0) break; digest.Reset(); digest.BlockUpdate(array, 0, array.Length); } return array2; } public override ICipherParameters GenerateDerivedParameters(string algorithm, int keySize) { keySize /= 8; byte[] keyBytes = GenerateDerivedKey(keySize); return ParameterUtilities.CreateKeyParameter(algorithm, keyBytes, 0, keySize); } public override ICipherParameters GenerateDerivedParameters(string algorithm, int keySize, int ivSize) { keySize /= 8; ivSize /= 8; byte[] array = GenerateDerivedKey(keySize + ivSize); return new ParametersWithIV(ParameterUtilities.CreateKeyParameter(algorithm, array, 0, keySize), array, keySize, ivSize); } public override ICipherParameters GenerateDerivedMacParameters(int keySize) { keySize /= 8; return new KeyParameter(GenerateDerivedKey(keySize), 0, keySize); } } }