C# - Xml-Datei beim öffnen entschlüsseln und beim speichern verschlüsseln?

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.

Kieselsaeure  12.01.2018, 12:50

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

0
Kieselsaeure  12.01.2018, 12:52

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

0

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

SuM2AdH 
Fragesteller
 12.01.2018, 10:47

Danke dir. :)

0
Isendrak  12.01.2018, 11:44
@SuM2AdH

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

0

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

Woher ich das weiß:Berufserfahrung – 💻 Zertifizierter Sr. Cloud Engineer im IT-Consulting
SuM2AdH 
Fragesteller
 12.01.2018, 10:47

Danke dir. :)

1