public Gost_28147_89_CryptoTransform(
            ProviderType providerType,
            SafeKeyHandleImpl keyHandle,
            Dictionary <int, object> keyParameters,
            PaddingMode paddingValue,
            CipherMode modeValue,
            int blockSizeValue,
            Gost_28147_89_CryptoTransformMode transformMode)
        {
            _providerType      = providerType;
            _keyHandle         = keyHandle;
            _paddingValue      = paddingValue;
            _isStreamModeValue = (modeValue == CipherMode.OFB) || (modeValue == CipherMode.CFB);
            _blockSizeValue    = blockSizeValue;
            _transformMode     = transformMode;

            // Установка параметров ключа

            foreach (var keyParameter in keyParameters)
            {
                var keyParameterId    = keyParameter.Key;
                var keyParameterValue = keyParameter.Value;

                // Копирование значения параметра

                if (keyParameterValue is byte[])
                {
                    var keyParamValueBytes     = (byte[])keyParameterValue;
                    var copyKeyParamValueBytes = new byte[keyParamValueBytes.Length];
                    Array.Copy(keyParamValueBytes, copyKeyParamValueBytes, keyParamValueBytes.Length);

                    keyParameterValue = copyKeyParamValueBytes;
                }
                else if (keyParameterValue is int)
                {
                    keyParameterValue = (int)keyParameterValue;
                }
                else if (keyParameterValue is CipherMode)
                {
                    keyParameterValue = Convert.ToInt32(keyParameterValue);
                }
                else if (keyParameterValue is PaddingMode)
                {
                    keyParameterValue = Convert.ToInt32(keyParameterValue);
                }

                // Установка значения параметра

                switch (keyParameterId)
                {
                case Constants.KP_IV:
                {
                    _ivValue = (byte[])keyParameterValue;

                    var iv = _ivValue;
                    CryptoApiHelper.SetKeyParameter(_keyHandle, keyParameterId, iv);
                }
                break;

                case Constants.KP_MODE:
                {
                    CryptoApiHelper.SetKeyParameterInt32(_keyHandle, keyParameterId, (int)keyParameterValue);
                }
                break;

                case Constants.KP_PADDING:
                {
                    if (!providerType.IsVipNet())
                    {
                        CryptoApiHelper.SetKeyParameterInt32(_keyHandle, keyParameterId, (int)keyParameterValue);
                    }
                }
                break;
                }
            }
        }
        private ICryptoTransform CreateCryptoTransform(SafeKeyHandleImpl hKey, byte[] iv, Gost_28147_89_CryptoTransformMode transformMode)
        {
            // TODO: Refactor this!
            // NOTE: The params order is important!

            if (hKey == null)
            {
                hKey = CryptoApiHelper.GenerateKey(CryptoApiHelper.GetProviderHandle(ProviderType), Constants.CALG_G28147, CspProviderFlags.NoFlags);
            }

            var keyParameters = new Dictionary <int, object>();

            if (ModeValue == CipherMode.CTS)
            {
                throw ExceptionUtility.CryptographicException(Resources.CipherTextSteamingNotSupported);
            }

            if ((Padding != PaddingMode.None) && ((ModeValue == CipherMode.OFB) || (ModeValue == CipherMode.CFB)))
            {
                throw ExceptionUtility.CryptographicException(Resources.InvalidPaddingMode);
            }

            // Установка KP_MODE
            keyParameters.Add(Constants.KP_MODE, ModeValue);

            // Установка KP_PADDING
            keyParameters.Add(Constants.KP_PADDING, Constants.ZERO_PADDING);

            if ((ModeValue == CipherMode.CFB) && (FeedbackSizeValue != DefaultFeedbackSize))
            {
                throw ExceptionUtility.CryptographicException(Resources.IncorrectFeedbackSize);
            }

            // Установка KP_IV
            if (ModeValue != CipherMode.ECB)
            {
                if (iv == null)
                {
                    iv = new byte[DefaultIvSize];
                    CryptoApiHelper.GetRandomNumberGenerator(ProviderType).GetBytes(iv);
                }

                if (iv.Length < DefaultIvSize)
                {
                    throw ExceptionUtility.CryptographicException(Resources.InvalidIvSize);
                }

                keyParameters.Add(Constants.KP_IV, iv);
            }

            return(new Gost_28147_89_CryptoTransform(ProviderType, hKey, keyParameters, PaddingValue, ModeValue, BlockSizeValue, transformMode));
        }