c#从加密的xml文件读取数据

c#从加密的xml文件读取数据,c#,xml,datagrid,encryption,C#,Xml,Datagrid,Encryption,对于记分板,我将分数存储在xml文件中。(WPF申请) 当然,我不希望用户只编辑xml文件,所以我正在寻找一种加密xml文件的方法。 这通过我在这里找到的方法起作用: 所以,我把它放在我项目的一个类文件中: public static void EncryptAndSerialize(Object obj) { UnicodeEncoding aUE = new UnicodeEncoding(); byte[] key = aUE.GetBytes("password");

对于记分板,我将分数存储在xml文件中。(WPF申请) 当然,我不希望用户只编辑xml文件,所以我正在寻找一种加密xml文件的方法。 这通过我在这里找到的方法起作用:

所以,我把它放在我项目的一个类文件中:

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");


}
但我就是不明白该怎么做: 要查看“记分板”,用户打开一个窗口,其中datagrid只是读取xml文件。 现在,由于xml文件是加密的,datagrid不能只读取xml文件。 (同样在上面,当它加载xml时,它也有同样的问题)

阅读过程如下:

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


}
在第二行中,我有
dweMethods.decryptandeserialize(“ScoreData.xml”)但我不确定绑定到什么,以及如何创建Xelement.Load,加载解密文件。
上面的代码使应用程序现在崩溃(当然),因为它现在试图读取一个不可读的xml文件

有人能帮我一点忙吗? 我想我只是忘记了一些非常小但合乎逻辑的步骤

事先非常感谢

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

Edit1(在第一次回答之后)

要打开要写入的xml,代码如下(从上面编辑) 私有void saveScore_单击(对象发送方,路由目标)


现在错误在
xmlDoc.Load(ds.GetXml())行中现在显示路径中有非法字符。但如果解密正确,这应该是不可能的。我想://

您可以使用
XElement.Parse()
从字符串加载xml

public ScoreBoard()
{
    InitializeComponent();
    DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml")
    XElement TrackList = XElement.Parse(ds.GetXml());
    LibraryView.DataContext = TrackList;
}

啊,对不起,我打错了,XML应该是Xmldarn,但使用
DataSet ds=dweMethods.DecryptAndDeserialize(“ScoreData.XML”);加载时仍然给我一个错误
xmlDoc.Load(ds.GetXml())然后在第二行,我得到一个ArgumentException未处理的错误:/EDIT1:这发生在我打开XML添加数据的部分
XmlDocument xmldock=new XmlDocument()记分板中的datagrid在打开时为空:/exception到底说了什么?它说“路径中有非法字符”。(翻译自own Langish中的错误)。当它试图打开文件并写入时,就会发生这种情况。(请参见我现在制作的上面的EDIT1)您需要将此:
xmlDoc.Load
更改为:
xmlDoc.LoadXml
警告:除非您添加完整性保护(例如MAC),否则如果密文更改,您可能会在加载XML时出错。此外,如果密码不是个人独有的,则有人可以简单地将文件切换为另一台机器上生成的文件。我不是说你必须为这个应用解决这些问题,我只是想让你意识到一些安全隐患。
public ScoreBoard()
{
    InitializeComponent();
    DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml")
    XElement TrackList = XElement.Parse(ds.GetXml());
    LibraryView.DataContext = TrackList;
}