XML 文件加密与解密
阅读原文时间:2021年04月21日阅读:1

      做这个小程序实属无奈,客户担心文件泄露,要求我们加密,其实都不是什么重要的文件,纯属是客户给我们加工作量,但是也算是学到了一些东西,因此博主对客户的感情掺杂这爱与恨吧。下面看看我的程序吧,其实很简单,主要是用WPF做的。

加密解密文件当然要有相关的加密解密函数:

  public void Decrypt(string filename)//解密函数
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(filename);
            XmlElement encryptedElement = doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;
            EncryptedData edElement = new EncryptedData();
            edElement.LoadXml(encryptedElement);
            EncryptedXml exml = new EncryptedXml();
            RijndaelManaged key = new RijndaelManaged();
            byte[] bytekey = Encoding.Unicode.GetBytes("1111111111111111");
            key.Key = bytekey;
            byte[] output = exml.DecryptData(edElement, key);
            exml.ReplaceData(encryptedElement, output);
            doc.Save(filename);
        }

        public void Encrypt(string filename)加密函数
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(filename);
            RijndaelManaged Key = new RijndaelManaged();
            byte[] byteKey = Encoding.Unicode.GetBytes("1111111111111111");
            Key.Key = byteKey;
            string ElementName = doc.DocumentElement.Name;
            XmlElement elementToEncrypt = doc.GetElementsByTagName(ElementName)[0] as XmlElement;
            EncryptedXml eXml = new EncryptedXml();
            byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, Key, false);
            EncryptedData edElement = new EncryptedData();
            edElement.Type = EncryptedXml.XmlEncElementUrl;
            string encryptionMethod = null;
            if (Key is TripleDES)
            {
                encryptionMethod = EncryptedXml.XmlEncTripleDESUrl;
            }
            else if (Key is DES)
            {
                encryptionMethod = EncryptedXml.XmlEncDESUrl;
            }
            if (Key is Rijndael)
            {
                switch (Key.KeySize)
                {
                    case 128:
                        encryptionMethod = EncryptedXml.XmlEncAES128Url;
                        break;
                    case 192:
                        encryptionMethod = EncryptedXml.XmlEncAES192Url;
                        break;
                    case 256:
                        encryptionMethod = EncryptedXml.XmlEncAES256Url;
                        break;
                }
            }
            edElement.EncryptionMethod = new EncryptionMethod(encryptionMethod);
            edElement.CipherData.CipherValue = encryptedElement;
            EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
            doc.Save(filename);
        }

接下来就是在界面上添加button按钮,以便浏览你要操作的文件。

  private void btnBrowse_Click(object sender, RoutedEventArgs e)
        {
            FolderBrowserDialog FBD = new FolderBrowserDialog();
            FBD.Description = "请选择一个路径";
            if (FBD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtBrowse.Text = FBD.SelectedPath;
            }

        }

然后添加相应的加密解密按钮,对浏览到的文件进行加密或者解密。

    private void btnEncrypt_Click(object sender, RoutedEventArgs e)
        {
            string path = txtBrowse.Text;
            DirectoryInfo theFolder = new DirectoryInfo(path);

            FileInfo[] fileInfo = theFolder.GetFiles();

            foreach (FileInfo NextFile in fileInfo)  //遍历文件
            {
                Encrypt(NextFile.FullName);
            }
        }

        private void btnDecrypt_Click(object sender, RoutedEventArgs e)
        {
            string path = txtBrowse.Text;
            DirectoryInfo theFolder = new DirectoryInfo(path);

            FileInfo[] fileInfo = theFolder.GetFiles();

            foreach (FileInfo NextFile in fileInfo)  //遍历文件
            {
                Decrypt(NextFile.FullName);
            }
        }

后来博主为了练手,有添加一个改变文件后缀的功能:

        private void btnChangeFormat_Click(object sender, RoutedEventArgs e)
        {
            string destinationFormat = txtDestFormat.Text;
            string path = txtBrowse.Text;
            DirectoryInfo theFolder = new DirectoryInfo(path);

            FileInfo[] fileInfo = theFolder.GetFiles();
         
            foreach (FileInfo NextFile in fileInfo)  //遍历文件
            {
                string s = System.IO.Path.ChangeExtension(NextFile.FullName, destinationFormat);
                File.Move(NextFile.FullName, s);
            }
        }

好了,功能基本实现了。在这里就不截图软件的界面了,如果有需要的小伙伴可以留言