2017-04-07 69 views
1

在创建XML文件期间我正在做加密字段。它工作正常。下面是代码:建立&保存文件到内存和加密(C#,WPF,LINQ)

创建XML类:

private void btnSave_Click(object sender, RoutedEventArgs e) 
{ 
    XmlTextWriter xWriter = new XmlTextWriter("test.xml", Encoding.UTF8); 
    xWriter.Formatting = Formatting.Indented; 
    xWriter.WriteStartElement("root"); 

    testViewClassDataContext dc = new testViewClassDataContext(); 
    List<test_view> tvq = (from tt in dc.test_views 
          select tt).ToList(); 
    var propertiesTestView = typeof(test_view).GetProperties(); 
    var testViewValues = new List<string>(); 

    loopPropXML(tvq, propertiesTestView, testViewValues, xWriter); 

    xWriter.WriteEndElement(); 
    xWriter.Close(); 
} 

public void loopPropXML<T>(IEnumerable<T> queryResult, PropertyInfo[] properites, List<string> addedValues, XmlTextWriter xWriter) 
{ 
    foreach (var qrl in queryResult) 
    { 
     var values = new List<object>(); 
     xWriter.WriteStartElement("tv"); 
     foreach (var property in properites) 
     { 
      Object value = property.GetValue(qrl, null); 
      xWriter.WriteStartElement(property.Name.ToString()); 

      DESEncrypt testEncrypt = new DESEncrypt(); 
      string pass = "qwertyuiop"; 
      string encText = testEncrypt.EncryptString((value == null ? "" : value.ToString()), pass); 

      xWriter.WriteString(encText); 
      xWriter.WriteEndElement(); 
      values.Add(value); 
     } 
     xWriter.WriteEndElement(); 
    } 
} 

这里是加密代码 “微软研究院C#” 了:

static TripleDES CreateDES(string key) 
{ 
    MD5 md5 = new MD5CryptoServiceProvider(); 
    TripleDES des = new TripleDESCryptoServiceProvider(); 
    des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key)); 
    des.IV = new byte[des.BlockSize/8]; 
    return des; 
} 

public string EncryptString(string plainText, string password) 
{ 
    byte[] plainTextBytes = Encoding.Unicode.GetBytes(plainText); 
    MemoryStream myStream = new MemoryStream(); 
    TripleDES des = CreateDES(password); 
    CryptoStream cryptStream = new CryptoStream(myStream, des.CreateEncryptor(), CryptoStreamMode.Write); 
    cryptStream.Write(plainTextBytes, 0, plainTextBytes.Length); 
    cryptStream.FlushFinalBlock(); 
    return Convert.ToBase64String(myStream.ToArray()); 
} 

如何将其更改为:

- 先建立文件并保存到内存中

- 然后加密它

- 最后一次保存。

+0

你的意思是加密整个xml文件而不是字段? –

+0

是的:首先我只是创建XML,保存在内存中(不保存),然后加密并保存 – 4est

+0

然后你不能实现你刚刚说的吗? –

回答

2

写的未加密的值到文件中:

public void loopPropXML<T>(IEnumerable<T> queryResult, PropertyInfo[] properites, List<string> addedValues, XmlTextWriter xWriter) 
{ 
    foreach (var qrl in queryResult) 
    { 
     var values = new List<object>(); 
     xWriter.WriteStartElement("tv"); 
     foreach (var property in properites) 
     { 
      Object value = property.GetValue(qrl, null); 
      xWriter.WriteStartElement(property.Name.ToString()); 
      xWriter.WriteString(value.ToString()); 
      xWriter.WriteEndElement(); 
      values.Add(value); 
     } 
     xWriter.WriteEndElement(); 
    } 
} 

使用XmlTextWriter实际上创建等,如果你想你已经这样做了之后,对文件进行加密,您将需要阅读保存它写入文件将文件内容再次加密到内存中,然后加密:

private void btnSave_Click(object sender, RoutedEventArgs e) 
{ 
    const string filename = "test.xml"; 
    XmlTextWriter xWriter = new XmlTextWriter(filename, Encoding.UTF8); 
    xWriter.Formatting = System.Xml.Formatting.Indented; 
    xWriter.WriteStartElement("root"); 

    testViewClassDataContext dc = new testViewClassDataContext(); 
    List<test_view> tvq = (from tt in dc.test_views 
          select tt).ToList(); 
    var propertiesTestView = typeof(test_view).GetProperties(); 
    var testViewValues = new List<string>(); 

    loopPropXML(tvq, propertiesTestView, testViewValues, xWriter); 

    xWriter.WriteEndElement(); 
    xWriter.Close(); 

    string unencrypted = File.ReadAllText(filename); 
    DESEncrypt testEncrypt = new DESEncrypt(); 
    string pass = "qwertyuiop"; 
    string encText = testEncrypt.EncryptString(unencrypted, pass); 
    File.WriteAllText(filename, encText); 
} 
+0

谢谢** mm8 **! – 4est