2016-01-11 6 views
0

Я сделал следующий код для вставки данных в зашифрованный XML-файл, я использовал поток памяти для дешифрованного файла и загрузил его в XmlDocument для добавления необходимых данных, а затем зашифровал его снова к тому же файл.Xml зашифрованная ошибка данных

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(); 
} 

мне нужно мнение о коде, как это работает хорошо для меня, но иногда это создает некоторые ошибки в зашифрованном файле, который я до сих пор не в полной мере понять, почему, но когда я dencrypt файл XML я найти добавлены данные в неправильном формате и помещается после основного узла Xml в следующем:

<Main_Node> 

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

ответ

1

Ваш вопрос в том, что вы используете MemoryStream для хранения временных данных, и вы читать из него в то время как вы можете. MemoryStream имеет внутренний буфер, который больше, чем данные, которые вы обычно пишете. Поэтому, если вы продолжаете читать, вы можете получить от него данные мусора. Я бы порекомендовал не считывать байт по байту или, по крайней мере, получить фактическую длину данных и прочитать, что много байтов.

Вы также сначала закроете MemoryStream, а затем промойте его. Это бессмысленно.

Другая проблема может заключаться в том, что вы используете FileMode.Open и пишете меньше, чем ранее существовали в файле. Это оставит существующие данные после того, что вы пишете, и это будет отображаться как мусор. Использование FileMode.Create было бы правильным путем, так как это означает «если нет файла с этим именем, создайте новый. Если есть файл, обрезайте его».

FileMode documentation

Но если вы, конечно, всегда пишут больше, чем вы читали, то это не должно быть проблемой.

Также я бы не сказал, что «это отлично работает для меня», если у него действительно есть проблемы.

+0

Спасибо за вашу помощь, теперь это действительно работает отлично: D – Doicare

0

Я думаю, что у вас есть проблема с кодировкой. Попробуйте это

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

Спасибо за ур ответ, но я не понимаю, использование StreamReader здесь. Поскольку он не будет зашифровать файл обратно. – Doicare

+0

Вам все равно нужно вызвать метод Cryption.IN_EncryptFile(), чтобы прочитать зашифрованный файл. Просто передайте StreamReader вместо MemoryStream. MemoryStream не имеет такой опции кодирования, как StreamReader. – jdweng

Смежные вопросы