Entwickler-Ecke

IO, XML und Registry - Verschlüsselte XML serialisieren


BCT1 - Di 24.01.12 20:53
Titel: Verschlüsselte XML serialisieren
Hallo, ich wollte eine Objektstruktur serialisiert abspeichern und laden. Das hab ich bisher so gemacht:

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:

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: http://msdn.microsoft.com/de-de/library/sb7w85t6(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 - 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 [http://msdn.microsoft.com/de-de/library/e970bs09%28v=vs.80%29.aspx].


BCT1 - Di 24.01.12 22:38

Also wie ich das verstehe soll ich die daten mit dem CryptoStream verschlüsseln

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

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 - Mi 25.01.12 11:02

Hallo BCT1,

am besten, du benutzt mal das Beispiel direkt von CryptoStream-Klasse [http://msdn.microsoft.com/de-de/library/system.security.cryptography.cryptostream%28v=vs.100%29.aspx] (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 - 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 - 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 ;)