Erro ao descriptografar string

21/01/2015

Eu tenho um método para criptografar e descriptografar dados. Testei no Console Application e o mesmo funciona perfeitamente. Ao levar este método para o controller, eu recebo seguinte erro:

Comprimento inválido para uma matriz ou uma cadeia de caracteres de Base 64.


Isso ocorre quando eu coloco uma string grande para descriptografar(acima de 30caracteres +/-). Porém, necessito trafegar uma string bem maior( criptografada).
Não entendo porque no Consolle Application funciona e no MVC( controller), recebo esse
Meu método para criptografar e descriptografar:

public class Criptografia : ICriptografia
    {

        public Criptografia()
        {
        }


        // Essa seqüência constante é usada como um valor "salt" para as chamadas de função PasswordDeriveBytes .
        // Este tamanho da IV (em bytes) devem = (KeySize / 8). KeySize padrão é 256, portanto, a IV deve ser
        // 32 bytes de comprimento. Usando uma seqüência de 16 caracteres aqui nos dá 32 bytes quando convertido para um array de bytes.
        private static readonly byte[] initVectorBytes = Encoding.ASCII.GetBytes("tu89geji340t89u2");

        // Esta constante é utilizado para determinar o tamanho da chave do algoritmo de encriptação.
        private const int keysize = 256;
        const string senha = "exemplo";


        public static string _Encrypt(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToEncrypt = UTF8.GetBytes(Message);
            try
            {
                ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return Convert.ToBase64String(Results);
        }


        public string Encrypt(string Message)
        {
            return Criptografia._Encrypt(Message);
        }


        public static string _Decrypt(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToDecrypt = Convert.FromBase64String(Message);
            try
            {
                ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return UTF8.GetString(Results);
        }


        public  string Decrypt(string Message)
        {
           return Criptografia._Decrypt(Message);
        }

    }
}


A forma que utilizo em meu Controller:
public ActionResult Dependente(string name)
    {
        Criptografia cr= new Criptografia();   
        string nome = Request.QueryString["name"];

        string nomeDescrypt = cr.Decrypt(nome);
        var dependente =
            dependenteRepository.Dependentes.Where(r => r.sLogin == nomeDescrypt).ToList();
        return View(dependente);

    }


Pelo erro, me fala que o comprimento é inválido para base64, porém não entendo porque funciona no console e não no controller.

Randrade

Respostas

21/06/2017

Ezequielsd Currículo

Eu tenho um método para criptografar e descriptografar dados. Testei no Console Application e o mesmo funciona perfeitamente. Ao levar este método para o controller, eu recebo seguinte erro:
Comprimento inválido para uma matriz ou uma cadeia de caracteres de Base 64.
Isso ocorre quando eu coloco uma string grande para descriptografar(acima de 30caracteres +/-). Porém, necessito trafegar uma string bem maior( criptografada). Não entendo porque no Consolle Application funciona e no MVC( controller), recebo esse Meu método para criptografar e descriptografar:
public class Criptografia : ICriptografia
    {

        public Criptografia()
        {
        }


        // Essa seqüência constante é usada como um valor "salt" para as chamadas de função PasswordDeriveBytes .
        // Este tamanho da IV (em bytes) devem = (KeySize / 8). KeySize padrão é 256, portanto, a IV deve ser
        // 32 bytes de comprimento. Usando uma seqüência de 16 caracteres aqui nos dá 32 bytes quando convertido para um array de bytes.
        private static readonly byte[] initVectorBytes = Encoding.ASCII.GetBytes("tu89geji340t89u2");

        // Esta constante é utilizado para determinar o tamanho da chave do algoritmo de encriptação.
        private const int keysize = 256;
        const string senha = "exemplo";


        public static string _Encrypt(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToEncrypt = UTF8.GetBytes(Message);
            try
            {
                ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return Convert.ToBase64String(Results);
        }


        public string Encrypt(string Message)
        {
            return Criptografia._Encrypt(Message);
        }


        public static string _Decrypt(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToDecrypt = Convert.FromBase64String(Message);
            try
            {
                ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return UTF8.GetString(Results);
        }


        public  string Decrypt(string Message)
        {
           return Criptografia._Decrypt(Message);
        }

    }
}
A forma que utilizo em meu Controller:
public ActionResult Dependente(string name)
    {
        Criptografia cr= new Criptografia();   
        string nome = Request.QueryString["name"];

        string nomeDescrypt = cr.Decrypt(nome);
        var dependente =
            dependenteRepository.Dependentes.Where(r => r.sLogin == nomeDescrypt).ToList();
        return View(dependente);

    }
Pelo erro, me fala que o comprimento é inválido para base64, porém não entendo porque funciona no console e não no controller.


Como resolveu este problema, tenho um semelhante?
Responder Citar