DES、3DES 加解密;MAC算法

常用的通訊加密算法


    /// <summary>
    /// DES、3DES 加解密;MAC算法
    /// </summary>
    public sealed class DES_Cryptographycs
    {
        #region --- 字段 Begin ---

        private PaddingMode mPaddingMode;
        private CipherMode mCipherMode;
        private byte[] mbyKey;
        private byte[] mbyIV;

        #endregion --- 字段 End ---

        #region --- 構造方法 Begin ---

        /// <summary>
        /// 構造函數
        /// </summary>
        public DES_Cryptographycs()
        {
            this.mbyIV = new byte[8];
            this.mbyKey = new byte[8];
            this.mCipherMode = CipherMode.CBC;
            this.mPaddingMode = PaddingMode.None;
        }

        #endregion --- 構造方法 End ---

        #region --- 屬性 Begin ---

        /// <summary>
        /// DES指定用於加密的塊密碼模式
        /// </summary>
        public CipherMode CipherMode
        {
            get
            {
                return this.mCipherMode;
            }
            set
            {
                this.mCipherMode = value;
            }
        }

        /// <summary>
        /// 指定在消息數據塊比加密操作所需的全部字節數短時應用的填充類型
        /// </summary>
        public PaddingMode PaddingMode
        {
            get
            {
                return this.mPaddingMode;
            }
            set
            {
                this.mPaddingMode = value;
            }
        }

        /// <summary>
        /// 密鑰
        /// </summary>
        public byte[] Key
        {
            get
            {
                return this.mbyKey;
            }
            set
            {
                this.mbyKey = value;
            }
        }

        /// <summary>
        /// 初始化向量
        /// </summary>
        public byte[] IV
        {
            get
            {
                return this.mbyIV;
            }
            set
            {
                this.mbyIV = value;
            }
        }

        #endregion --- 屬性 End ---

        #region --- DES 加解密 Begin ---

        /// <summary>
        /// DES
        /// </summary>
        /// <param name="data">源數據</param>
        /// <returns>返回加密結果</returns>
        public byte[] DES_Encrypt(byte[] data)
        {
            try
            {
                DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
                //計算des加密所採用的算法
                MyServiceProvider.Mode = this.mCipherMode;
                //計算填充類型
                MyServiceProvider.Padding = this.mPaddingMode;
                //創建加密對象
                ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(this.mbyKey, mbyIV);
                //CryptoStream對象的作用是將數據流連接到加密轉換的流
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                    //將字節數組中的數據寫入到加密流中
                    MyCryptoStream.Write(data, 0, data.Length);
                    MyCryptoStream.FlushFinalBlock();
                    MyCryptoStream.Close();
                    byte[] byEncRet = ms.ToArray();
                    ms.Close();
                    return byEncRet;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="data">加密後數據</param>
        /// <returns>返回解密結果</returns>
        public byte[] DES_Decrypt(byte[] data)
        {
            try
            {
                DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
                //計算des加密所採用的算法
                MyServiceProvider.Mode = this.mCipherMode;
                //計算填充類型
                MyServiceProvider.Padding = this.mPaddingMode;
                //創建解密對象
                ICryptoTransform MyTransform = MyServiceProvider.CreateDecryptor(this.mbyKey, mbyIV);
                //CryptoStream對象的作用是將數據流連接到加密轉換的流
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                    //將字節數組中的數據寫入到加密流中
                    MyCryptoStream.Write(data, 0, data.Length);
                    MyCryptoStream.FlushFinalBlock();
                    MyCryptoStream.Close();
                    byte[] byEncRet = ms.ToArray();
                    ms.Close();
                    return byEncRet;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion --- DES 加解密 End ---

        #region --- MAC 算法 Begin ---

        /// <summary>
        /// MAC計算所要採用的CBC DES算法實現加密
        /// </summary>
        /// <param name="key">Key數據</param>
        /// <param name="data">原數據</param>
        /// <returns>返回加密後結果</returns>
        public byte[] HCDES_Encrypt(byte[] key, byte[] data)
        {
            try
            {
                //創建一個DES算法的加密類
                DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
                MyServiceProvider.Mode = CipherMode.CBC;
                MyServiceProvider.Padding = PaddingMode.None;
                //從DES算法的加密類對象的CreateEncryptor方法,創建一個加密轉換接口對象
                //第一個參數的含義是:對稱算法的機密密鑰(長度爲64位,也就是8個字節)
                // 可以人工輸入,也可以隨機生成方法是:MyServiceProvider.GenerateKey();
                //第二個參數的含義是:對稱算法的初始化向量(長度爲64位,也就是8個字節)
                // 可以人工輸入,也可以隨機生成方法是:MyServiceProvider.GenerateIV()
                //創建加密對象
                ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(key, new byte[8]);
                //CryptoStream對象的作用是將數據流連接到加密轉換的流
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                    //將字節數組中的數據寫入到加密流中
                    MyCryptoStream.Write(data, 0, data.Length);
                    //MyCryptoStream關閉之前ms.Length 爲8, 關閉之後爲16
                    MyCryptoStream.FlushFinalBlock();
                    MyCryptoStream.Close();
                    byte[] bTmp = ms.ToArray();
                    ms.Close();
                    return bTmp;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
        /// <summary>
        /// MAC計算所要採用的CBC DES算法實現解密
        /// </summary>
        /// <param name="key">Key數據</param>
        /// <param name="data">加密後數據</param>
        /// <returns>返回解密結果</returns>
        public byte[] HCDES_Decrypt(byte[] key, byte[] data)
        {
            try
            {
                //創建一個DES算法的加密類
                DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
                MyServiceProvider.Mode = CipherMode.CBC;
                MyServiceProvider.Padding = PaddingMode.None;
                //從DES算法的加密類對象的CreateEncryptor方法,創建一個加密轉換接口對象
                //第一個參數的含義是:對稱算法的機密密鑰(長度爲64位,也就是8個字節)
                // 可以人工輸入,也可以隨機生成方法是:MyServiceProvider.GenerateKey();
                //第二個參數的含義是:對稱算法的初始化向量(長度爲64位,也就是8個字節)
                // 可以人工輸入,也可以隨機生成方法是:MyServiceProvider.GenerateIV()
                //創建解密對象
                ICryptoTransform MyTransform = MyServiceProvider.CreateDecryptor(key, new byte[8]);
                //CryptoStream對象的作用是將數據流連接到加密轉換的流
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                    //將字節數組中的數據寫入到解密流中
                    MyCryptoStream.Write(data, 0, data.Length);
                    // MyCryptoStream關閉之前ms.Length 爲8, 關閉之後爲16
                    MyCryptoStream.FlushFinalBlock();
                    MyCryptoStream.Close();
                    byte[] bTmp = ms.ToArray();
                    ms.Close();
                    return bTmp;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// MAC計算 (ANSI-X9.9-MAC)
        /// </summary>
        /// <param name="data">數據</param>
        /// <returns>返回該數據MAC值</returns>
        public byte[] GetMAC(byte[] data)
        {
            try
            {
                int iGroup = 0;
                byte[] bKey = this.mbyKey;
                byte[] bIV = this.mbyIV;
                byte[] bTmpBuf1 = new byte[8];
                byte[] bTmpBuf2 = new byte[8];
                // init
                Array.Copy(bIV, bTmpBuf1, 8);
                if ((data.Length % 8 == 0))
                {
                    iGroup = data.Length / 8;
                }
                else
                {
                    iGroup = data.Length / 8 + 1;
                }
                int i = 0;
                int j = 0;
                for (i = 0; i < iGroup; i++)
                {
                    Array.Copy(data, 8 * i, bTmpBuf2, 0, 8);
                    for (j = 0; j < 8; j++)
                    {
                        bTmpBuf1[j] = (byte)(bTmpBuf1[j] ^ bTmpBuf2[j]);
                    }
                    bTmpBuf2 = HCDES_Encrypt(bKey, bTmpBuf1);
                    Array.Copy(bTmpBuf2, bTmpBuf1, 8);
                }
                return bTmpBuf2;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion --- MAC 算法 End ---

        #region --- 3DES 加解密 Begin ---

        /// <summary>
        /// 3DES加密
        /// </summary>
        /// <param name="data">原數據</param>
        /// <returns>返回加密結果</returns>
        public byte[] TripleDES_Encrypt(byte[] data)
        {
            try
            {
                TripleDESCryptoServiceProvider MyServiceProvider = new TripleDESCryptoServiceProvider();
                //計算des加密所採用的算法
                MyServiceProvider.Mode = this.mCipherMode;
                //計算填充類型
                MyServiceProvider.Padding = this.mPaddingMode;
                //TripleDESCryptoServiceProvider
                //支持從 128 位到 192 位(以 64 位遞增)的密鑰長度
                //IV需要8個字節
                //設置KEY時要注意的是可能引發CryptographicException異常,主要是因爲所設置的KEY爲WeakKey
                ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(this.mbyKey, mbyIV);
                //CryptoStream對象的作用是將數據流連接到加密轉換的流
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                    //將字節數組中的數據寫入到加密流中
                    MyCryptoStream.Write(data, 0, data.Length);
                    MyCryptoStream.FlushFinalBlock();
                    MyCryptoStream.Close();
                    byte[] byEncRet = ms.ToArray();
                    ms.Close();
                    return byEncRet;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 3DES解密
        /// </summary>
        /// <param name="data">加密後數據</param>
        /// <returns>返回解密結果</returns>
        public byte[] TripleDES_Decrypt(byte[] data)
        {
            try
            {
                TripleDESCryptoServiceProvider MyServiceProvider = new TripleDESCryptoServiceProvider();
                //計算des加密所採用的算法
                MyServiceProvider.Mode = this.mCipherMode;
                //計算填充類型
                MyServiceProvider.Padding = this.mPaddingMode;
                //TripleDESCryptoServiceProvider
                //支持從 128 位到 192 位(以 64 位遞增)的密鑰長度
                //IV需要8個字節
                //設置KEY時要注意的是可能引發CryptographicException異常,主要是因爲所設置的KEY爲WeakKey
                ICryptoTransform MyTransform = MyServiceProvider.CreateDecryptor(this.mbyKey, mbyIV);
                //CryptoStream對象的作用是將數據流連接到加密轉換的流
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
                    //將字節數組中的數據寫入到加密流中
                    MyCryptoStream.Write(data, 0, data.Length);
                    MyCryptoStream.FlushFinalBlock();
                    MyCryptoStream.Close();
                    byte[] byEncRet = ms.ToArray();
                    ms.Close();
                    return byEncRet;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion --- 3DES 加解密 End ---
    }








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章