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

Pkcs12ParametersGenerator

using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System; namespace Org.BouncyCastle.Crypto.Generators { public class Pkcs12ParametersGenerator : PbeParametersGenerator { public const int KeyMaterial = 1; public const int IVMaterial = 2; public const int MacMaterial = 3; private readonly IDigest digest; private readonly int u; private readonly int v; public Pkcs12ParametersGenerator(IDigest digest) { this.digest = digest; u = digest.GetDigestSize(); v = digest.GetByteLength(); } private void Adjust(byte[] a, int aOff, byte[] b) { int num = (b[b.Length - 1] & 255) + (a[aOff + b.Length - 1] & 255) + 1; a[aOff + b.Length - 1] = (byte)num; num = (int)((uint)num >> 8); for (int num2 = b.Length - 2; num2 >= 0; num2--) { num += (b[num2] & 255) + (a[aOff + num2] & 255); a[aOff + num2] = (byte)num; num = (int)((uint)num >> 8); } } private byte[] GenerateDerivedKey(int idByte, int n) { byte[] array = new byte[v]; byte[] array2 = new byte[n]; for (int i = 0; i != array.Length; i++) { array[i] = (byte)idByte; } byte[] array3; if (mSalt != null && mSalt.Length != 0) { array3 = new byte[v * ((mSalt.Length + v - 1) / v)]; for (int j = 0; j != array3.Length; j++) { array3[j] = mSalt[j % mSalt.Length]; } } else array3 = new byte[0]; byte[] array4; if (mPassword != null && mPassword.Length != 0) { array4 = new byte[v * ((mPassword.Length + v - 1) / v)]; for (int k = 0; k != array4.Length; k++) { array4[k] = mPassword[k % mPassword.Length]; } } else array4 = new byte[0]; byte[] array5 = new byte[array3.Length + array4.Length]; Array.Copy(array3, 0, array5, 0, array3.Length); Array.Copy(array4, 0, array5, array3.Length, array4.Length); byte[] array6 = new byte[v]; int num = (n + u - 1) / u; byte[] array7 = new byte[u]; for (int l = 1; l <= num; l++) { digest.BlockUpdate(array, 0, array.Length); digest.BlockUpdate(array5, 0, array5.Length); digest.DoFinal(array7, 0); for (int m = 1; m != mIterationCount; m++) { digest.BlockUpdate(array7, 0, array7.Length); digest.DoFinal(array7, 0); } for (int num2 = 0; num2 != array6.Length; num2++) { array6[num2] = array7[num2 % array7.Length]; } for (int num3 = 0; num3 != array5.Length / v; num3++) { Adjust(array5, num3 * v, array6); } if (l == num) Array.Copy(array7, 0, array2, (l - 1) * u, array2.Length - (l - 1) * u); else Array.Copy(array7, 0, array2, (l - 1) * u, array7.Length); } return array2; } public override ICipherParameters GenerateDerivedParameters(string algorithm, int keySize) { keySize /= 8; byte[] keyBytes = GenerateDerivedKey(1, keySize); return ParameterUtilities.CreateKeyParameter(algorithm, keyBytes, 0, keySize); } public override ICipherParameters GenerateDerivedParameters(string algorithm, int keySize, int ivSize) { keySize /= 8; ivSize /= 8; byte[] keyBytes = GenerateDerivedKey(1, keySize); KeyParameter parameters = ParameterUtilities.CreateKeyParameter(algorithm, keyBytes, 0, keySize); byte[] iv = GenerateDerivedKey(2, ivSize); return new ParametersWithIV(parameters, iv, 0, ivSize); } public override ICipherParameters GenerateDerivedMacParameters(int keySize) { keySize /= 8; return new KeyParameter(GenerateDerivedKey(3, keySize), 0, keySize); } } }