C# - Xml-Datei beim öffnen entschlüsseln und beim speichern verschlüsseln?
Hallo, ich wollte ein Programm erstellen, in dem ich einen Benutzername und ein Passwort eingebe, wenn ich dann auf den Speichern-Button klicke, soll es als Xml-Datei abgespeichert werden und das Passwort verschlüsselt werden. Wenn ich dann diese Datei wieder öffne, soll das Passwort wieder entschlüsselt werden.
Falls es schon einen gespeicherten Benutzer gibt, kann man auf die drei Punkte klicken, um die Datei zu öffnen/verändern und dann abspeichern. Wenn ich noch keinen Benutzer habe, gebe ich einfach einen Benutzername und Passwort ein und klicke auf den Speichern-Button um es als Xml-Datei abzuspeichern.
Wie entschlüssele ich beim öffnen und wie verschlüssele ich beim Speichern als Xml-Datei?
3 Antworten
Das mit dem "Benutzername" kannst du dir sparen. Das ist höchstens eine für die Verschlüsselung unrelevante Spielerei.
Ich würde empfehlen AES256 einzusetzen für die Verschlüsselung. Microsoft selbst liefert für die Ver- und Entschlüsselung selbst Beispiele zur Dokumentation. Wichtig wäre an der Stelle noch zu sagen das du den ECB Modus meiden solltest und du keinen Schlüssel brauchst, der Länger als 256Bit (32Byte) ist. Falls du einen IV verwendest: der sollte 128 Bit (16Byte) gross sein.
übrigens wäre es noch nett wenn du dank hashverfahren für privatsphäre sorgst. da bietet sich zb sha256 optimal an. gib aes ruhig die raw ausgabe (binärdaten). das tut der entropie gut.
Ganz einfach:
Zum Speichern verwende System.Xml.XmlDocument.Save(System.IO.Stream) mit einer Instanz von System.Security.Cryptography.CryptoStream.
Zum Laden entsprechend System.Xml.XmlDocument.Load(System.IO.Stream).
Und da ich grad etwas Langeweile hatte, hier noch ein Beispielprogramm:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
public static class CryptoTest{
public static Stream OpenFileDecryptStream(string filename, string passphrase){
Aes aes = Aes.Create();
aes.Key = new byte[aes.KeySize/8];
byte[] buffer = Encoding.UTF8.GetBytes(passphrase);
for(int i = 0; i < aes.Key.Length;) {
buffer = SHA512.Create().ComputeHash(buffer);
for(int j = 0; j < buffer.Length && i < aes.Key.Length; ++j) {
aes.Key[i++] = buffer[j];
}
}
aes.IV = new byte[aes.BlockSize/8];
for(int i = 0; i < aes.IV.Length;) {
buffer = SHA512.Create().ComputeHash(buffer);
for(int j = 0; j < buffer.Length && i < aes.IV.Length; ++j) {
aes.IV[i++] = buffer[j];
}
}
return new CryptoStream(new FileStream(filename, FileMode.Open, FileAccess.Read), aes.CreateDecryptor(), CryptoStreamMode.Read);
}
public static Stream OpenFileEncryptStream(string filename, string passphrase){
Aes aes = Aes.Create();
aes.Key = new byte[aes.KeySize/8];
byte[] buffer = Encoding.UTF8.GetBytes(passphrase);
for(int i = 0; i < aes.Key.Length;) {
buffer = SHA512.Create().ComputeHash(buffer);
for(int j = 0; j < buffer.Length && i < aes.Key.Length; ++j) {
aes.Key[i++] = buffer[j];
}
}
aes.IV = new byte[aes.BlockSize/8];
for(int i = 0; i < aes.IV.Length;) {
buffer = SHA512.Create().ComputeHash(buffer);
for(int j = 0; j < buffer.Length && i < aes.IV.Length; ++j) {
aes.IV[i++] = buffer[j];
}
}
return new CryptoStream(new FileStream(filename, FileMode.Create, FileAccess.Write), aes.CreateEncryptor(), CryptoStreamMode.Write);
}
public static void SaveXmlTest(){
XmlDocument xml = new XmlDocument();
XmlDeclaration xmlDeclaration = xml.CreateXmlDeclaration( "1.0", "UTF-8", null );
xml.InsertBefore(xmlDeclaration, xml.DocumentElement);
XmlElement userinfo = xml.CreateElement("UserInfo");
xml.AppendChild(userinfo);
XmlElement username = xml.CreateElement("Name");
username.InnerText = "AgentSmith";
userinfo.AppendChild(username);
XmlElement password = xml.CreateElement("Password");
password.InnerText = "topsecretpasswordhere";
userinfo.AppendChild(password);
Stream stream = OpenFileEncryptStream("cryptotest.dat", "passwort1");
xml.Save(stream);
stream.Flush();
stream.Close();
}
public static void LoadXmlTest(){
XmlDocument xml = new XmlDocument();
Stream stream = OpenFileDecryptStream("cryptotest.dat", "passwort1");
xml.Load(stream);
stream.Close();
Console.WriteLine(xml.OuterXml);
}
public static void Main(string[] args){
SaveXmlTest();
LoadXmlTest();
}
}
Ist hoffentlich selbsterklärend... ^^;;
Du kannst den Text hashen.
Das kannst du hierüber erreichen:
https://www.codeproject.com/Articles/14150/Encrypt-and-Decrypt-Data-with-C
Nur beim öffnen und speichern die richtige Methode verwenden.
MfG
bei der auswahl zwischen 62^(32) und 256^(32) möglichkeiten der passwörter wirst du mir sicher zustimmen das die letztere variante für dich schmackhafter ist bei SELBEM BERECHNUNGSAUFWAND. :-)