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

 - (Programmierung, Verschlüsselung, C Sharp)

3 Antworten

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

Danke dir. :)

0
@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

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.

0

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

Cmd als Admin öffnen von einer batch Datei aus?

Hey,wie kann ich cmd als Admin öffnen ,also von einer batch Datei aus , "start cmd.exe" startet ja nur cmd aber nicht mit Admin Rechte . Und der Befehl mit runas "runas /noprofile /user:mein Benutzername\administrator cmd" funktioniert irgendwie auch nicht . Dann steht da immer das das Passwort oder der Benutzer Name falsch ist. DANKE schonmal im vorraus ;)

...zur Frage

Windows xp Benutzer Administrator Passwort?

Hi haben im Büro ein windows xp Aufjedenfall wenn man es startet steht da Benutzername: administrator  nur wir kennen den Passwort garnicht was kann ich jetzt tun . Werde Bilder einfügen .  habe auch schon beim starten f8 gedrückt und dann abgesicherter Modus nur da wollte er auch das Passwort haben .
Danke

...zur Frage

C# - Schemainformationen für das Element konnten nicht gefunden werden?

Hallo,

ich wollte eine Xml-Datei Xsd validieren was aber nicht so funktioniert hat, wie ich es mir vorgestellt habe. Das Programm liest beim klick auf den Öffnen Button die Xml-Datei ein und sollte Schema validieren. Ich bekomme beim klick auf den Öffnen Button aber immer die Meldung:

"Die Schemainformationen für das Element 'Personenkonfiguration' konnten nicht gefunden werden."

Beim klicken auf den OK Button erscheint die selbe Meldung nochmal für die anderen Elemente.

Danke im voraus.

...zur Frage

C# XmlSerializer Serialize Deserialize?

Hallo, ich habe ein Programm geschrieben welches beim klicken auf den "Erstellen"-Button eine Xml-Datei in eine Tabelle (DataGridView) einliest und beim klikcen auf den "Speichern"-Button die veränderte Xml-Datei neu abspeichert. Ich habe ein Xml-Schema erstellt an welches sich doch dann die Xml.Datei halten muss? (sry das ich es nicht sicher weiß, bin noch ein C# Anfänger :D). serializer.serialize() muss beim erstellen bzw laden der Datei benutzt werden und serializer.deserialize beim speichern der Datei? Ich habe bei der Form auch ene textBoxStatus, welche dann beim erstellen/laden der Datei den Status der Validierung anzeigt (ob abgeschlossen oder ob Fehler aufgetreten sind, wenn ja wird die jeweilige exception message angezeigt). Wenn ich auf den Erstellen/Laden Button klicke wird die Datei in die Tabelle (DataGridView) geladen, aber kein Validierung-Status in der textBoxStatus angezeigt.

...zur Frage

Wie kann man das Passwort bei webmail.o2 speichern?

Um mich einzuloggen muss ich immer den Benutzername und Passwort eingeben. Danach wird nicht mehr gefragt, ob das Passwort gespeichert werden kann. Vorher war es immer so, wenn ich die Browserdaten gelöscht habe (selten). Wie kann man den Benutzerdaten + das Passwort bei webmail.o2 speichern?

...zur Frage

Was möchtest Du wissen?