开发者

File will not decrypt properly

Ok so at this point I've figured out many of the other issues I was having. Now upon attempting to decrypt the file, I receive no exceptions, however the data is not decrypted properly....it goes through the entire operation without throwing an exception, until I attempt to access the XML document via the combo box again after decrypting. At which time this error is thrown:

Unexpected end of file has occurred. The following elements are not closed: Account. Line 12, position 10. when I open the file in a web browser it only has like 1 half of an XML Node. What happened?

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.Enabl开发者_运维问答ed = 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);


The old file fileName is still open when you call old.Delete(); It will close when the using { } block ends. Move the file deletion and rename to the end of your Encrypt method.


The Delete and MoveTo operations look to be being performed on open files. Additionally, the decrypt method opens the "filename" file twice. On which line are you getting the exception thrown?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜