天天看點

使用AES加密标準對檔案加密

    /// <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();

                }

            }

        }

    }