对于记分牌,我将分数存储在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");
}
但是这里出现了我不明白该怎么做的部分: 要查看“记分板”,用户打开一个数据网格窗口,其中datagrid只读取xml文件。 现在,因为xml文件是加密的,所以datagrid不能只读取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文件。
有人可以帮我一点吗? 我想我只是忘记了一些非常小但合乎逻辑的步骤。
非常感谢你。
========================
编辑1(首次回答后)
要打开要写入的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();
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());
行,现在它在路径中显示非法字符。但如果它已被解密正确,这应该是不可能的我猜:/
答案 0 :(得分:2)
您可以使用XElement.Parse()
从字符串
public ScoreBoard()
{
InitializeComponent();
DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml")
XElement TrackList = XElement.Parse(ds.GetXml());
LibraryView.DataContext = TrackList;
}