Decriptazione con algoritmo Rijndael

lunedì 04 agosto 2008 - 16.28

gemini81 Profilo | Newbie

Ciao a tutti!

Io ho un problema con la decriptazione utilizzando l'algoritmo Rijndael,

con questo codice


public static string DecryptString(string src) { if (src != String.Empty) { RijndaelManaged rjm = new RijndaelManaged(); rjm.KeySize = 128; rjm.BlockSize = 128; rjm.Key = Classes.Impostazioni.RijndaelKey; rjm.IV = Classes.Impostazioni.RijndaelIV; try { ICryptoTransform ct = rjm.CreateDecryptor(); Byte[] input = Encoding.UTF8.GetBytes(src); Byte[] output = ct.TransformFinalBlock(input, 0, input.Length); return Encoding.UTF8.GetString(output); } catch ( System.Exception ex ) { return src; } } return src; }

l'istruzione ct.TransformFinalBlock mi lancia l'eccezione
System.Security.Cryptography.CryptographicException
con il seguente messaggio:
Il riempimento non è valido e non può essere rimosso.

Come posso fare?

aiedail92 Profilo | Expert

Ciao

La funzione che hai scritto di per sé è corretta, ma secondo me c'è un problema di fondo. Quando codifichi una stringa in input, il risultato codificato non può sempre essere scritto sotto forma di stringa come output, perchè potrebbe contenere valori con caratteri non validi. Per risolvere il problema, modifica la funzione che hai scritto per codificare la stringa in entrata in modo che restituisca un array di byte invece che una stringa (array di byte che ottieni direttamente da TransformFinalBlock), e modifica la funzione di decodifica per accettare come parametro lo stesso array di byte che hai ottenuto dalla decodifica della stringa. Più o meno dovresti ottenere due funzioni così:

public static byte[] EncryptString(string src) { if (src != null) { RijndaelManaged rjm = new RijndaelManaged(); rjm.KeySize = 128; rjm.BlockSize = 128; rjm.Key = Classes.Impostazioni.RijndaelKey; rjm.IV = Classes.Impostazioni.RijndaelIV; try { ICryptoTransform ct = rjm.CreateEncryptor(); Byte[] input = Encoding.UTF8.GetBytes(src); Byte[] output = ct.TransformFinalBlock(input, 0, input.Length); return output; } catch (System.Exception ex) { return null; } } return null; } public static string DecryptString(byte[] src) { if (src != null) { RijndaelManaged rjm = new RijndaelManaged(); rjm.KeySize = 128; rjm.BlockSize = 128; rjm.Key = Classes.Impostazioni.RijndaelKey; rjm.IV = Classes.Impostazioni.RijndaelIV; try { ICryptoTransform ct = rjm.CreateDecryptor(); Byte[] output = ct.TransformFinalBlock(src, 0, src.Length); return Encoding.UTF8.GetString(output); } catch (System.Exception ex) { return null; } } return null; }

Luca

gemini81 Profilo | Newbie

Ciao,

ho risolto il tutto utilizzando la codifica Unicode anzichè UTF8.

Il problema sta nel fatto che questa riga di codice

byte[] destination = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(origin));

non funziona come ci si aspetta. Infatti destination e origin sono completamente diversi ( anche nella lunghezza ).
Invertendo le due funzioni invece tutto funziona correttamente.

Misteri di .NET
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5