加密技术是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原(解密)。
加密技术包括两个元素:算法和密钥。算法是将普通的信息或者可以理解的信息与一串数字(密钥)结合,产生不可理解的密文的步骤,密钥是用来对数据进行编码和解密的一种算法。在安全保密中,可通过适当的钥加密技术和管理机制来保证网络的信息通信安全。
软件的加密与解密是一个迷人的研究领域,它几乎可以与任意一种计算机技术紧密结合——密码学、程序设计语言、操作系统、数据结构。而由于这样或者那样的原因,对于这一领域的关注程度一直还处于低温状态。而看雪技术论坛相信会为更多对知识怀有渴望的朋友多开辟一条走向这个领域的道路,并且进而推动这个领域的不断发展。
自己封装了一个加密解密工具类
EncryptHelper 常用数据加密类,包含:MD5加密 DES加解密 AES加解密 RC2加解密
using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Common.Encrypt { /// <summary> /// 常用数据加密类 /// </summary> public class EncryptHelper { #region ===========================MD5 加密=========================== /// <summary> /// MD5 加密静态方法 /// </summary> /// <param name="encryptString">待加密的明文</param> /// <returns>returns</returns> public static string Md5Encrypt(string encryptString) { if (string.IsNullOrEmpty(encryptString)) { throw (new Exception("明文不得为空")); } MD5 mClassMd5 = new MD5CryptoServiceProvider(); var mStrEncrypt = ""; try { mStrEncrypt = BitConverter.ToString(mClassMd5.ComputeHash(Encoding.Default.GetBytes(encryptString))) .Replace("-", ""); } catch (ArgumentException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { mClassMd5.Clear(); } return mStrEncrypt; } #endregion #region ===========================DES 加密/解密=========================== /// <summary> /// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合) /// </summary> /// <param name="encryptString">待加密的明文</param> /// <param name="encryptKey">加密的密钥</param> /// <returns>returns</returns> public static string DesEncrypt(string encryptString, string encryptKey) { if (string.IsNullOrEmpty(encryptString)) { throw (new Exception("明文不得为空")); } if (string.IsNullOrEmpty(encryptKey)) { throw (new Exception("密钥不得为空")); } if (encryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); } byte[] mBtIv = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; var mStrEncrypt = ""; var mDesProvider = new DESCryptoServiceProvider(); try { var mBtEncryptString = Encoding.Default.GetBytes(encryptString); var mStream = new MemoryStream(); var mCstream = new CryptoStream(mStream, mDesProvider.CreateEncryptor(Encoding.Default.GetBytes(encryptKey), mBtIv), CryptoStreamMode.Write); mCstream.Write(mBtEncryptString, 0, mBtEncryptString.Length); mCstream.FlushFinalBlock(); mStrEncrypt = Convert.ToBase64String(mStream.ToArray()); mStream.Close(); mStream.Dispose(); mCstream.Close(); mCstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { mDesProvider.Clear(); } return mStrEncrypt; } /// <summary> /// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合) /// </summary> /// <param name="decryptString">待解密的密文</param> /// <param name="decryptKey">解密的密钥</param> /// <returns>returns</returns> public static string DesDecrypt(string decryptString, string decryptKey) { if (string.IsNullOrEmpty(decryptString)) { throw (new Exception("明文不得为空")); } if (string.IsNullOrEmpty(decryptKey)) { throw (new Exception("密钥不得为空")); } if (decryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); } byte[] mBtIv = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; var mStrDecrypt = ""; var mDesProvider = new DESCryptoServiceProvider(); try { var mBtDecryptString = Convert.FromBase64String(decryptString); var mStream = new MemoryStream(); var mCstream = new CryptoStream(mStream, mDesProvider.CreateDecryptor(Encoding.Default.GetBytes(decryptKey), mBtIv), CryptoStreamMode.Write); mCstream.Write(mBtDecryptString, 0, mBtDecryptString.Length); mCstream.FlushFinalBlock(); mStrDecrypt = Encoding.Default.GetString(mStream.ToArray()); mStream.Close(); mStream.Dispose(); mCstream.Close(); mCstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { mDesProvider.Clear(); } return mStrDecrypt; } #endregion #region ===========================RC2 加密/解密=========================== /// <summary> /// RC2 加密(用变长密钥对大量数据进行加密) /// </summary> /// <param name="encryptString">待加密明文</param> /// <param name="encryptKey">加密密钥</param> /// <returns>returns</returns> public static string Rc2Encrypt(string encryptString, string encryptKey) { if (string.IsNullOrEmpty(encryptString)) { throw (new Exception("明文不得为空")); } if (string.IsNullOrEmpty(encryptKey)) { throw (new Exception("密钥不得为空")); } if (encryptKey.Length < 5 || encryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); } string mStrEncrypt; byte[] mBtIv = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; var mRc2Provider = new RC2CryptoServiceProvider(); try { var mBtEncryptString = Encoding.Default.GetBytes(encryptString); var mStream = new MemoryStream(); var mCstream = new CryptoStream(mStream, mRc2Provider.CreateEncryptor(Encoding.Default.GetBytes(encryptKey), mBtIv), CryptoStreamMode.Write); mCstream.Write(mBtEncryptString, 0, mBtEncryptString.Length); mCstream.FlushFinalBlock(); mStrEncrypt = Convert.ToBase64String(mStream.ToArray()); mStream.Close(); mStream.Dispose(); mCstream.Close(); mCstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { mRc2Provider.Clear(); } return mStrEncrypt; } /// <summary> /// RC2 解密(用变长密钥对大量数据进行加密) /// </summary> /// <param name="decryptString">待解密密文</param> /// <param name="decryptKey">解密密钥</param> /// <returns>returns</returns> public static string Rc2Decrypt(string decryptString, string decryptKey) { if (string.IsNullOrEmpty(decryptString)) { throw (new Exception("明文不得为空")); } if (string.IsNullOrEmpty(decryptKey)) { throw (new Exception("密钥不得为空")); } if (decryptKey.Length < 5 || decryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); } byte[] mBtIv = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; string mStrDecrypt; var mRc2Provider = new RC2CryptoServiceProvider(); try { var mBtDecryptString = Convert.FromBase64String(decryptString); var mStream = new MemoryStream(); var mCstream = new CryptoStream(mStream, mRc2Provider.CreateDecryptor(Encoding.Default.GetBytes(decryptKey), mBtIv), CryptoStreamMode.Write); mCstream.Write(mBtDecryptString, 0, mBtDecryptString.Length); mCstream.FlushFinalBlock(); mStrDecrypt = Encoding.Default.GetString(mStream.ToArray()); mStream.Close(); mStream.Dispose(); mCstream.Close(); mCstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { mRc2Provider.Clear(); } return mStrDecrypt; } #endregion #region ===========================3DES 加密/解密=========================== /// <summary> /// 3DES 加密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高) /// </summary> /// <param name="encryptString">待加密明文</param> /// <param name="encryptKey1">密钥一</param> /// <param name="encryptKey2">密钥二</param> /// <param name="encryptKey3">密钥三</param> /// <returns>returns</returns> public static string Des3Encrypt(string encryptString, string encryptKey1, string encryptKey2, string encryptKey3) { string mStrEncrypt; try { mStrEncrypt = DesEncrypt(encryptString, encryptKey3); mStrEncrypt = DesEncrypt(mStrEncrypt, encryptKey2); mStrEncrypt = DesEncrypt(mStrEncrypt, encryptKey1); } catch (Exception ex) { throw ex; } return mStrEncrypt; } /// <summary> /// 3DES 解密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高) /// </summary> /// <param name="decryptString">待解密密文</param> /// <param name="decryptKey1">密钥一</param> /// <param name="decryptKey2">密钥二</param> /// <param name="decryptKey3">密钥三</param> /// <returns>returns</returns> public static string Des3Decrypt(string decryptString, string decryptKey1, string decryptKey2, string decryptKey3) { string mStrDecrypt; try { mStrDecrypt = DesDecrypt(decryptString, decryptKey1); mStrDecrypt = DesDecrypt(mStrDecrypt, decryptKey2); mStrDecrypt = DesDecrypt(mStrDecrypt, decryptKey3); } catch (Exception ex) { throw ex; } return mStrDecrypt; } #endregion #region ===========================AES 加密/解密=========================== /// <summary> /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法) /// </summary> /// <param name="encryptString">待加密明文</param> /// <param name="encryptKey">加密密钥</param> /// <returns></returns> public static string AesEncrypt(string encryptString, string encryptKey) { if (string.IsNullOrEmpty(encryptString)) { throw (new Exception("明文不得为空")); } if (string.IsNullOrEmpty(encryptKey)) { throw (new Exception("密钥不得为空")); } var mStrEncrypt = ""; var mBtIv = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ=="); var mAesProvider = Rijndael.Create(); try { var mBtEncryptString = Encoding.Default.GetBytes(encryptString); var mStream = new MemoryStream(); var mCsstream = new CryptoStream(mStream, mAesProvider.CreateEncryptor(Encoding.Default.GetBytes(encryptKey), mBtIv), CryptoStreamMode.Write); mCsstream.Write(mBtEncryptString, 0, mBtEncryptString.Length); mCsstream.FlushFinalBlock(); mStrEncrypt = Convert.ToBase64String(mStream.ToArray()); mStream.Close(); mStream.Dispose(); mCsstream.Close(); mCsstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { mAesProvider.Clear(); } return mStrEncrypt; } /// <summary> /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法) /// </summary> /// <param name="decryptString">待解密密文</param> /// <param name="decryptKey">解密密钥</param> /// <returns></returns> public static string AesDecrypt(string decryptString, string decryptKey) { if (string.IsNullOrEmpty(decryptString)) { throw (new Exception("明文不得为空")); } if (string.IsNullOrEmpty(decryptKey)) { throw (new Exception("密钥不得为空")); } var mStrDecrypt = ""; var mBtIv = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ=="); var mAesProvider = Rijndael.Create(); try { var mBtDecryptString = Convert.FromBase64String(decryptString); var mStream = new MemoryStream(); var mCsstream = new CryptoStream(mStream, mAesProvider.CreateDecryptor(Encoding.Default.GetBytes(decryptKey), mBtIv), CryptoStreamMode.Write); mCsstream.Write(mBtDecryptString, 0, mBtDecryptString.Length); mCsstream.FlushFinalBlock(); mStrDecrypt = Encoding.Default.GetString(mStream.ToArray()); mStream.Close(); mStream.Dispose(); mCsstream.Close(); mCsstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { mAesProvider.Clear(); } return mStrDecrypt; } #endregion } }
如有问题,欢迎指正,谢谢!