/// <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 --- }