首页 > 代码库 > 文件加密

文件加密

代码:

1、AES加密类

using System;using System.IO;using System.Security.Cryptography;using System.Text;namespace Utils{    /// <summary>    /// AES加密解密    /// </summary>    public class AES    {        #region 加密        #region 加密字符串        /// <summary>        /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)        /// </summary>        /// <param name="EncryptString">待加密密文</param>        /// <param name="EncryptKey">加密密钥</param>        public static string AESEncrypt(string EncryptString, string EncryptKey)        {            return Convert.ToBase64String(AESEncrypt(Encoding.Default.GetBytes(EncryptString), EncryptKey));        }        #endregion        #region 加密字节数组        /// <summary>        /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)        /// </summary>        /// <param name="EncryptString">待加密密文</param>        /// <param name="EncryptKey">加密密钥</param>        public static byte[] AESEncrypt(byte[] EncryptByte, string EncryptKey)        {            if (EncryptByte.Length == 0) { throw (new Exception("明文不得为空")); }            if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }            byte[] m_strEncrypt;            byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");            byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");            Rijndael m_AESProvider = Rijndael.Create();            try            {                MemoryStream m_stream = new MemoryStream();                PasswordDeriveBytes pdb = new PasswordDeriveBytes(EncryptKey, m_salt, "SHA256", 1000);                CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(pdb.GetBytes(32), m_btIV), CryptoStreamMode.Write);                m_csstream.Write(EncryptByte, 0, EncryptByte.Length); m_csstream.FlushFinalBlock();                m_strEncrypt = m_stream.ToArray();                m_stream.Close(); m_stream.Dispose();                m_csstream.Close(); m_csstream.Dispose();            }            catch (IOException ex) { throw ex; }            catch (CryptographicException ex) { throw ex; }            catch (ArgumentException ex) { throw ex; }            catch (Exception ex) { throw ex; }            finally { m_AESProvider.Clear(); }            return m_strEncrypt;        }        #endregion        #endregion        #region 解密        #region 解密字符串        /// <summary>        /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)        /// </summary>        /// <param name="DecryptString">待解密密文</param>        /// <param name="DecryptKey">解密密钥</param>        public static string AESDecrypt(string DecryptString, string DecryptKey)        {            return Convert.ToBase64String(AESDecrypt(Encoding.Default.GetBytes(DecryptString), DecryptKey));        }        #endregion        #region 解密字节数组        /// <summary>        /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)        /// </summary>        /// <param name="DecryptString">待解密密文</param>        /// <param name="DecryptKey">解密密钥</param>        public static byte[] AESDecrypt(byte[] DecryptByte, string DecryptKey)        {            if (DecryptByte.Length == 0) { throw (new Exception("密文不得为空")); }            if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }            byte[] m_strDecrypt;            byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");            byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");            Rijndael m_AESProvider = Rijndael.Create();            try            {                MemoryStream m_stream = new MemoryStream();                PasswordDeriveBytes pdb = new PasswordDeriveBytes(DecryptKey, m_salt, "SHA256", 1000);                CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(pdb.GetBytes(32), m_btIV), CryptoStreamMode.Write);                m_csstream.Write(DecryptByte, 0, DecryptByte.Length); m_csstream.FlushFinalBlock();                m_strDecrypt = m_stream.ToArray();                m_stream.Close(); m_stream.Dispose();                m_csstream.Close(); m_csstream.Dispose();            }            catch (IOException ex) { throw ex; }            catch (CryptographicException ex) { throw ex; }            catch (ArgumentException ex) { throw ex; }            catch (Exception ex) { throw ex; }            finally { m_AESProvider.Clear(); }            return m_strDecrypt;        }        #endregion        #endregion    }}
View Code

2、文件加密类

using System.IO;using System;namespace Utils{    /// <summary>    /// 文件加密类    /// </summary>    public class FileEncrypt    {        #region 变量        /// <summary>        /// 一次处理的明文字节数        /// </summary>        public static readonly int encryptSize = 10000000;        /// <summary>        /// 一次处理的密文字节数        /// </summary>        public static readonly int decryptSize = 10000016;        #endregion        #region 加密文件        /// <summary>        /// 加密文件        /// </summary>        public static void EncryptFile(string path, string pwd, RefreshFileProgress refreshFileProgress)        {            try            {                if (File.Exists(path + ".temp")) File.Delete(path + ".temp");                using (FileStream fsTemp = new FileStream(path + ".temp", FileMode.Create))                {                    File.SetAttributes(path + ".temp", FileAttributes.Hidden);                }                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))                {                    int blockCount = ((int)fs.Length - 1) / encryptSize + 1;                    for (int i = 0; i < blockCount; i++)                    {                        fs.Seek(i * encryptSize, SeekOrigin.Begin);                        int size = encryptSize;                        if (i == blockCount - 1) size = (int)(fs.Length - i * encryptSize);                        byte[] bArr = new byte[size];                        fs.Read(bArr, 0, size);                        byte[] result = AES.AESEncrypt(bArr, pwd);                        using (FileStream fsnew = new FileStream(path + ".temp", FileMode.Append, FileAccess.Write))                        {                            fsnew.Write(result, 0, result.Length);                            fsnew.Flush();                        }                        refreshFileProgress(blockCount, i + 1); //更新进度                    }                }                File.Delete(path);                File.Move(path + ".temp", path);                File.SetAttributes(path, FileAttributes.Archive);            }            catch (Exception ex)            {                File.Delete(path + ".temp");                throw ex;            }        }        #endregion        #region 解密文件        /// <summary>        /// 解密文件        /// </summary>        public static void DecryptFile(string path, string pwd, RefreshFileProgress refreshFileProgress)        {            try            {                if (File.Exists(path + ".temp")) File.Delete(path + ".temp");                using (FileStream fsc = new FileStream(path + ".temp", FileMode.Create))                {                    File.SetAttributes(path + ".temp", FileAttributes.Hidden);                }                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))                {                    int blockCount = ((int)fs.Length - 1) / decryptSize + 1;                    for (int i = 0; i < blockCount; i++)                    {                        fs.Seek(i * decryptSize, SeekOrigin.Begin);                        int size = decryptSize;                        if (i == blockCount - 1) size = (int)(fs.Length - i * decryptSize);                        byte[] bArr = new byte[size];                        fs.Read(bArr, 0, size);                        byte[] result = AES.AESDecrypt(bArr, pwd);                        using (FileStream fsnew = new FileStream(path + ".temp", FileMode.Append, FileAccess.Write))                        {                            fsnew.Write(result, 0, result.Length);                            fsnew.Flush();                        }                        refreshFileProgress(blockCount, i + 1); //更新进度                    }                }                File.Delete(path);                File.Move(path + ".temp", path);                File.SetAttributes(path, FileAttributes.Archive);            }            catch (Exception ex)            {                File.Delete(path + ".temp");                throw ex;            }        }        #endregion    }    /// <summary>    /// 更新文件加密进度    /// </summary>    public delegate void RefreshFileProgress(int max, int value);}
View Code

3、跨线程访问控制委托

using System;using System.Windows.Forms;namespace Utils{    /// <summary>    /// 跨线程访问控件的委托    /// </summary>    public delegate void InvokeDelegate();    /// <summary>    /// 跨线程访问控件类    /// </summary>    public class InvokeUtil    {        /// <summary>        /// 跨线程访问控件        /// </summary>        /// <param name="ctrl">Form对象</param>        /// <param name="de">委托</param>        public static void Invoke(Control ctrl, Delegate de)        {            if (ctrl.IsHandleCreated)            {                ctrl.BeginInvoke(de);            }        }    }}
View Code

4、Form1.cs

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;using Utils;using System.Threading;using EncryptFile.Utils;namespace EncryptFile{    public partial class Form1 : Form    {        #region 变量        /// <summary>        /// 一次处理的明文字节数        /// </summary>        public static int encryptSize = 10000000;        /// <summary>        /// 一次处理的密文字节数        /// </summary>        public static int decryptSize = 10000016;        #endregion        #region 构造函数        public Form1()        {            InitializeComponent();        }        #endregion        #region 加密文件        private void btnEncrypt_Click(object sender, EventArgs e)        {            #region 验证            if (txtPwd.Text == "")            {                MessageBox.Show("密码不能为空", "提示");                return;            }            if (txtPwdCfm.Text == "")            {                MessageBox.Show("确认密码不能为空", "提示");                return;            }            if (txtPwdCfm.Text != txtPwd.Text)            {                MessageBox.Show("两次输入的密码不相同", "提示");                return;            }            #endregion            if (openFileDialog1.ShowDialog() == DialogResult.OK)            {                Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)                {                    try                    {                        InvokeDelegate invokeDelegate = delegate()                        {                            pbFile.Value = 0;                            lblProgressFile.Text = "0%";                            pbDir.Visible = false;                            lblProgressDir.Visible = false;                            pbFile.Visible = false;                            lblProgressFile.Visible = false;                            lblShowPath.Text = "文件:" + openFileDialog1.FileName;                            lblShowPath.Visible = true;                            DisableBtns();                        };                        InvokeUtil.Invoke(this, invokeDelegate);                        DateTime t1 = DateTime.Now;                        FileEncrypt.EncryptFile(openFileDialog1.FileName, txtPwd.Text, RefreshFileProgress);                        DateTime t2 = DateTime.Now;                        string t = t2.Subtract(t1).TotalSeconds.ToString("0.00");                        if (MessageBox.Show("加密成功,耗时" + t + "", "提示") == DialogResult.OK)                        {                            invokeDelegate = delegate()                            {                                EnableBtns();                            };                            InvokeUtil.Invoke(this, invokeDelegate);                        }                    }                    catch (Exception ex)                    {                        if (MessageBox.Show("加密失败:" + ex.Message, "提示") == DialogResult.OK)                        {                            InvokeDelegate invokeDelegate = delegate()                            {                                EnableBtns();                            };                            InvokeUtil.Invoke(this, invokeDelegate);                        }                    }                }));                thread.Start();            }        }        #endregion        #region 解密文件        private void btnDecrypt_Click(object sender, EventArgs e)        {            #region 验证            if (txtPwd.Text == "")            {                MessageBox.Show("密码不能为空", "提示");                return;            }            #endregion            if (openFileDialog1.ShowDialog() == DialogResult.OK)            {                Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)                {                    try                    {                        InvokeDelegate invokeDelegate = delegate()                        {                            pbFile.Value = 0;                            lblProgressFile.Text = "0%";                            pbDir.Visible = false;                            lblProgressDir.Visible = false;                            pbFile.Visible = false;                            lblProgressFile.Visible = false;                            lblShowPath.Text = "文件:" + openFileDialog1.FileName;                            lblShowPath.Visible = true;                            DisableBtns();                        };                        InvokeUtil.Invoke(this, invokeDelegate);                        DateTime t1 = DateTime.Now;                        FileEncrypt.DecryptFile(openFileDialog1.FileName, txtPwd.Text, RefreshFileProgress);                        DateTime t2 = DateTime.Now;                        string t = t2.Subtract(t1).TotalSeconds.ToString("0.00");                        if (MessageBox.Show("解密成功,耗时" + t + "", "提示") == DialogResult.OK)                        {                            invokeDelegate = delegate()                            {                                EnableBtns();                            };                            InvokeUtil.Invoke(this, invokeDelegate);                        }                    }                    catch (Exception ex)                    {                        if (MessageBox.Show("解密失败:" + ex.Message, "提示") == DialogResult.OK)                        {                            InvokeDelegate invokeDelegate = delegate()                            {                                EnableBtns();                            };                            InvokeUtil.Invoke(this, invokeDelegate);                        }                    }                }));                thread.Start();            }        }        #endregion        #region 文件夹加密        private void btnEncryptDir_Click(object sender, EventArgs e)        {            #region 验证            if (txtPwd.Text == "")            {                MessageBox.Show("密码不能为空", "提示");                return;            }            if (txtPwdCfm.Text == "")            {                MessageBox.Show("确认密码不能为空", "提示");                return;            }            if (txtPwdCfm.Text != txtPwd.Text)            {                MessageBox.Show("两次输入的密码不相同", "提示");                return;            }            #endregion            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)            {                if (MessageBox.Show(string.Format("确定加密文件夹{0}?", folderBrowserDialog1.SelectedPath),                    "提示", MessageBoxButtons.OKCancel) == DialogResult.Cancel)                {                    return;                }                Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)                {                    try                    {                        InvokeDelegate invokeDelegate = delegate()                        {                            pbDir.Value = 0;                            lblProgressDir.Text = "0%";                            pbFile.Value = 0;                            lblProgressFile.Text = "0%";                            pbDir.Visible = true;                            lblProgressDir.Visible = true;                            pbFile.Visible = false;                            lblProgressFile.Visible = false;                            lblShowPath.Text = "文件夹:" + folderBrowserDialog1.SelectedPath;                            lblShowPath.Visible = true;                            DisableBtns();                        };                        InvokeUtil.Invoke(this, invokeDelegate);                        DateTime t1 = DateTime.Now;                        DirectoryEncrypt.EncryptDirectory(folderBrowserDialog1.SelectedPath, txtPwd.Text, RefreshDirProgress, RefreshFileProgress);                        DateTime t2 = DateTime.Now;                        string t = t2.Subtract(t1).TotalSeconds.ToString("0.00");                        if (MessageBox.Show("加密成功,耗时" + t + "", "提示") == DialogResult.OK)                        {                            invokeDelegate = delegate()                            {                                EnableBtns();                            };                            InvokeUtil.Invoke(this, invokeDelegate);                        }                    }                    catch (Exception ex)                    {                        if (MessageBox.Show("加密失败:" + ex.Message, "提示") == DialogResult.OK)                        {                            InvokeDelegate invokeDelegate = delegate()                            {                                EnableBtns();                            };                            InvokeUtil.Invoke(this, invokeDelegate);                        }                    }                }));                thread.Start();            }        }        #endregion        #region 文件夹解密        private void btnDecryptDir_Click(object sender, EventArgs e)        {            #region 验证            if (txtPwd.Text == "")            {                MessageBox.Show("密码不能为空", "提示");                return;            }            #endregion            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)            {                if (MessageBox.Show(string.Format("确定解密文件夹{0}?", folderBrowserDialog1.SelectedPath),                    "提示", MessageBoxButtons.OKCancel) == DialogResult.Cancel)                {                    return;                }                Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)                {                    try                    {                        InvokeDelegate invokeDelegate = delegate()                        {                            pbDir.Value = 0;                            lblProgressDir.Text = "0%";                            pbFile.Value = 0;                            lblProgressFile.Text = "0%";                            pbDir.Visible = true;                            lblProgressFile.Visible = true;                            pbFile.Visible = false;                            lblProgressFile.Visible = false;                            lblShowPath.Text = "文件夹:" + folderBrowserDialog1.SelectedPath;                            lblShowPath.Visible = true;                            DisableBtns();                        };                        InvokeUtil.Invoke(this, invokeDelegate);                        DateTime t1 = DateTime.Now;                        DirectoryEncrypt.DecryptDirectory(folderBrowserDialog1.SelectedPath, txtPwd.Text, RefreshDirProgress, RefreshFileProgress);                        DateTime t2 = DateTime.Now;                        string t = t2.Subtract(t1).TotalSeconds.ToString("0.00");                        if (MessageBox.Show("解密成功,耗时" + t + "", "提示") == DialogResult.OK)                        {                            invokeDelegate = delegate()                            {                                EnableBtns();                            };                            InvokeUtil.Invoke(this, invokeDelegate);                        }                    }                    catch (Exception ex)                    {                        if (MessageBox.Show("解密失败:" + ex.Message, "提示") == DialogResult.OK)                        {                            InvokeDelegate invokeDelegate = delegate()                            {                                EnableBtns();                            };                            InvokeUtil.Invoke(this, invokeDelegate);                        }                    }                }));                thread.Start();            }        }        #endregion        #region 更新文件加密进度        /// <summary>        /// 更新文件加密进度        /// </summary>        public void RefreshFileProgress(int max, int value)        {            InvokeDelegate invokeDelegate = delegate()            {                if (max > 1)                {                    pbFile.Visible = true;                    lblProgressFile.Visible = true;                }                else                {                    pbFile.Visible = false;                    lblProgressFile.Visible = false;                }                pbFile.Maximum = max;                pbFile.Value = value;                lblProgressFile.Text = value * 100 / max + "%";            };            InvokeUtil.Invoke(this, invokeDelegate);        }        #endregion        #region 更新文件夹加密进度        /// <summary>        /// 更新文件夹加密进度        /// </summary>        public void RefreshDirProgress(int max, int value)        {            InvokeDelegate invokeDelegate = delegate()            {                pbDir.Maximum = max;                pbDir.Value = value;                lblProgressDir.Text = value * 100 / max + "%";            };            InvokeUtil.Invoke(this, invokeDelegate);        }        #endregion        #region 显示密码        private void cbxShowPwd_CheckedChanged(object sender, EventArgs e)        {            if (cbxShowPwd.Checked)            {                txtPwd.PasswordChar = default(char);                txtPwdCfm.PasswordChar = default(char);            }            else            {                txtPwd.PasswordChar = *;                txtPwdCfm.PasswordChar = *;            }        }        #endregion        #region 关闭窗体事件        private void Form1_FormClosing(object sender, FormClosingEventArgs e)        {            if (progressPanel.Visible)            {                MessageBox.Show("正在处理文件,请等待…", "提示");                e.Cancel = true;            }        }        #endregion        #region 控制按钮状态        /// <summary>        /// 禁用按钮        /// </summary>        public void DisableBtns()        {            progressPanel.Visible = true;            btnEncrypt.Enabled = false;            btnDecrypt.Enabled = false;            btnEncryptDir.Enabled = false;            btnDecryptDir.Enabled = false;        }        /// <summary>        /// 启用按钮        /// </summary>        public void EnableBtns()        {            lblShowPath.Visible = false;            progressPanel.Visible = false;            btnEncrypt.Enabled = true;            btnDecrypt.Enabled = true;            btnEncryptDir.Enabled = true;            btnDecryptDir.Enabled = true;        }        #endregion    }}
View Code

 源码:

http://files.cnblogs.com/s0611163/%E6%96%87%E4%BB%B6%E5%8A%A0%E5%AF%86%E6%BA%90%E7%A0%812014%E5%B9%B410%E6%9C%8817%E6%97%A5.zip

文件加密