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

PasswordRecipientInfoGenerator

using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Cms { internal class PasswordRecipientInfoGenerator : RecipientInfoGenerator { private AlgorithmIdentifier keyDerivationAlgorithm; private KeyParameter keyEncryptionKey; private string keyEncryptionKeyOID; internal AlgorithmIdentifier KeyDerivationAlgorithm { set { keyDerivationAlgorithm = value; } } internal KeyParameter KeyEncryptionKey { set { keyEncryptionKey = value; } } internal string KeyEncryptionKeyOID { set { keyEncryptionKeyOID = value; } } internal PasswordRecipientInfoGenerator() { } public RecipientInfo Generate(KeyParameter contentEncryptionKey, SecureRandom random) { byte[] key = contentEncryptionKey.GetKey(); string rfc3211WrapperName = CmsEnvelopedHelper.GetRfc3211WrapperName(keyEncryptionKeyOID); IWrapper wrapper = WrapperUtilities.GetWrapper(rfc3211WrapperName); byte[] array = new byte[Platform.StartsWithIgnoreCase(rfc3211WrapperName, "DES") ? 8 : 16]; random.NextBytes(array); ParametersWithIV parameters = new ParametersWithIV(keyEncryptionKey, array); wrapper.Init(true, new ParametersWithRandom(parameters, random)); Asn1OctetString encryptedKey = new DerOctetString(wrapper.Wrap(key, 0, key.Length)); DerSequence parameters2 = new DerSequence(new DerObjectIdentifier(keyEncryptionKeyOID), new DerOctetString(array)); AlgorithmIdentifier keyEncryptionAlgorithm = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdAlgPwriKek, parameters2); return new RecipientInfo(new PasswordRecipientInfo(keyDerivationAlgorithm, keyEncryptionAlgorithm, encryptedKey)); } } }