Rijndael criptazione si, decriptazione no

venerdì 09 gennaio 2009 - 19.22

MarvinivraM Profilo | Newbie

Ciao! sto usando visual c# e .net compact framework. Ho realizzato un sistema per criptare i dati di un login e slavarli su file. Quando tento di decriptarli all'apertura successiva del programma, ottengo un errore legato al fatto che guistamente il vettore di inizializzazione IV non è lo stesso utilizzato per criptare, poichè ne viene creato uno nuovo.
Ho provato ad utilizzare un vettore di inizializzazione arbitrario fisso come costante del programma, ma l'errore persiste..come fare?

aiedail92 Profilo | Expert

Ciao

Per quello che ci hai detto, l'errore è inspiegabile... Forse se posti il codice possiamo vedere dove è il problema.

Luca

MarvinivraM Profilo | Newbie

public int DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
{
/* return 3 = ok, lettura avvenuta correttamente
* return 1 = file vuoto o non trovato, Errore di lettura
* return 4 = errore di crittografia
* return 5 = errore di autorizzazione
*/
try
{
// Crea o apre il file specificato in FileName, ovvero path= ../login.txt
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

// Creo un nuovo oggetto Rijndael

Rijndael RijndaelAlg = Rijndael.Create();
RijndaelAlg.Key = key;
RijndaelAlg.IV = IV;


// Creo un CryptoStream relativo al file stream creato
CryptoStream cStream = new CryptoStream(fStream,RijndaelAlg.CreateDecryptor(Key, IV),CryptoStreamMode.Read);

// Creo un lettore di flusso dell'oggetto CryptoStream creato
StreamReader sReader = new StreamReader(cStream);

DataReaded = null;

try
{
// Leggo i dati dal file per decriptarli
DataReaded = sReader.ReadLine();
// Ritorna 3 se la lettura e la decriptazione sono avvenute correttamente
return 3;

}
catch (Exception e)
{
// Se il file non lo trovo o è vuoto ottengo un errore perchè fallisce il ReadLine()
MessageBox.Show(e.StackTrace);
MessageBox.Show("Errore di lettura");

string patty = (System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "/MAcheO.txt");
StreamWriter MAcheOfileStream = new StreamWriter(patty, true);
MAcheOfileStream.WriteLine(e.GetBaseException() + "\n" + e.StackTrace);
MAcheOfileStream.Close();
return 1; // file non trovato o vuoto
}

finally
{

// chiudo gli stream e il file
sReader.Close();
cStream.Close();
fStream.Close();
}

}
catch (CryptographicException e)
{
MessageBox.Show("Errore di crittografia");
string patty = (System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "/MAcheO.txt");
StreamWriter MAcheOfileStream = new StreamWriter(patty, true);
MAcheOfileStream.WriteLine(e.Message + "\n" + e.StackTrace);
MAcheOfileStream.Close();
return 4;
}
catch (UnauthorizedAccessException e)
{
MessageBox.Show("Problemi di autorizzazione");
return 5;
}

}


}

MarvinivraM Profilo | Newbie

il criptaggio con IV funziona finalmente quindi è solo un problema di questo metodo: mi lascia qualcosa che genera poi un errore di IO se tento di fare un encrypt successivo..cosa può essere? gli stream mi sembrano tutti chiusi..

aiedail92 Profilo | Expert

Ciao

Forse ho fatto appena in tempo a prendere il testo completo che avevi inserito, e penso che l'errore non sia tanto nella crittografazione con Rijndael, quanto più nella creazione dello Stream per leggere/scrivere sui file. Penso infatti che ti dia l'errore perchè cerchi di creare un file contenente caratteri non ammessi (es '/')

Prova a sostituire in tutti i blocchi try catch in questo modo:

try { //Codice... } catch(Exception ex) { //Mostra l'errore MessageBox.Show(ex.GetType().Name + "\r\n" + ex.Message)); //Altro codice... }

e dimmi che errori ti riporta con esattezza...

Luca

MarvinivraM Profilo | Newbie

Ho provato sia il criptaggio che il decriptaggio e funzionano, ma dopo una volta che funziona continua a darmi quest'errore, che dice essere legato ad EncryptTextToFile. Io non trovandolo posto codesto metodo e l'errore:
___________________________________________________________________________________________
private bool EncryptTextToFile(string Data, string path, byte[] Key, byte[] IV) {
try
{
// Apro o creo il file corrispondete al path immesso
FileStream fStream = new FileStream(path, FileMode.OpenOrCreate);

// Creo una nuova istanza della classe Rijndael
Rijndael RijndaelAlg = Rijndael.Create();
RijndaelAlg.Key = key;
RijndaelAlg.IV = IV;

// Creo un CryptoStream usando il FileStrema appena dichiarato, Key e IV
CryptoStream cStream = new CryptoStream(fStream,RijndaelAlg.CreateEncryptor(Key, IV),CryptoStreamMode.Write);

// Creo uno StreamWriter usando il CryptoStream creato
StreamWriter sWriter = new StreamWriter(cStream);

try
{
// Scrivo i dati sullo stream per crittografarli
sWriter.WriteLine(Data);
return true;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
// Resetto i valori di autenticazione, Username e Password nonostante corretti
this.setIsAuthenticated(false);
this.setUsernameAndPassword("", "");
return false;
}
finally
{
// Chiudo gli stream e il file
sWriter.Close();
cStream.Close();
fStream.Close();
}


}
catch (CryptographicException e)
{
// Operazione di crittografia non riuscita
MessageBox.Show("Errore di crittografia");
// Resetto i valori di autenticazione, Username e Password nonostante corretti
this.setIsAuthenticated(false);
this.setUsernameAndPassword("", "");
return false;
}
catch (UnauthorizedAccessException e)
{
// Problemi di apertura del file
MessageBox.Show("Problemi di autorizzazione");
// Resetto i valori di autenticazione, Username e Password nonostante corretti
this.setIsAuthenticated(false);
this.setUsernameAndPassword("", "");
return false;
}
}
______________________________________________________________________________________________________

DA NOTARE CHE LA PRIMA VOLTA SALVA CORRETTAMENTE USER E PASSWORD CRIPTATI E IL DECRIPTAGGIO FUNZIONA, SOLO CHE QUANDO IL DECRIPTAGGIO VA AD APRIRE IL FILE SECONDO ME DA UN ERRORE IN LETTURA....

System.IO.IOException: Impossibile visualizzare un messaggio di errore. Non è stato trovato l'assembly della risorsa facoltativo che lo contiene
in System.IO.__Error.WinIOError()
in System.IO.FileStream..ctor()
in System.IO.FileStream..ctor()
in Navigatore.UserManager.EncryptTextToFile()
in Navigatore.UserManager.DataEncrypt()
in Navigatore.UserManager.tryUserAuthentication()
in Navigatore.FormLogin.menuItem2_Click()
in System.Windows.Forms.MenuItem.OnClick()
in System.Windows.Forms.Menu.ProcessMnuProc()
in System.Windows.Forms.Form.WnProc()
in System.Windows.Forms.Control._InternalWnProc()
in Microsoft.AGL.Forms.EVL.EnterModalDialog()
in System.Windows.Forms.Form.ShowDialog()
in Navigatore.Program.Main()

in System.IO.__Error.WinIOError()
in System.IO.FileStream..ctor()
in System.IO.FileStream..ctor()
in Navigatore.UserManager.EncryptTextToFile()
in Navigatore.UserManager.DataEncrypt()
in Navigatore.UserManager.tryUserAuthentication()
in Navigatore.FormLogin.menuItem2_Click()
in System.Windows.Forms.MenuItem.OnClick()
in System.Windows.Forms.Menu.ProcessMnuProc()
in System.Windows.Forms.Form.WnProc()
in System.Windows.Forms.Control._InternalWnProc()
in Microsoft.AGL.Forms.EVL.EnterModalDialog()
in System.Windows.Forms.Form.ShowDialog()
in Navigatore.Program.Main()

MarvinivraM Profilo | Newbie

L'errore è sempre questo ma al primo utilizzo sembra funzionare tutto: dev'essere un problema legato allo stream, perchè i problemi nascono solo dopo i primi tentativi dopo aver riavviato il telefono. Quindi direi proprio che ci sia uno stream aperto che impedisca di aprire il file e ritorna un errore come se fosse già aperto...può essere? HELP :(

Errore di cript:

IOException

in System.IO.__Error.WinIOError()
in System.IO.FileStream..ctor()
in System.IO.FileStream..ctor()
in Navigatore.UserManager.EncryptTextToFile()
in Navigatore.UserManager.DataEncrypt()
in Navigatore.UserManager.tryUserAuthentication()
in Navigatore.FormLogin.menuItem2_Click()
in System.Windows.Forms.MenuItem.OnClick()
in System.Windows.Forms.Menu.ProcessMnuProc()
in System.Windows.Forms.Form.WnProc()
in System.Windows.Forms.Control._InternalWnProc()
in Microsoft.AGL.Forms.EVL.EnterModalDialog()
in System.Windows.Forms.Form.ShowDialog()
in Navigatore.Program.Main()

MarvinivraM Profilo | Newbie

aggiornamento hahaha sto impazzendo:

allora: scrive bene i dati di login criptati,ma quando vado a leggerli mi va in "errore di lettura" con il seguente motivo:

Errore di lettura:

CryptographicException

in System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock()
in System.Security.Cryptography.CryptoStream.Read()
in System.IO.StreamReader.ReadBuffer()
in System.IO.StreamReader.ReadLine()
in Navigatore.UserManager.DecryptTextFromFile()
in Navigatore.UserManager.UserAuthentication()
in Navigatore.Program.Main()

Errore di crittografia (decript):

CryptographicException

in System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock()
in System.Security.Cryptography.CryptoStream.FlushFinalBlock()
in System.Security.Cryptography.CryptoStream.Dispose()
in System.IO.Stream.Close()
in System.IO.StreamReader.Dispose()
in System.IO.StreamReader.Close()
in Navigatore.UserManager.DecryptTextFromFile()
in Navigatore.UserManager.UserAuthentication()
in Navigatore.Program.Main()

aiedail92 Profilo | Expert

Più che altro mi sembra che stia cercando di usare uno Stream chiuso... Comunque adesso provo a spolverare il codice e ti dico cosa trovo

Luca

aiedail92 Profilo | Expert

Dunque, a parte il fatto che ovviamente mi dice "server irraggiungibile" e che non posso usare la variabile "path" come la hai impostata tu (l'ho modificaata su un file fisso), per il resto non ho nessun errore...

Se ti è possibile inviarmi il progetto, con le indicazioni delle righe che ti generano l'errore, posso cercare di vedere qual è il problema.

Luca

MarvinivraM Profilo | Newbie

Il problema era in una non chiusura dello stream di controllo: se la streamread dava errore, controllavo usando una streamwrite sul file, e se falliva anch'essa significava che il file era aperto da windows (e quindi non lo apriva), altrimenti significava semplicemente che non esisteva.
Ciao e grazie per le risposte ;)
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5