Файл не расшифровывается должным образом - PullRequest
0 голосов
/ 11 июля 2010

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

Произошел неожиданный конец файла. Следующие элементы не закрыты: Аккаунт. Строка 12, позиция 10. когда я открываю файл в веб-браузере, он имеет только 1 половину узла 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);

Ответы [ 2 ]

2 голосов
/ 11 июля 2010

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

0 голосов
/ 11 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...