Laden...

Ver- und Entschlüsselung funktioniert nicht

Erstellt von dschenk224 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.077 Views
D
dschenk224 Themenstarter:in
14 Beiträge seit 2006
vor 12 Jahren
Ver- und Entschlüsselung funktioniert nicht

Irgendwie komme ich nicht weiter.
Zielstellung: Benutzereingabe in Form - Passwort soll gespeichert werden.
Passwort wird verschlüsselt und dann in eine Textdatei geschrieben und bei Bedarf wieder entschlüsselt.
Ich weiss, ich habe einen Fehler in der Denkweise, aber ich komme irgendiwe nicht drauf!


class CCrypt
    {
        public byte[] Crypt(string StrInput, out byte[] ByKey, out byte[] ByIV)
        {
            try
            {
                RijndaelManaged RMRijndal = new RijndaelManaged();
                ASCIIEncoding AEConvert = new ASCIIEncoding();
                byte[] ByEncrypted;
                byte[] ByToEncrypt;
                RMRijndal.GenerateKey();
                RMRijndal.GenerateIV();
                ByKey = RMRijndal.Key;
                ByIV = RMRijndal.IV;
                ICryptoTransform ICTEncryptor = RMRijndal.CreateEncryptor(ByKey, ByIV);
                MemoryStream MsEncrypt = new MemoryStream();
                CryptoStream CsEncrpyt = new CryptoStream(MsEncrypt, ICTEncryptor, CryptoStreamMode.Write);
                ByToEncrypt = AEConvert.GetBytes(StrInput);
                CsEncrpyt.Write(ByToEncrypt, 0, ByToEncrypt.Length);
                CsEncrpyt.FlushFinalBlock();
                ByEncrypted = MsEncrypt.ToArray();
                return ByEncrypted;
            }
            catch (CryptographicException e)
            {
                MessageBox.Show("A Cryptographic error occurred: {0}", e.Message);
                ByKey = null;
                ByIV = null;
                return null;
            }
            
        }


class CDecrypt
    {
        public string Decrypt(byte[] ByInput, byte[] ByKey, byte[] ByIV)
        {
            try
            {
                RijndaelManaged RMRijndal = new RijndaelManaged();
                ASCIIEncoding AEConvert = new ASCIIEncoding();
                byte[] BySource;
                ICryptoTransform ICDecryptor = RMRijndal.CreateDecryptor(ByKey, ByIV);
                MemoryStream MsDecrypt = new MemoryStream(ByInput);
                CryptoStream CsDecrypt = new CryptoStream(MsDecrypt, ICDecryptor, CryptoStreamMode.Read);
                BySource = new byte[ByInput.Length];
                CsDecrypt.Read(BySource, 0, BySource.Length);
                string StrOutput = AEConvert.GetString(BySource);
                return StrOutput;
            }
            catch (CryptographicException e)
            {
                MessageBox.Show("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }
        }

Speichern per Button mit:


private void BtSave_Click(object sender, EventArgs e)
        {
            byte[] ByKey, ByIV;
            CCrypt crypt = new CCrypt();
            ASCIIEncoding AEEncoding = new ASCIIEncoding();
            CSqlSettings settings = new CSqlSettings();
            String[] AStrSettings = new string[6];
            AStrSettings[0] = TbServername.Text;
            AStrSettings[1] = TbUsername.Text;
            AStrSettings[2] = AEEncoding.GetString(crypt.Crypt(TbPassword.Text, out ByKey, out ByIV));
            AStrSettings[3] = CbDatabase.SelectedItem.ToString();
            AStrSettings[4] = AEEncoding.GetString(ByKey);
            AStrSettings[5] = AEEncoding.GetString(ByIV);
            settings.WriteSetting(AStrSettings);
            BtCancel.Text = "Close";
            BtSave.Enabled = false;
        }

Vielen Dank für die Mühe
Daniel

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo dschenk224,

was genau geht denn nicht?

Heute scheint der Tag von [Hinweis] Wie poste ich richtig? Punkt 5 zu sein.

herbivore

D
dschenk224 Themenstarter:in
14 Beiträge seit 2006
vor 12 Jahren

Hallo herbivore,

Beim debugging springt er bei


 CsDecrypt.Read(BySource, 0, BySource.Length);

in die Exception.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo dschenk224,

hast du [Hinweis] Wie poste ich richtig? Punkt 5 gelesen? Wie lautet die Exception und die genaue Meldung? Bitte lass dir nicht alles aus der Nase ziehen.

herbivore

D
dschenk224 Themenstarter:in
14 Beiträge seit 2006
vor 12 Jahren

Hallo herbivore,
ausgelöst wird eine CryptographicException, die ich ja auch im Code angegeben habe.
Die Meldung lautet:
Padding is invalid and cannot be removed.

Das Problem ist, dass wenn ich die Encryption/Decryption ohne Zwischenspeichern in eine Textdatei ausführe, funktioniert es wunderbar, ausser, dass dem string noch bis zur Auffüllung von 16 Bit eine entsprechende Anzahl

\0

angefügt werden.

5.657 Beiträge seit 2006
vor 12 Jahren

Hi dschenk224,

ich schätze mal, das Problem liegt daran, daß du deinen MemoryStream nach dem Einlesen nicht wieder auf die Startposition zurücksetzt. Dadurch können keine Daten gelesen werden weil der Zeiger bereits am Ende des Strings steht.

Probier mal folgendes:


MemoryStream MsDecrypt = new MemoryStream(ByInput);
MsDecrypt.Position = 0;

Schöne Grüße,
Christian

Weeks of programming can save you hours of planning

D
dschenk224 Themenstarter:in
14 Beiträge seit 2006
vor 12 Jahren

Hallo Christian,
vielen Dank für deine Nachricht.
Leider hat dies nicht den erwünschten Erfolg gebracht - die Exception wird immer noch mit der selbene Fehlermeldung ausgelöst.
Viele Grüsse
Daniel

916 Beiträge seit 2008
vor 12 Jahren

Schau dir das mal an, vielleicht hilft es. Unexplained CryptographicException

Again what learned...

D
dschenk224 Themenstarter:in
14 Beiträge seit 2006
vor 12 Jahren

Hallo rollerfreak2,
vielen Dank. Zumindest die Exception wird nicht mehr ausgelöst - hab aber irgendwie noch ein komisches Ergebnis.
Ergebnis vor der Encryption und nach der Decryption ist irgendwie nicht identisch.