Longitud no válida para una matriz o cadena de caracteres Base-64

publicado por: Anonymous

Intento desencriptar los datos encriptados de un DataTable con la siguiente función.

for (int a = 0; a < dataTable.Columns.Count; a++)
{
    if (dataTable.Columns[a].DataType != typeof(String)) continue;
    for (int b = 0; b < dataTable.Rows.Count; b++)
    {
        dataTable.Rows[b][a] = SecurityProtocol.DecryptString(dataTable.Rows[b][a].ToString());
    }
}

Salida:

|      Valor Inicial     |             Encriptado           |     Desencriptado      |
|------------------------|----------------------------------|------------------------|
|"ITSC"                  |"aREOeLQEHW0="                    |"ITSC"                  |
|"Desarrollo de software"|"t28FXWcQswHA5FzQq2y8Uc3CMvdQpnQ2"|"Desarrollo de software"|
|"Técnico superior"      |"Z9PFyFnDukGzYXs"                 |   >>>> Error <<<<      |

Pero recibo un error cuando intenta desencriptar la columna "Type":
Longitud no válida para una matriz o cadena de caracteres Base-64.

Probé la función con string pero no ocurrió ningún error.

    public void DecryptStringTest()
    {
        string encriptado1 = SecurityProtocol.EncriptString("ITSC");
        string encriptado2 = SecurityProtocol.EncriptString("Desarrollo de software");
        string encriptado3 = SecurityProtocol.EncriptString("Técnico superior");

        Console.WriteLine(SecurityProtocol.DecryptString(encriptado1));
        Console.WriteLine(SecurityProtocol.DecryptString(encriptado2));
        Console.WriteLine(SecurityProtocol.DecryptString(encriptado3));            
    }

Salida:

|      Valor Inicial     |             Encriptado           |     Desencriptado      |
|------------------------|----------------------------------|------------------------|
|"ITSC"                  |"aREOeLQEHW0="                    |"ITSC"                  |
|"Desarrollo de software"|"t28FXWcQswHA5FzQq2y8Uc3CMvdQpnQ2"|"Desarrollo de software"|
|"Técnico superior"      |"Z9PFyFnDukGzYXs"                 |"Técnico superior"      |

Código de función DecryptString(string toDecrypt).

public static string DecryptString(string toDecrypt)
{
    //Error con DataRow["Type"].ToString() // Value = "Z9PFyFnDukGzYXs"
    //Longitud no válida para una matriz o cadena de caracteres Base-64
    byte[] stringInBytes = Convert.FromBase64String(toDecrypt);
    byte[] resoult = SecurityProtocol.DecryptTripleDES(stringInBytes);

    return Encoding.UTF8.GetString(resoult);
}

No tengo idea a que se debe el problema. Si fuera por el string me daría el mismo error con la prueba que hice, pero solo pasa con el DataTable. Espero que alguien me pueda ayudar.

solución

Base-64 cuenta con caracteres de relleno como ves en tu primer resultado encriptado al final tiene el caracter = pues es lo que te falta en el ultimo dato encriptado.

Posible causa:

Tu base de dato podría esta truncando caracteres revisa el tamaño del campo.

Para saber si hace falta un caracter de relleno o se cortó la cadena debes hacer lo siguiente.

if (encriptado.Length % 4 > 0);

Si se cumple esa condición tu cadena encriptada está mal o tan solo le falta el carácter de relleno.

Como ves hiciste una prueba con variables String lo que significa que el problema debe ser la cadena en la base de datos cambia el limite de los campos.

Es recomendable no poner limite a los campos en la base de datos ya que no sabremos cual será la longitud de nuestra cadena encriptada además un varchar(10) ocupa lo mismo que un varchar(max).

Ejemplo si quieren reparar la cadena:

String a="YW55IGNhcm5hbCBwbGVhc3U" ;

int b= a.length%4;

if(b!=0){

  for(int i=0; i < b; i++){
    a+="=";
  }

}

Aquí dejo esta documentación para que comprenda como se maneja Base-64: Base-64

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *