Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Trotz Verwendung von CryptoStream stehen die Daten zusätzlich unverschlüsselt in der Datei
dott
myCSharp.de - Member



Dabei seit:
Beiträge: 50

Themenstarter:

Trotz Verwendung von CryptoStream stehen die Daten zusätzlich unverschlüsselt in der Datei

beantworten | zitieren | melden

Hallo,
ich versuche gerade ein Filestream zu verschlüsseln, das scheint auch zum Teil zu funtionieren. allerdings sind die Daten einmal verschlüsselt und unverschlüsselt in der Datei.


namespace WindowsFormsApplication1
{
    
        [Serializable]
        class Config
        {

            
             public Config(string ip, string port, string benutzer, string passwort)
            {
                Ip = ip;
                Port = port;
                Benutzer = benutzer;
                Passwort = passwort;
            }

            public string Ip { get; set; }
            public string Port { get; set; }
            public string Benutzer { get; set; }
            public string Passwort { get; set; }


            public Config()
            {
                if (Ip == null) Ip = "ip";
                if (Benutzer == null) Benutzer = "benutzer";
                if (Passwort == null) Passwort = "passwort";
                if (Port == null) Port = "port";

            }
           
            

            public Config load()
            {
                Config Konfiguration;
                FileStream fs = new FileStream("config.dat", FileMode.Open);
                BinaryFormatter formatter = new BinaryFormatter();
                Konfiguration = (Config)formatter.Deserialize(fs);
                fs.Close();

                return Konfiguration;
            }
            
            public void save()
            {

                FileStream fs = new FileStream("config.dat", FileMode.OpenOrCreate, FileAccess.Write);
                
                DESCryptoServiceProvider csp = new DESCryptoServiceProvider();
                csp.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");
                csp.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");

                    CryptoStream cryptoStream = new CryptoStream(fs, csp.CreateEncryptor(), CryptoStreamMode.Write);    
                    BinaryFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(fs, this);
                    byte[] byteData = new byte[Convert.ToInt32(fs.Length)];

                    cryptoStream.Write(byteData, 0, byteData.Length);
                    cryptoStream.Close();
                    fs.Close();
                                
            }

        }
    
}

hiermit rufen ich die Methode save auf


private void button1_Click(object sender, EventArgs e)
        {
            // Konfiguration ändern und Anspeichern
            Config Konfiguration = new Config(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text);
            Konfiguration.save();
        }

Könnt ihr euch das Verhalten erklären?
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

beantworten | zitieren | melden

Ja das Verhalten ist sogar so gewollt.
Zitat
formatter.Serialize(fs, this);

Damit schreibst du deine Objekte unverschlüsselt in die Datei.

Versuch mal:


fileStream = new FileStream(Dateipfad, FileMode.Create);
DESCryptoServiceProvider csp = new DESCryptoServiceProvider();
csp.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");
csp.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");

using (CryptoStream cryptoStream = new CryptoStream(fileStream, csp.CreateEncryptor(), CryptoStreamMode.Write))
{
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, this);
byte[] data = memoryStream.ToArray();

cryptoStream.Write(data, 0, data.Length);
}
fileStream.Close();
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EifelYeti am .
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
DerKleineTomy
myCSharp.de - Member



Dabei seit:
Beiträge: 106

beantworten | zitieren | melden

Du schreibst das Objekt zwei Mal in die Datei:
1)


BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, this); // Unverschlüsselt über FileStream!!!

2)


byte[] byteData = new byte[Convert.ToInt32(fs.Length)];
cryptoStream.Write(byteData, 0, byteData.Length); // Wieder über den FileStream!
Außerdem scheint es mir so, als ob du ein leeres Byte-Array in die Datei schreibst?!

Eigentlich solltest du ja direkt über den CryptoStream serialisieren können:


FileStream fileStream = new FileStream(...);
CryptoStream cryptoStream = new CryptoStream(fileStream, ...);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(cryptoStream, this); // über den CryptoStream serialisiert
private Nachricht | Beiträge des Benutzers
dott
myCSharp.de - Member



Dabei seit:
Beiträge: 50

Themenstarter:

beantworten | zitieren | melden

Ich habe das jetzt mal so gemacht und die Daten sind jetzt verschlüsselt.
Ist da überflüssiger Code drin?


public void save()
            {

                FileStream fs  = new FileStream("config.dat", FileMode.Create);
                
                DESCryptoServiceProvider csp = new DESCryptoServiceProvider();
                csp.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");
                csp.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");

               using(CryptoStream cryptoStream = new CryptoStream(fs, csp.CreateEncryptor(), CryptoStreamMode.Write))
               {
                    MemoryStream memoryStream = new MemoryStream();
                    BinaryFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(memoryStream, this);
                    byte[] data = memoryStream.ToArray();
                    cryptoStream.Write(data, 0, data.Length);
                    cryptoStream.Close();
                }
                   fs.Close();

hierrüber habe ich die vorher eingelesen, also ohne verschlüsselung


public Config load()
        {
            Config Konfiguration;
            FileStream fs = new FileStream("config.dat", FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
            Konfiguration = (Config)formatter.Deserialize(fs);
            fs.Close();

            return Konfiguration;
        }

Wie funktioniert das jetzt mit dem einlesen? ich habe da mal was versucht, komme aber nicht weiter


 public Config load()
            {
                Config Konfiguration;
                FileStream fs = new FileStream("config.dat", FileMode.Open);

                DESCryptoServiceProvider csp = new DESCryptoServiceProvider();
                csp.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");
                csp.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");

                using (CryptoStream cryptoStream = new CryptoStream(fs, csp.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    StreamReader reader = reader = new StreamReader(cryptoStream);
                    BinaryFormatter formatter = new BinaryFormatter();
                    Konfiguration = (Config)formatter.Deserialize(fs);
                    cryptoStream.Close();
                     
                }
                fs.Close();
                return Konfiguration;
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Mit Copy/Paste ist es eben nicht getan...

Man sollte auch verstehen was man sich da zusammenkopiert...


Tipp: --> Konfiguration = (Config)formatter.Deserialize(fs);

Gruss
Programmierhans
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
dott
myCSharp.de - Member



Dabei seit:
Beiträge: 50

Themenstarter:

beantworten | zitieren | melden


Config Konfiguration;
            FileStream fs = new FileStream("config.dat", FileMode.Open);

            DESCryptoServiceProvider csp = new DESCryptoServiceProvider();
            csp.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");
            csp.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");

            using (CryptoStream cryptoStream = new CryptoStream(fs, csp.CreateDecryptor(), CryptoStreamMode.Read))
            {
                StreamReader reader = new StreamReader(cryptoStream);
                BinaryFormatter formatter = new BinaryFormatter();
                Konfiguration = (Config)formatter.Deserialize(cryptoStream);
                cryptoStream.Close();
            }
            fs.Close();
            return Konfiguration;

So funktioniert es jetzt, ist der code auch so in Ordnung oder gibt es was zu verbessern?
private Nachricht | Beiträge des Benutzers
DerKleineTomy
myCSharp.de - Member



Dabei seit:
Beiträge: 106

beantworten | zitieren | melden

Zitat von dott
So funktioniert es jetzt, ist der code auch so in Ordnung oder gibt es was zu verbessern?

Ja, da ist einiges zu verbessern.
1) Entferne den StreamReader. Der wird in deinem Code nicht benutzt.
2) Pack den FileStream ebenfalls in eine using-Anweisung
3) Entferne cryptoStream.Close(), da using das bereits macht.

Dazu solltest du dir angucken, was die using-Anweisung überhaupt ist:
using-Anweisung
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (19.03.2013 - 07:15:30):

Bitte keine Code-Reviews, siehe [Hinweis] Wie poste ich richtig? Punkt 4.