c # чтение данных из зашифрованного XML-файла - PullRequest
1 голос
/ 22 января 2012

Для табло я сохраняю результаты в xml-файле.(Приложение WPF) Конечно, я не хочу, чтобы пользователь просто редактировал этот XML-файл, поэтому я искал способ зашифровать XML-файл.это работает через метод, который я нашел здесь: http://srinivasganaparthi.blogspot.com/2011/04/encrypt-and-decrypt-xml-file-in-c.html

Итак, я поместил это в файл класса в моем проекте:

public static void EncryptAndSerialize(Object obj)
{
    UnicodeEncoding aUE = new UnicodeEncoding();
    byte[] key = aUE.GetBytes("password");
    RijndaelManaged RMCrypto = new RijndaelManaged();
    using (FileStream fs = File.Open(@"ScoreData.xml", FileMode.Create))
    {
        using (CryptoStream cs = new CryptoStream(fs, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write))
        {
            XmlSerializer xmlser = new XmlSerializer(obj.GetType());
            xmlser.Serialize(cs, obj);
        }
        fs.Close();
    }
}

public static DataSet DecryptAndDeserialize(string filename)
{
    DataSet ds = new DataSet();
    FileStream aFileStream = new FileStream(filename, FileMode.Open);
    StreamReader aStreamReader = new StreamReader(aFileStream);
    UnicodeEncoding aUE = new UnicodeEncoding();
    byte[] key = aUE.GetBytes("password");
    RijndaelManaged RMCrypto = new RijndaelManaged();
    CryptoStream aCryptoStream = new CryptoStream(aFileStream, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read);

    //Restore the data set to memory.
    ds.ReadXml(aCryptoStream);
    aStreamReader.Close();
    aFileStream.Close();
    return ds;
}

И он действительно работает очень хорошо, XMLфайл зашифрован в той части, где я пишу XML-файл здесь:

private void saveScore_Click(object sender, RoutedEventArgs e)
{
    if (!File.Exists("ScoreData.xml")) //als file nog niet bestaat
    {
        XmlTextWriter textWritter = new XmlTextWriter("ScoreData.xml", null);
        textWritter.WriteStartDocument();
        textWritter.WriteStartElement("Data");

        textWritter.WriteEndElement();
        textWritter.Close();

    }



    XmlDocument xmlDoc = new XmlDocument();
    dweMethods.DecryptAndDeserialize("ScoreData.xml");
    xmlDoc.Load("ScoreData.xml");

    XmlElement subRoot = xmlDoc.CreateElement("Persons");
    //Naam
    XmlElement appendedElementNaam = xmlDoc.CreateElement("Name");
    XmlText xmlTextNaam = xmlDoc.CreateTextNode(nameOfPerson.Text);
    appendedElementNaam.AppendChild(xmlTextNaam);
    subRoot.AppendChild(appendedElementNaam);
    xmlDoc.DocumentElement.AppendChild(subRoot);
    //Score
    XmlElement appendedElementScore = xmlDoc.CreateElement("Score");
    XmlText xmlTextScore = xmlDoc.CreateTextNode(Convert.ToString(endScore));
    appendedElementScore.AppendChild(xmlTextScore);
    subRoot.AppendChild(appendedElementScore);
    xmlDoc.DocumentElement.AppendChild(subRoot);
    //Date
    XmlElement appendedElementDate = xmlDoc.CreateElement("Date");
    XmlText xmlTextDate = xmlDoc.CreateTextNode(DateTime.Now.ToString("d/M/yyyy"));
    appendedElementDate.AppendChild(xmlTextDate);
    subRoot.AppendChild(appendedElementDate);
    xmlDoc.DocumentElement.AppendChild(subRoot);


    xmlDoc.Save("ScoreData.xml");
    dweMethods.EncryptAndSerialize("ScoreData.xml");


}

Но здесь идет часть, которую я просто не понимаю, как это сделать: чтобы просмотреть «табло», пользователь открывает окно, в которомсетка данных, где сетка данных только что читает XML-файл.Теперь, поскольку файл XML зашифрован, сетка данных не может просто прочитать файл XML.(также здесь выше, когда он загружает XML, у него возникает та же проблема)

Чтение выполняется следующим образом:

public ScoreBoard()
{
    InitializeComponent();
    dweMethods.DecryptAndDeserialize("ScoreData.xml");
    XElement TrackList = XElement.Load("ScoreData.xml");
    LibraryView.DataContext = TrackList;


}

во второй строке у меня есть dweMethods.DecryptAndDeserialize("ScoreData.xml");, но яне знаю, с чем его связать, и как я могу сделать Xelement.Load, загрузить расшифрованный файл.Приведенный выше код вызывает сбой приложения (разумеется), поскольку оно пытается прочитать нечитаемый XML-файл сейчас.

Может кто-нибудь помочь мне здесь?Я думаю, что я просто забыл какой-то очень маленький, но логичный шаг.

Заранее большое спасибо.

========================

Edit1 (после первого ответа)

Чтобы открыть xml для записи, код теперь выглядит какэто (отредактировано сверху) private void saveScore_Click (отправитель объекта, RoutedEventArgs e)

{
    if (!File.Exists("ScoreData.xml")) //als file nog niet bestaat
    {
        XmlTextWriter textWritter = new XmlTextWriter("ScoreData.xml", null);
        textWritter.WriteStartDocument();
        textWritter.WriteStartElement("Data");

        textWritter.WriteEndElement();
        textWritter.Close();
        dweMethods.EncryptAndSerialize("ScoreData.xml");

    }



    XmlDocument xmlDoc = new XmlDocument();
    DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml");
    xmlDoc.Load(ds.GetXml());

    XmlElement subRoot = xmlDoc.CreateElement("Persons");
    //Naam
    XmlElement appendedElementNaam = xmlDoc.CreateElement("Name");
    XmlText xmlTextNaam = xmlDoc.CreateTextNode(nameOfPerson.Text);
    appendedElementNaam.AppendChild(xmlTextNaam);
    subRoot.AppendChild(appendedElementNaam);
    xmlDoc.DocumentElement.AppendChild(subRoot);
    //Score
    XmlElement appendedElementScore = xmlDoc.CreateElement("Score");
    XmlText xmlTextScore = xmlDoc.CreateTextNode(Convert.ToString(endScore));
    appendedElementScore.AppendChild(xmlTextScore);
    subRoot.AppendChild(appendedElementScore);
    xmlDoc.DocumentElement.AppendChild(subRoot);
    //Date
    XmlElement appendedElementDate = xmlDoc.CreateElement("Date");
    XmlText xmlTextDate = xmlDoc.CreateTextNode(DateTime.Now.ToString("d/M/yyyy"));
    appendedElementDate.AppendChild(xmlTextDate);
    subRoot.AppendChild(appendedElementDate);
    xmlDoc.DocumentElement.AppendChild(subRoot);


    xmlDoc.Save("ScoreData.xml");
    dweMethods.EncryptAndSerialize("ScoreData.xml");


}

ошибка теперь находится в строке xmlDoc.Load(ds.GetXml());, где теперь говорится, что в пути есть недопустимые символы.но это не должно быть возможно, если оно было расшифровано правильно, я думаю: /

1 Ответ

2 голосов
/ 22 января 2012

Вы можете использовать XElement.Parse() для загрузки xml из строки

public ScoreBoard()
{
    InitializeComponent();
    DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml")
    XElement TrackList = XElement.Parse(ds.GetXml());
    LibraryView.DataContext = TrackList;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...