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

ParametersWithID

using System; namespace Org.BouncyCastle.Crypto.Parameters { public class ParametersWithID : ICipherParameters { private readonly ICipherParameters m_parameters; private readonly byte[] m_id; public int IDLength => m_id.Length; public ICipherParameters Parameters => m_parameters; internal static ICipherParameters ApplyOptionalID(ICipherParameters parameters, byte[] id) { if (id != null) return new ParametersWithIV(parameters, id); return parameters; } public ParametersWithID(ICipherParameters parameters, byte[] id) { if (id == null) throw new ArgumentNullException("id"); m_parameters = parameters; m_id = (byte[])id.Clone(); } public ParametersWithID(ICipherParameters parameters, byte[] id, int idOff, int idLen) { if (id == null) throw new ArgumentNullException("id"); m_parameters = parameters; m_id = new byte[idLen]; Array.Copy(id, idOff, m_id, 0, idLen); } private ParametersWithID(ICipherParameters parameters, int idLength) { if (idLength < 0) throw new ArgumentOutOfRangeException("idLength"); m_parameters = parameters; m_id = new byte[idLength]; } public void CopyIDTo(byte[] buf, int off, int len) { if (m_id.Length != len) throw new ArgumentOutOfRangeException("len"); Array.Copy(m_id, 0, buf, off, len); } public byte[] GetID() { return (byte[])m_id.Clone(); } } }