2010-12-29 16 views
12

D: affrontare il seguente grosso problema:lunghezza non valida per una base 64 char durante la decodifica/decrittografia

di volta in un'altra trovo l'eccezione seguente:

lunghezza non valida per un Base- 64 array di caratteri

io uso di crittografia e decrittografia:

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; 

      } 

ho letto molti articoli sul problema alcuni post che parlano la soluzione è:

text = text.Replace(" ", "+") e questo non risolve il mio problema a tutti

mia stringa è: 3DZF/NZpp0yuQ=3D favore ho bisogno di aiuto per risolvere questo problema.

EDIT

  • Se ci sono eventuali modifiche o miglioramenti a questa classe per renderlo lavoro migliore o più sicuro o evitare eventuali problemi come questo, i sarà grato.
  • Se ci sono classi alternative invece di questo, più protetto e non si rendono questi problemi , sarò grato.
  • Io uso questa classe in una piccola applicazione utilizzata per verificare la posta.

EDIT:

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

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

+2

Un problema comune consiste nel rimuovere in modo errato il riempimento (segni di uguale lunghezza) dalla fine di una stringa. Nel tuo caso "= 3d" è probabile che sia semplicemente "=" o forse "==" – EricLaw

+2

Non risponde alla tua domanda, ma questo è un modo davvero pessimo di crittografia - sembra che tu stia facendo la stessa cosa di gawker . Stai usando solo i primi 8 caratteri come chiave e usando DES (uno standard di crittografia obsoleto) Vedi http://www.codinghorror.com/blog/2010/12/the-dirty-truth-about-web-passwords. html –

+0

Una nota a margine: 'Encoding.UTF8.GetBytes' è un modo molto brutto e pericoloso per ottenere una chiave da una password. –

risposta

17

Per risolvere i problemi è necessario pugno Encode e poi Decodifica il tutto stringa di codifica-base64 pronto, dipende da dove si usarlo .

Se ad esempio lo si utilizza su url (o query) dove probabilmente questo è il posto che si intende utilizzare, è necessario codificare l'URL prima di utilizzarlo, decodificare l'url prima di ripristinarlo. Il motivo è che devi evitare di mescolare gli stessi caratteri che l'URL usa come codice, con i caratteri cifrati.

Comunque qui è il codice che risolve il problema (e io uso per lo stesso motivo):

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 Ho lo stesso problema, e hanno provare come dici tu sostituire il '+' e altro, ma alla fine è questo che lo fa funzionare.

Non dimenticare di rimuovere text = text.Replace ("", "+") e altre manipolazioni della crittografia dal codice, solo crittografare e decodificare.

+0

la stringa proviene da una stringa di query..è il tuo metodo continua a fare ciò che voglio fare –

+0

@just_name, sì la stringa di query è codificata URL. – Aristos

+0

scusa, per favore sono confuso poco, puoi dirmi dove chiamare questi metodi nel mio codice.grazie in anticipo –

-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); 
} 
Problemi correlati