我使用以下代码将数据插入到加密的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Ä
答案 0 :(得分:1)
您的问题是您使用MemoryStream
存储临时数据,并在可以的情况下从中读取。 MemoryStream的内部缓冲区大于您通常写入的数据。因此,如果您继续阅读它,您可能会从中获取垃圾数据。我建议不要逐字节读取,或者至少得到数据的实际长度并读取那么多字节。
您还首先关闭MemoryStream
然后将其刷新。这毫无意义。
另一个问题可能是因为您使用FileMode.Open
并且写入比文件中先前存在的少。这将在您编写的内容之后保留现有数据,并将显示为垃圾。使用FileMode.Create
将是正确的方法,因为它意味着“如果没有具有此名称的文件,请创建一个新文件。如果有文件,请截断它。”
但如果你肯定总是写得比你读的更多,那么这应该不是问题。
如果它确实存在问题,我也不会说“它对我来说很好”。
答案 1 :(得分:0)
我认为你有编码问题。试试这个
MemoryStream ms = new MemoryStream();
XDt.Save(ms);
StreamReader Fnl = new StreamReader(ms, Encoding.UTF8);