using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace BaseLibRWFile { /// /// AES加密解密 /// public class AES { #region 加密 #region 加密字符串 /// /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法) /// /// 待加密密文 /// 加密密钥 public static string AESEncrypt(string EncryptString, string EncryptKey) { return Convert.ToBase64String(AESEncrypt(Encoding.Default.GetBytes(EncryptString), EncryptKey)); } #endregion #region 加密字节数组 /// /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法) /// /// 待加密密文 /// 加密密钥 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); ICryptoTransform transform = m_AESProvider.CreateEncryptor(pdb.GetBytes(32), m_btIV); CryptoStream m_csstream = new CryptoStream(m_stream, transform, 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 解密字符串 /// /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法) /// /// 待解密密文 /// 解密密钥 public static string AESDecrypt(string DecryptString, string DecryptKey) { return Convert.ToBase64String(AESDecrypt(Encoding.Default.GetBytes(DecryptString), DecryptKey)); } #endregion #region 解密字节数组 /// /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法) /// /// 待解密密文 /// 解密密钥 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); ICryptoTransform transform = m_AESProvider.CreateDecryptor(pdb.GetBytes(32), m_btIV); CryptoStream m_csstream = new CryptoStream(m_stream, transform, 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 } /// /// 文件加密类 /// public class FileEncrypt { #region 变量 /// /// 一次处理的明文字节数 /// public static readonly int encryptSize = 10000000; /// /// 一次处理的密文字节数 /// public static readonly int decryptSize = 10000016; #endregion #region 加密文件 /// /// 加密文件 /// public static void EncryptFile(string path, string pwd) { try { if (File.Exists(path + ".temp")) File.Delete(path + ".temp"); using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { if (fs.Length > 0) { using (FileStream fsnew = new FileStream(path + ".temp", FileMode.OpenOrCreate, FileAccess.Write)) { if (File.Exists(path + ".temp")) File.SetAttributes(path + ".temp", FileAttributes.Hidden); int blockCount = ((int)fs.Length - 1) / encryptSize + 1; for (int i = 0; i < blockCount; i++) { 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); fsnew.Write(result, 0, result.Length); fsnew.Flush(); //refreshFileProgress(blockCount, i + 1); //更新进度 } fsnew.Close(); fsnew.Dispose(); } fs.Close(); fs.Dispose(); FileAttributes fileAttr = File.GetAttributes(path); File.SetAttributes(path, FileAttributes.Archive); File.Delete(path); File.Move(path + ".temp", path); File.SetAttributes(path, fileAttr); } } } catch (Exception ex) { File.Delete(path + ".temp"); throw ex; } } #endregion #region 解密文件 /// /// 解密文件 /// public static void DecryptFile(string path, string pwd) { try { if (File.Exists(path + ".temp")) File.Delete(path + ".temp"); using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { if (fs.Length > 0) { using (FileStream fsnew = new FileStream(path + ".temp", FileMode.OpenOrCreate, FileAccess.Write)) { if (File.Exists(path + ".temp")) File.SetAttributes(path + ".temp", FileAttributes.Hidden); int blockCount = ((int)fs.Length - 1) / decryptSize + 1; for (int i = 0; i < blockCount; i++) { 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); fsnew.Write(result, 0, result.Length); fsnew.Flush(); //refreshFileProgress(blockCount, i + 1); //更新进度 } fsnew.Close(); fsnew.Dispose(); } fs.Close(); fs.Dispose(); FileAttributes fileAttr = File.GetAttributes(path); File.SetAttributes(path, FileAttributes.Archive); File.Delete(path); File.Move(path + ".temp", path); File.SetAttributes(path, fileAttr); } } } catch (Exception ex) { File.Delete(path + ".temp"); throw ex; } } #endregion } /// /// 更新文件加密进度 /// public delegate void RefreshFileProgress(int max, int value); /// /// 文件夹加密类 /// public class DirectoryEncrypt { #region 加密文件夹及其子文件夹中的所有文件 /// /// 加密文件夹及其子文件夹中的所有文件 /// public static void EncryptDirectory(string dirPath, string pwd, RefreshDirProgress refreshDirProgress, RefreshFileProgress refreshFileProgress) { string[] filePaths = Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories); for (int i = 0; i < filePaths.Length; i++) { FileEncrypt.EncryptFile(filePaths[i], pwd); refreshDirProgress(filePaths.Length, i + 1); } } #endregion #region 解密文件夹及其子文件夹中的所有文件 /// /// 解密文件夹及其子文件夹中的所有文件 /// public static void DecryptDirectory(string dirPath, string pwd, RefreshDirProgress refreshDirProgress, RefreshFileProgress refreshFileProgress) { string[] filePaths = Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories); for (int i = 0; i < filePaths.Length; i++) { FileEncrypt.DecryptFile(filePaths[i], pwd); refreshDirProgress(filePaths.Length, i + 1); } } #endregion } /// /// 更新文件夹加密进度 /// public delegate void RefreshDirProgress(int max, int value); }