xml到加密文件?

时间:2014-01-26 23:33:23

标签: c# xml encryption file-io

好的,我知道这已经被覆盖了几次,我在这里读了几篇关于加密算法和加密方法等的文章。但是现在我的头脑旋转,我仍然不确定我需要做什么。我有一组xml格式的数据需要保存到文件中。

它不是非常敏感(没有信用卡或任何东西),但我不希望用户只能打开它作为xml并进行编辑等。我真的不担心有人编程精通黑客的格式或反编译以找到键等。

我想要的是一个基本类,我可以传递一个字符串值(或XmlDocument,但你可以随时调用.OuterXml)和一个密钥,我将硬编码并获得一个加密值,我可以写入一个文件。然后,我需要能够从另一台机器(客户机/客户机)上的文件中读取并解密回我的程序要处理的xml字符串。同样,密钥可以硬编码到程序中,以便它们在两个位置都匹配......

此外,我不想向用户询问密码或类似内容,但如果有必要,我也可以将其硬编码到程序中。

有人能指点我这么简单吗?

2 个答案:

答案 0 :(得分:1)

此链接会帮助您吗?您需要进一步修改网站中的示例代码以加密所有xml元素

http://msdn.microsoft.com/en-us/library/ms229746(v=vs.110).aspx

答案 1 :(得分:0)

总的来说,这就是你需要做的事情

  1. 将字符串作为纯文本(未加密)
  2. 将其转换为字节数组(cypher算法更容易使用byte [])
  3. 拥有密码算法实例
  4. 使用密码加密纯文本字节数组,输出是加密字节数组
  5. 将其存储在byte [] OR中,以将其存储在字符串使用Convert.ToBase64String()
  6. 对于一些示例代码:

    对于第1步

        private System.Security.Cryptography.SymmetricAlgorithm GetAesKey()
        {
            byte[] symKey = RandomNextBytes();
            var aes = System.Security.Cryptography.SymmetricAlgorithm.Create();
            aes.Key = symKey;
            aes.IV = symKey;
            aes.Mode = CipherMode.ECB;
            aes.Padding = PaddingMode.PKCS7;
            return aes;
         }
    

    上面的代码每次调用时都会创建一个不同的aes密钥。 RandomNextBytes只是一个随机创建16个字节的包装器。请注意,.NET本机随机不是线程安全的,因此如果您需要线程安全性查找Jon Skeet Thread-safe implementation

    您可能想要控制如果您想控制AES密钥,那么您可以拥有symKey这样的

    byte[] symKey = new byte[] { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
    

    接下来的步骤将cypher逻辑包装成一个漂亮的方法

    private string EncryptSymmetricToBase64(SymmetricAlgorithm symAlg, string plainText)
    {
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, symAlg.CreateEncryptor(symAlg.Key, symAlg.IV), CryptoStreamMode.Write))
            using (var sw = new StreamWriter(cs))
            {
                sw.Write(plainText);
            }
            string ciphered = Convert.ToBase64String(ms.ToArray());
            return ciphered;
        }
    }
    

    上面的代码选择了纯文本和密码算法。然后使用CryptoStream加密字符串。 在返回之前,它将加密的byte []转换为base64字符串。

    注意:Base64是一种众所周知的算法,可将二进制数据转换为字符串并返回。