Laden...

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

Erstellt von dott vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.667 Views
Thema geschlossen
D
dott Themenstarter:in
48 Beiträge seit 2013
vor 11 Jahren
Trotz Verwendung von CryptoStream stehen die Daten zusätzlich unverschlüsselt in der Datei

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?

64 Beiträge seit 2012
vor 11 Jahren

Ja das Verhalten ist sogar so gewollt.

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();

++Rekursion ++
(lat. , die) siehe Rekursion

D
96 Beiträge seit 2012
vor 11 Jahren

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


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

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
D
dott Themenstarter:in
48 Beiträge seit 2013
vor 11 Jahren

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;

4.221 Beiträge seit 2005
vor 11 Jahren

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...

D
dott Themenstarter:in
48 Beiträge seit 2013
vor 11 Jahren

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?

D
96 Beiträge seit 2012
vor 11 Jahren

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

Hinweis von herbivore vor 11 Jahren

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

Thema geschlossen