/// <summary>
/// 使用 AES 加密算法替檔案進行加密解密的一個類
/// </summary>
class AesSecretor : Secretor {
/// <summary>
/// AES 加密的機密密鑰
/// </summary>
private const string strPassKey = "1234567890123456";
/// <summary>
/// AES 加密對象
/// </summary>
private System.Security.Cryptography.Aes myAes = null;
/// <summary>
/// 初始化 Ben.AESSecretor 類的一個新執行個體
/// </summary>
public AesSecretor() { InitializeAES(); }
/// <summary>
/// 初始化 myAes 加密對象
/// </summary>
private void InitializeAES() {
byte[] myAesIV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
byte[] myAesKey = UTF8Encoding.UTF8.GetBytes(strPassKey);
this.myAes = new AesCryptoServiceProvider();
this.myAes.IV = myAesIV;
this.myAes.Key = myAesKey;
}
/// <summary>
/// 使用 AES 對檔案進行加密
/// </summary>
/// <param name="sourceFileName">要加密的源檔案</param>
/// <param name="enFileName">加密後得到的檔案</param>
public override void EncryptFile(string sourceFileName, string enFileName) {
//InitializeAES();
HandleEnDeCrypt(sourceFileName, enFileName, myAes.CreateEncryptor());
}
/// <summary>
/// 使用 AES 對檔案進行解密
/// </summary>
/// <param name="sourceFileName">要解密的源檔案</param>
/// <param name="deFileName">解密後得到的檔案</param>
public override void DecryptFile(string sourceFileName, string deFileName) {
//InitializeAES();
HandleEnDeCrypt(sourceFileName, deFileName, myAes.CreateDecryptor());
}
/// <summary>
/// 處理檔案加密(解密)
/// </summary>
/// <param name="sFileName">源檔案</param>
/// <param name="getfilename">加密(解密)後的檔案</param>
/// <param name="transform">加密(解密)轉換運算</param>
private void HandleEnDeCrypt(string sFileName, string gfilename, ICryptoTransform transform) {
if (sFileName == null || gfilename == null) throw new ArgumentNullException();
else if (!File.Exists(sFileName)) throw new FileNotFoundException();
else {
//檔案輸入輸出流
FileStream myInputStream = null;
FileStream myOutputStream = null;
CryptoStream cryptoStream = null;
//定義一個緩沖區位元組數組
byte[] insertArr = new byte[1024];
try {
myInputStream = new FileStream(sFileName, FileMode.Open, FileAccess.Read);
myOutputStream = new FileStream(gfilename, FileMode.Create, FileAccess.Write);
//檔案流的總長度
long allFileLength = myInputStream.Length;
//已讀取的流的長度
int completedLength = 0;
//每次讀取的流的長度
int readLength = 0;
//建立檔案加密轉換流,開始資料流的轉換
cryptoStream = new CryptoStream(myOutputStream, transform, CryptoStreamMode.Write);
while (completedLength < allFileLength) {
readLength = myInputStream.Read(insertArr, 0, insertArr.Length);
cryptoStream.Write(insertArr, 0, readLength);
completedLength += readLength;
}
}
catch { throw; }
finally {
//關閉檔案流,釋放資源
if (cryptoStream != null) cryptoStream.Close();
if (myOutputStream != null) myOutputStream.Close();
if (myInputStream != null) myInputStream.Close();
}
}
}
}