C# - Catch Exception in public byte[]


#1
Hallo. Ich habe ein Problem. Ich hatte ein Programm erstellt das Daten sicher verschlüsseln und entschlüsseln kann. Nun ist das Problem das wenn man beim entschlüsseln ein falsches Password eingibt, sich das Fenster des Just-In-Time Debuggers öffnet, man halt sieht was ungefähr los ist und ob man das Programm beenden möchte oder weiterlaufen lässt.

Ich finde dieses Pop-Up Meldung nicht so schön und nur weil man ein falsches Password eingibt?

Ich weiß das man den Code in try { .... } geben can und dann catch (CryptographyException...) { ..... } geben kann, aber dann bekomme ich die Meldung in Visual Studio die Nachricht, das nicht alles einen Wert zurück gibt in AES_Decrypt. Hier der Code:

Code:
public byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            
                byte[] decryptedBytes = null;
                byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
     
                using (MemoryStream ms = new MemoryStream())
                {
                    using (RijndaelManaged AES = new RijndaelManaged())
                    {

                        AES.KeySize = 256;
                        AES.BlockSize = 128;

                        var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                        AES.Key = key.GetBytes(AES.KeySize / 8);
                        AES.IV = key.GetBytes(AES.BlockSize / 8);

                        AES.Mode = CipherMode.CBC;

                        using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                            cs.Close();
                        }
                        decryptedBytes = ms.ToArray();
                    }
                }
                return decryptedBytes;
        }
Wie kann ich es machen das CryptographyException... abgefangen wird und mit einer MessageBox ausgegeben wird?
Normal klappt es ja mit try-catch aber nicht hier da es sonst wieder heißt das nicht alles im Code einen Wert zurück gibt :/

Danke!
 

Spyke

Capoeirista
Premium-User
#2
Wolltest du den Try Catch mit der MessageBox in der gezeigten Methoden machen?
Unschön, diese Methode soll ja Daten liefern, Fehlermeldungen am besten immer bis zu UI durchgeben (soweit möglich) und dort die Fehelrmeldung dann anzeigen.

Und wenn catch nicht selbst eine Exception auslöst/weiterreicht, ist dies Quasy ein normaler Block im Programmablauf, der aus gelöst wird, bei einem Fehlerfall im try Block.
Sprich in deinem catch Block müsstest du dann auch einen Returnwert angeben.

(Laut deiner Fehleraussage fehlt wohl einfach der Returnwert der Methode)

P.S.: Für genauere Aussagen müssten man sehen wie des vorhattest.
 
#4
Okay es hat jetzt klappt. Ich habe ganz normal das mit try und catch wieder versucht und mit return gebastelt und jetzt klappt es.

Code:
public byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            try{
                byte[] decryptedBytes = null;
                byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
    
                using (MemoryStream ms = new MemoryStream())
                {
                    using (RijndaelManaged AES = new RijndaelManaged())
                    {

                        AES.KeySize = 256;
                        AES.BlockSize = 128;

                        var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                        AES.Key = key.GetBytes(AES.KeySize / 8);
                        AES.IV = key.GetBytes(AES.BlockSize / 8);

                        AES.Mode = CipherMode.CBC;

                        using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                            cs.Close();
                        }
                        decryptedBytes = ms.ToArray();
                    }
                }
                return decryptedBytes;
               }
               catch {}
               return AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes);
        }