2010-07-11 2 views
0

Хорошо, поэтому на этом этапе я выяснил многие другие проблемы, которые у меня были. Теперь, пытаясь расшифровать файл, я не получаю никаких исключений, однако данные не дешифруются должным образом ... он проходит всю операцию без исключения исключения, пока я не попытаюсь получить доступ к XML-документу через поле со списком снова после дешифрования , В это время эта ошибка возникает:Файл не будет дешифровать правильно

Неожиданный конец файла произошел. Следующие элементы не закрыты: учетная запись. Строка 12, позиция 10. , когда я открываю файл в веб-браузере, он имеет только одну половину XML-узла. Что случилось?

public partial class Form1 : Form 
{ 
    public string fileName = "passfile.xml"; 
    public DataSet ds = new DataSet("Account List"); 
    public DataTable accounts = new DataTable("Accounts"); 
    public Form1() 
    { 
     InitializeComponent(); 
     accountGroupsBox.Enabled = false; 
     menuStrip1.Enabled = false; 
     button2.Enabled = false; 
     Types type = new Types(); 
     this.accountGroupsBox.Items.AddRange(type.accountTypes); 
     accounts.Columns.AddRange(new DataColumn[] { 
      new DataColumn("Username"), 
      new DataColumn("Password"), 
      new DataColumn("Description")}); 

     dataGridView1.DataSource = accounts; 


    } 

    private void addNewPasswordToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Form2 addAccount = new Form2(this); 
     addAccount.Show(); 
    } 

    private void S_Click(object sender, EventArgs e) 
    { //Need to add some code to check for password correctness, for now just unlock the interface 
     accountGroupsBox.Enabled = true; 
     menuStrip1.Enabled = true; 
     button2.Enabled = true; 
     label2.Text = "Interface Unlocked"; 
    } 

    private void accountGroupsBox_SelectedIndexChanged(object sender, EventArgs e) 
    { //Display the accounts on the datagrid 
     accounts.Clear(); 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(fileName); 
     foreach (XmlNode node in doc.GetElementsByTagName("Account")) 
     { 
      if (node["AccountType"].InnerText == accountGroupsBox.SelectedItem.ToString()) 
      { 
       DataRow row = accounts.Rows.Add(
       node["Username"].InnerText, 
       node["Password"].InnerText, 
       node["Description"].InnerText); 
      } 
     } 


    } 
    public void Encrypt() 
    { 
     string temp = Path.GetTempFileName(); 
     string path = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 
     byte[] pword = Encoding.UTF8.GetBytes(textBox1.Text); 
     byte[] hash = SHA256.Create().ComputeHash(pword); 
     byte[] iv = MD5.Create().ComputeHash(pword); 
     byte[] key = hash; 

     using(FileStream fsInput = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 
     using(SymmetricAlgorithm alg = Aes.Create()) 
     using(ICryptoTransform enc = alg.CreateEncryptor(key, iv)) 
     using (FileStream fsOutput = new FileStream(temp, FileMode.Create, FileAccess.Write)) 
     using (CryptoStream cs = new CryptoStream(fsOutput, enc, CryptoStreamMode.Write)) 
     { 
      try 
      { 
       byte[] byteInput = new byte[fsInput.Length - 1]; 
       fsInput.Read(byteInput, 0, byteInput.Length); 
       cs.Write(byteInput, 0, byteInput.Length); 

       FileInfo old = new FileInfo(fileName); 
       FileInfo newer = new FileInfo(temp); 
       old.Delete(); 
       newer.MoveTo(Path.Combine(path, fileName)); 


      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString(), "Encryption Error", MessageBoxButtons.OK); 

      } 
     } 


    } 
    public void Decrypt() 
    { 

     byte[] pword = Encoding.UTF8.GetBytes(textBox1.Text); 
     byte[] hash = SHA256.Create().ComputeHash(pword); 
     byte[] iv = MD5.Create().ComputeHash(pword); 
     byte[] key = hash; 

     using(FileStream fsInput = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 
     using(SymmetricAlgorithm alg = Aes.Create()) 
     using(ICryptoTransform enc = alg.CreateDecryptor(key, iv)) 
     using (CryptoStream cs = new CryptoStream(fsInput, enc, CryptoStreamMode.Read)) 
     { 
      StreamWriter sw = new StreamWriter(temp); 
      sw.Write(new StreamReader(cs).ReadToEnd()); 
      sw.Flush(); 
      sw.Close(); 
     } 
     FileInfo encrypted = new FileInfo(fileName); 
     FileInfo decrypted = new FileInfo(temp); 
     encrypted.Delete(); 
     decrypted.MoveTo(Path.Combine(path, fileName); 
+0

Вы имели в виду шифрование файлов на C# или шифрование файлов .NET? –

ответ

2

Старый файл fileName по-прежнему открыт, когда вы вызываете old.Delete(); Он будет закрыт, когда заканчивается использование {} блока. Переместите удаление файла и переименуйте его в конец вашего метода шифрования.

+0

Это хорошо работает, спасибо. Однако теперь я получаю не могу создать файл, который уже существует исключение из new.MoveTo(). Как это исправить? – Stev0

+0

@ Stev0 - Можете ли вы вставить обновленный код и трассировку стека исключения на pastebin.com или что-то в этом роде. Я не уверен, что это вызывает. –

+0

Вот ссылка на страницу с описанием деталей исключения: http://pastebin.com/rJ5WPhua – Stev0

0

Операции Delete и MoveTo выглядят исполняемыми в открытых файлах. Кроме того, метод расшифровки дважды открывает файл «filename». На какой строке вы получаете исключение?

+0

То же самое, вышеупомянутый ответ фиксировал часть, относящуюся к шифрованию, теперь я получаю такое же исключение в расшифровке, особенно во время строки SW Streamwriter, что я могу изменить, чтобы исправить это? – Stev0

+0

Хорошо обойти это Я просто сделал то же самое, что и метод шифрования ... поместив вывод в файл temp, а затем переименовав ... – Stev0

+0

@ Stev0: Ваша проблема при создании экземпляра StreamWriter заключается в передаче строки fileName к нему, а не к файловому потоку. –

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