2010-12-29 17 views
12

Q: enfrento la siguiente gran problema:longitud no válida para una matriz de caracteres Base-64 durante la decodificación/descifrado

de tiempo a otro i encontrar la siguiente excepción:

longitud no válido para un Base- 64 matriz de caracteres

I utilizar el cifrado y el descifrado:

public static string Encrypt(string text) 
     { 

      try 
      { 
       key = Encoding.UTF8.GetBytes(stringKey.Substring(0, 8)); 
       DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
       Byte[] byteArray = Encoding.UTF8.GetBytes(text); 
       MemoryStream memoryStream = new MemoryStream(); 
       CryptoStream cryptoStream = new CryptoStream(memoryStream,des.CreateEncryptor(key, IV), CryptoStreamMode.Write); 
       cryptoStream.Write(byteArray, 0, byteArray.Length); 
       cryptoStream.FlushFinalBlock(); 
       return Convert.ToBase64String(memoryStream.ToArray()); 
      } 

      catch (Exception ex) 
      { 
       string message = ex.Message; 
      } 

      return string.Empty; 
     } 



     public static string Decrypt(string text) 
     { 
      try 
      { 
       key = Encoding.UTF8.GetBytes(stringKey.Substring(0, 8)); 
       DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
       text = text.Replace(" ", "+") 
       Byte[] byteArray = Convert.FromBase64String(text); 
       MemoryStream memoryStream = new MemoryStream(); 
       CryptoStream cryptoStream = new CryptoStream(memoryStream, 
       des.CreateDecryptor(key, IV), CryptoStreamMode.Write); 
       cryptoStream.Write(byteArray, 0, byteArray.Length); 
       cryptoStream.FlushFinalBlock(); 
       return Encoding.UTF8.GetString(memoryStream.ToArray()); 
      } 

      catch (Exception ex) 
      { 
       string message = ex.Message; 

      } 

leí muchos artículos sobre el problema algunos mensajes que hablan de la solución es:

text = text.Replace(" ", "+") y esto no soluciona mi problema en absoluto

mi cadena es: 3DZF/NZpp0yuQ=3D por favor necesito ayuda para solucionar este problema.

EDITAR

  • Si hay alguna modificación o mejoras en esta clase para que sea trabajo mejor o más seguro o evitar cualquier posible problema de este tipo, i habrá agradecido.
  • Si hay clases alternas en lugar de esto, más seguro y no hace estos problemas , le estaré agradecido.
  • Uso esta clase en una pequeña aplicación utilizada para verificar correos.

EDIT:

Decoding the querystring values is done already when it's parsed into the Request. 

https://stackoverflow.com/a/10879400/418343

+2

Un problema común es incorrectamente pelar el relleno (signos iguales en el final) desde el final de una cuerda. En su caso, "= 3d" probablemente sea simplemente "=" o quizás "==" – EricLaw

+2

No responde su pregunta, pero esta es una forma realmente mala de encriptar - parece que está haciendo lo mismo que Gawker . Solo está utilizando los primeros 8 caracteres como una clave, y usa DES (un estándar de cifrado desactualizado) Consulte http://www.codinghorror.com/blog/2010/12/the-dirty-truth-about-web-passwords. html –

+0

Una nota al margen: 'Encoding.UTF8.GetBytes' es una forma muy mala e insegura de obtener una clave de una contraseña. –

Respuesta

17

Para resolver los problemas que necesita al puño Codificar y Decodificar la cadena de codificación base64 todo listo, dependerá de donde usarlo .

Si, por ejemplo, lo usa en la url (o consulta) donde probablemente este sea el lugar que va a utilizar, entonces debe codificar la URL antes de usarla, decodifique la url antes de recuperarla. La razón es que debe evitar mezclar los mismos caracteres que usa la URL como carácter de código, con los caracteres encriptados.

De todos modos aquí es el código que resolver su problema (y utilizo por la misma razón):

public static string encodeSTROnUrl(string thisEncode) 
{ 
    if (null == thisEncode) 
     return string.Empty; 

    return HttpUtility.UrlEncode(Encrypt(thisEncode)); 
} 


public static string decodeSTROnUrl(string thisDecode) 
{ 
    return Decrypt(HttpUtility.UrlDecode(thisDecode)); 
} 

ps Tengo el mismo problema, y ​​han tratar como usted dice sustituir el '+' y otro, pero al final esto es lo que lo hace funcionar.

No olvides eliminar text = text.Replace ("", "+"), y otras manipulaciones del cifrado de tu código, solo encripta y descifra.

+0

la cadena proviene de una cadena de consulta ... si su método aún hace lo que yo quiero hacer –

+0

@just_name, sí, la cadena de consulta tiene codificación URL. – Aristos

+0

lo siento, por favor, estoy un poco confundido, ¿me puede decir dónde llamar a estos métodos en mi código. Gracias de antemano –

-2
string imag = img; 
imag = imag.Replace("\", ""); 
int c = imag.Length % 4; 
if ((c) != 0) 
    imag = imag.PadRight((imag.Length + (4 - c)), "="); 
[] converted = Convert.FromBase64String(imag); 
using (System.IO.MemoryStream vstream = new System.IO.MemoryStream(converted)) { 
    return Image.FromStream(vstream); 
} 
Cuestiones relacionadas