文本文件的加密与解密

文本文件的加密与解密_第1张图片
首先必须使用命名空间 System.Security.Cryptography;其中包含实现安全的类,如加密解密,管理密钥,验证数据完整性等等。在加密和解密本地文档时使用Rijndael对称算法。而System.IO则是用于访问文件和创建访问文件数据流等。
设计的窗体界面如下图所示,提前新建一个txt文本文件作为所要选择的文件,此代码可对加密后的文件进行保存和删除源文件。

using System.IO;
namespace 文本文件加密与解密
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //选择加密解密文件路径
        private void button3_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "文本文件|*.txt|*.*|*.*";//筛选文本文件
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;//获取对话框文件名
            }  
        }
        //加密
        private void button5_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            { MessageBox.Show("请选择要加密的文件"); }
            else
            {
                try
                {
                    string strPath = textBox1.Text;//加密文件的路径
                    int intLent = strPath.LastIndexOf("\\") + 1;//设置截取字符串的起始位置
                    int intLong = strPath.Length;//设置截取长度
                    string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名称
                    int intTxt = strName.LastIndexOf(".");
                    int intTextLeng = strName.Length;//截取长度
                    string strTxt = strName.Substring(intTxt, intTextLeng - intTxt);//取出文件的扩展名
                    strName = strName.Substring(0, intTxt);
                    //加密后的文件名及路径
                    string strOutName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + "Out" + strTxt;
                    byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 };
                    byte[] IV = { 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 };
                   
                    //RijndaelManaged 该类是访问 System.Security.Cryptography.Rijndael 对称加密算法的托管版本
                    RijndaelManaged myRijndael = new RijndaelManaged();
                    FileStream fsOut = File.Open(strOutName, FileMode.Create, FileAccess.Write);
                    FileStream fsIn = File.Open(strPath, FileMode.Open, FileAccess.Read);
                    
                    //写入加密文本文件
                    CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateEncryptor(key, IV), CryptoStreamMode.Write);
                    //读加密文本
                    BinaryReader br = new BinaryReader(fsIn);//从要加密流读取文件内容
                    csDecrypt.Write(br.ReadBytes((int)fsIn.Length), 0, (int)fsIn.Length);
                    csDecrypt.FlushFinalBlock();
                    csDecrypt.Close();
                    fsIn.Close();
                    fsOut.Close();
                    if (MessageBox.Show(strOutName, "提示:加密成功!加密后的文件名及路径为:\n" + "是否册除源文件", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        File.Delete(strPath);
                        textBox1.Text = "";
                    }
                    else
                    { textBox1.Text = ""; }
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message);
                }
            }
        }

        //解密
        private void button4_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                MessageBox.Show("请选择要解密的文件路径");
            }
            else
            {
                string strPath = textBox1.Text;//解密文件的路径
                int intLent = strPath.LastIndexOf("\\") + 1;//设置截取字符串的起始位置
                int intLong = strPath.Length;//设置截取长度
                string strName = strPath.Substring(intLent, intLong - intLent);//要解密的文件名称
                int intTxt = strName.LastIndexOf(".");
                int intTextLeng = strName.Length; 
                strName = strName.Substring(0, intTxt);
               
          
                if (strName.LastIndexOf("Out") != -1)
                {
                    strName = strName.Substring(0, strName.LastIndexOf("Out"));
                    
                }
                else
                {
                    strName = strName + "In";
                }
                //加密后的文件名及路径
                string strInName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + ".txt";
                //加密文件密钥
                byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 };
                byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 };
                RijndaelManaged myRijndael = new RijndaelManaged();
                FileStream fsOut = File.Open(strPath, FileMode.Open, FileAccess.Read);
                CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key, IV), CryptoStreamMode.Read);
                StreamReader sr = new StreamReader(csDecrypt);//把文件读出来
                StreamWriter sw = new StreamWriter(strInName);//解密后文件写入一个新的文件
                sw.Write(sr.ReadToEnd());
                sw.Flush();
                sw.Close();
                sr.Close();
                fsOut.Close();
                if (MessageBox.Show(strInName, "提示:解密成功!解密后的文件名及路径为:" + "是否册除源文件", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {//删除指定文件,清除文本框
                    File.Delete(strPath);
                    textBox1.Text = "";
                }
                else
                {
                    textBox1.Text = "";
                }

            }
        }
    }
}

你可能感兴趣的:(C#)