TwoFish implementation with Bouncy Castle After much research, I was able to implement the twofish algorithm using Bouncy Castle Portable for .NET. The code has been tested and is working perfectly, to the best of my knowledge.  But I do not know if it was well implemented and I would like someone's opinion. It would be nice to know if it is done correctly because it would be for other developers to use. Is there any improvement in security and performance that could be made? Any idea?

public class BCEngine
{
    private readonly Encoding _encoding;
    private readonly IBlockCipher _blockCipher;
    private PaddedBufferedBlockCipher _cipher;
    private IBlockCipherPadding _padding;

    public BCEngine()
    {

    }

    BCEngine(IBlockCipher blockCipher, Encoding encoding)
    {
        _blockCipher = blockCipher;
        _encoding = encoding;
    }

    #region Public Methods


    public static string TwoFishEncryption(string TextPlain, string Password, byte[] Salt)
    {
        Sha3Digest Sha3Digest = new Sha3Digest();
        Pkcs5S2ParametersGenerator gen = new Pkcs5S2ParametersGenerator(Sha3Digest);
        gen.Init(Encoding.UTF8.GetBytes(Password), Salt, 1000);
        KeyParameter param = (KeyParameter)gen.GenerateDerivedParameters(new TwofishEngine().AlgorithmName, 256);

        BCEngine bcEngine = new BCEngine(new TwofishEngine(), Encoding.UTF8);
        bcEngine.SetPadding(new Pkcs7Padding());
        return bcEngine.Encrypt(TextPlain, param);
    }

    public static string TwoFishDecryption(string TextEncripted, string Password, byte[] Salt)
    {
        Sha3Digest Sha3Digest = new Sha3Digest();
        Pkcs5S2ParametersGenerator gen = new Pkcs5S2ParametersGenerator(Sha3Digest);
        gen.Init(Encoding.UTF8.GetBytes(Password), Salt, 1000);
        KeyParameter param = (KeyParameter)gen.GenerateDerivedParameters(new TwofishEngine().AlgorithmName, 256);

        BCEngine bcEngine = new BCEngine(new TwofishEngine(), Encoding.UTF8);
        bcEngine.SetPadding(new Pkcs7Padding());
        return bcEngine.Decrypt(TextEncripted, param);
    }

    #endregion

    #region Private Methods

    void SetPadding(IBlockCipherPadding padding)
    {
        if (padding != null)
            _padding = padding;
    }

    string Encrypt(string plain, ICipherParameters SetKeyParameter)
    {
        byte[] result = BouncyCastleCrypto(true, _encoding.GetBytes(plain), SetKeyParameter);
        return Convert.ToBase64String(result);
    }

    string Decrypt(string cipher, ICipherParameters SetKeyParameter)
    {
        byte[] result = BouncyCastleCrypto(false, Convert.FromBase64String(cipher), SetKeyParameter);
        return _encoding.GetString(result, 0, result.Length);
    }

    byte[] BouncyCastleCrypto(bool forEncrypt, byte[] input, ICipherParameters SetKeyParameter)
    {
        try
        {
            _cipher = _padding == null ?
            new PaddedBufferedBlockCipher(_blockCipher) : new PaddedBufferedBlockCipher(_blockCipher, _padding);

            _cipher.Init(forEncrypt, SetKeyParameter);

            byte[] ret = _cipher.DoFinal(input);
            return ret;

        }
        catch (CryptoException ex)
        {
            // throw new CryptoException(ex);
        }
        return null;
    }

    #endregion

}
static vs instance

public BCEngine()
{

}

BCEngine(IBlockCipher blockCipher, Encoding encoding)
{
    _blockCipher = blockCipher;
    _encoding = encoding;
}


Default constructors should provide reasonable default values for the two fields initialized by the other constructor but wait... both constructors are useless because all public APIs are static. The only instance members are private methods. I can create an instance of BCEngine but I cannot do anything with it.

BCEngine bcEngine = new BCEngine(new TwofishEngine(), Encoding.UTF8);
bcEngine.SetPadding(new Pkcs7Padding());
return bcEngine.Encrypt(TextPlain, param);


But wait again.. you instantiate it to call the private instance methods. This is very inconsistent and chaotic.
You should either make everything static or everything instance.
It's ok if an instance uses private static methods as helpers but the other way around is kind of weird. At least the default constructor should be private too.
However your implementation uses private fields where two of them are not readonly so you use them to store some state but fortunately they are not static. You should remove these fields and pass the required arguments from method to method. Then you won't need any instances and the methods would be pure &lt;-- LINK.

using and disposables
You should check your code for disposable types. I'm pretty sure there are plenty of them. Encryption usually requires to dispose something.

#region
Regions are rarely necessary and for member grouping virtually never. It's easier to read the code without them.