Xml加密数据错误

时间:2016-01-11 10:46:37

标签: c# xml encryption

我使用以下代码将数据插入到加密的xml文件中,我使用内存流作为解密文件并将其加载到XmlDocument中以添加所需数据,然后再将其加密回同一文件。

public static void IN_EncryptFile(MemoryStream FLin,string Path)
{
    UnicodeEncoding UE = new UnicodeEncoding();
    byte[] key = UE.GetBytes(sKey);

    string cryptFile = Path;
    FileStream fsCrypt = new FileStream(cryptFile, FileMode.Open);

    RijndaelManaged RMCrypto = new RijndaelManaged();

    CryptoStream cs = new CryptoStream(fsCrypt,
        RMCrypto.CreateEncryptor(key, key),
        CryptoStreamMode.Write);

    FLin.Position = 0;

    int data;
    while ((data = FLin.ReadByte()) != -1)
    {
        cs.WriteByte((byte)data);
    }

    FLin.Close();
    FLin.Flush();
    cs.Close();
    fsCrypt.Close();
}


public static MemoryStream OUT_DecryptFile(string Path)
{
    UnicodeEncoding UE = new UnicodeEncoding();
    byte[] key = UE.GetBytes(sKey);

    FileStream fsCrypt = new FileStream(Path, FileMode.Open);

    RijndaelManaged RMCrypto = new RijndaelManaged();

    CryptoStream cs = new CryptoStream(fsCrypt,
        RMCrypto.CreateDecryptor(key, key),
        CryptoStreamMode.Read);

    MemoryStream fsOut = new MemoryStream();

    int data;
    while ((data = cs.ReadByte()) != -1)
        fsOut.WriteByte((byte)data);
    cs.Close();
    fsCrypt.Close();
    fsOut.Position = 0;
    return fsOut;    
}

public static void Add_Data_XML()
{
    string XML_Pt = @"C:\Test.Trr";
    XmlDocument XDt = new XmlDocument();

    XDt.Load(Cryption.OUT_DecryptFile(XML_Pt));

   /// Adding XMl data

    MemoryStream Fnl = new MemoryStream();
    XDt.Save(Fnl);
    Cryption.IN_EncryptFile(Fnl, XML_Pt);
    Fnl.Flush();
    Fnl.Close();
}

我需要对代码有意见,因为它对我来说很好,但有时会在加密文件中产生一些错误,我仍然不完全理解为什么,但是当我解密xml文件时,我发现添加的数据格式错误,放在主XMl节点之后,如下所示:

<Main_Node>

</Main_Node>”ÇÛÏ”ö8—´Ú·…ï/1Ž"‹ÓÃåõ¶—QÝUŸy…¤Êç‹íîzR߆ô
nÃFçiŽÌm–FÆzÍW9 úv¤ï_øVO,ÈvÄ

2 个答案:

答案 0 :(得分:1)

您的问题是您使用MemoryStream存储临时数据,并在可以的情况下从中读取。 MemoryStream的内部缓冲区大于您通常写入的数据。因此,如果您继续阅读它,您可能会从中获取垃圾数据。我建议不要逐字节读取,或者至少得到数据的实际长度并读取那么多字节。

您还首先关闭MemoryStream然后将其刷新。这毫无意义。

另一个问题可能是因为您使用FileMode.Open并且写入比文件中先前存在的少。这将在您编写的内容之后保留现有数据,并将显示为垃圾。使用FileMode.Create将是正确的方法,因为它意味着“如果没有具有此名称的文件,请创建一个新文件。如果有文件,请截断它。”

FileMode documentation

但如果你肯定总是写得比你读的更多,那么这应该不是问题。

如果它确实存在问题,我也不会说“它对我来说很好”。

答案 1 :(得分:0)

我认为你有编码问题。试试这个

            MemoryStream ms = new MemoryStream();            
            XDt.Save(ms);
            StreamReader Fnl = new StreamReader(ms, Encoding.UTF8);