如何在C#中加密/解密相同的xml文件?

时间:2017-01-27 00:52:40

标签: c# xml winforms encryption

所以我需要能够在我的应用程序中加密/解密相同的设置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(@"D:\Sample.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();
}

我只需要知道如何使用相同类型的进程来解密同一个文件。如果有人能指出我正确的方向,我将不胜感激。请记住,超安全性不是问题。原谅我的无知这个任务对我来说是新的。

2 个答案:

答案 0 :(得分:1)

像这样的东西。请注意,它使用CryptoStreamMode.Read标志调用CreateDecryptor,告诉它从流中读取。

var decryptor = new RijndaelManaged (); 
var transformer = decryptor.CreateDecryptor(_decryptKey, _decryptSeed);
var cryptoStream = new CryptoStream(encryptedStream, transformer, CryptoStreamMode.Read);
cryptoStream.CopyTo(resultStream);
resultStream.Close();

一些社论评论:

1)AES会更好,这就是为什么: https://blogs.msdn.microsoft.com/shawnfa/2006/10/09/the-differences-between-rijndael-and-aes/

2)不要低估.net加密 - 微软不会愚弄

3)错误加密可能比没有加密更糟糕,因为它提供了错误的安全感

答案 1 :(得分:1)

他说的加上...... 的MemoryStream ...

https://msdn.microsoft.com/en-us/library/system.io.memorystream(v=vs.110).aspx

import java.util.*

public class Persons {

  private Collection<Person> persons;

  //If you want the clients to have flexibility to choose the implementation of persons collection.
  //Else, hide this constructor and create the persons collection in this class only.
  public Persons(Collection<Person> persons) {
    this.persons = persons;
  }

  public void addPerson(Person person) {
   persons.add(person);
  }
}

如果是我,我会使用两个独立的FileStream。一个用于只读,后一个用于写回.xml文件(您刚刚读取)。我只打算构建和编写后面的,当且仅当我知道我有一个完全形成/填充的接收器。

您也可以调查SecureString的使用(但我离题了):

https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx

所有这一切,你从不想要直接覆盖文件(即,就地编辑)。如果你这样做,并且写入失败(中途通过),你的原始文件将会损坏。拉链/ nadda /废话让你离开。始终写入新的临时文件,只有在完成100%后才将临时文件提升到源路径(通常通过FileInfo.MoveTo)。

https://msdn.microsoft.com/en-us/library/system.io.fileinfo.moveto(v=vs.110).aspx

如果一路上发生了不好的事情(它会!!!),你所要做的就是删除临时文件(关闭一个catch块等),然后你回到起点。

人类不会知道你实际上工作了两个文件(如果你有一些监视器自动化被串联文件绊倒,那么重写它会导致它很好,垃圾)。