Autor Beitrag
BCT1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Di 24.01.12 20:53 
Hallo, ich wollte eine Objektstruktur serialisiert abspeichern und laden. Das hab ich bisher so gemacht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Data myData = new Data();
void Laden() {
    FileStream stream = File.Open("test.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite);
    XmlSerializer serializer = new XmlSerializer(typeof(Data));
    myData = (Data)serializer.Deserialize(stream);
    stream.Close();
}
void Speichern() {
    FileStream stream = File.Open("test.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite);
    XmlSerializer serializer = new XmlSerializer(typeof(Data));
    serializer.Serialize(stream, myData);
    stream.Close();
}

Jetzt möchte ich das ganze aber noch verschlüsseln und hier weiß ich nicht weiter. Zum verschlüsseln benutze ich dieses hier:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
RijndaelManaged algorithm = new RijndaelManaged();
byte[] passwordBytes = Encoding.UTF8.GetBytes("Test"); //password here
byte[] saltBytes = Encoding.UTF8.GetBytes("Text"); // salt here (another string)
PasswordDeriveBytes p = new PasswordDeriveBytes(passwordBytes, saltBytes);
// sizes are devided by 8 because [ 1 byte = 8 bits ]
algorithm.IV = p.GetBytes(algorithm.BlockSize / 8);
algorithm.Key = p.GetBytes(algorithm.KeySize / 8);


XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("test.xml");
Encrypt(xmlDoc, "Data", algorithm);
Decrypt(xmlDoc, algorithm);

Die Encrypt(Decrypt Methoden sind 1zu1 von hier übernommen: msdn.microsoft.com/d...7w85t6(v=vs.80).aspx

Beides für sich funktioniert, doch ich frage mich jetzt, wie ich die beiden zusammenbasteln kann, da beide völlig verschiedene Klassen benutzen. (Encript braucht XmlDocument ich benutze aber einen stream) Ich könnte natürlich versuchen wie wirr alles in richtige Objekte umzuwandeln in der Hoffnung aus dem sream ein XmlDocument zu machen und vice versa. Ich denke aber da müsste es irgendeine simplere Möglichkeit geben.

Ich hoffe ihr könnt mir da weiterhelfen
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 24.01.12 21:35 
Hallo,

möchtest du die ganze Datei verschlüsseln oder nur (wie bisher beim Encrypt/Decrypt) einzelne Elemente?

Um die ganze Datei zu verschlüsseln, kannst du zuerst einen MemoryStream für die Serialisierung benutzen, dann den Inhalt verschlüsseln und zuletzt mit einem FileStream als Datei abspeichern. Beim Deserialisieren entsprechend umgekehrt vorgehen.

Die Encrypt und Decrypt-Methoden kannst du dann direkt durch die .NET-Klassen im Namensbereich "System.Security.Cryptography" ersetzen, s. Verschlüsseln von Daten.
BCT1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Di 24.01.12 22:38 
Also wie ich das verstehe soll ich die daten mit dem CryptoStream verschlüsseln
ausblenden C#-Quelltext
1:
CryptoStream cryptStream = new CryptoStream(memoryStream, algorithm.CreateEncryptor(Encoding.UTF8.GetBytes("Test"), Encoding.UTF8.GetBytes("Text")), CryptoStreamMode.Read);					

Danach würde ich die Daten aus dem CryptoStream in meinen FileStream Kopieren
ausblenden C#-Quelltext
1:
2:
fileStream.SetLength(0);
cryptStream.CopyTo(fileStream);


Komischerweise steht in der erstellten xmlDatei nur dies: áŸUÑ~h™yÇ!K”œfg•
Die datei ohne die Verschlüsselung ist wesentlich länger und das entschlüsseln funktioniert auch nicht.

Benutze ich den CryptoStream falsch oder woran liegt das?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 25.01.12 11:02 
Hallo BCT1,

am besten, du benutzt mal das Beispiel direkt von CryptoStream-Klasse (unten auf der Seite mit der Rijndael-Verschlüsselung - alternativ kannst du natürlich auch eines der anderen Verfahren wie SHA256, AES, RSA, DSA etc. benutzen).
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 25.01.12 11:28 
Wofür ist eigentlich das Serialisieren in XML bei dir gut wenn du eh verschlüsseln willst? Oder anders ausgedrückt wieso benutzt du ein explizt für leichte Lesbarkeit und einfache Weitergabe an andere Systeme ausgedachtes Format um es dann zu verschlüsseln so das nur noch du es benutzen kannst? Klingt irgendwie paradox. Wäre es nicht sinnvoller anstatt XML deine Datenstruktur einfach durch einen BinaryFormatter zu jagen um an einen verschlüsselbaren Stream zu kommen?
BCT1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 25.01.12 19:14 
Danke hat jetzt funktioniert. Und auf die Frage warum ich XML verschlüsseln will, weil es für mich wie der leichteste Weg aussah um meine Datenstruktur schnell und sicher abzuspeichern. Mit der XML datei alleine soll man eh nichts anfangen sollen ;)