/// <summary> /// .Net加密解密幫助類 /// </summary> public class NetCryptoHelper { #region des實現 /// <summary> /// Des默認密鑰向量 /// </summary> public static byte[] DesIv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; /// <summary> /// Des加解密鑰必須8位 /// </summary> public const string DesKey = "deskey8w"; /// <summary> /// 獲取Des8位密鑰 /// </summary> /// <param name="key">Des密鑰字符串</param> /// <returns>Des8位密鑰</returns> static byte[] GetDesKey(string key) { if (string.IsNullOrEmpty(key)) { throw new ArgumentNullException("key", "Des密鑰不能爲空"); } if (key.Length > 8) { key = key.Substring(0, 8); } if (key.Length < 8) { // 不足8補全 key = key.PadRight(8, '0'); } return Encoding.UTF8.GetBytes(key); } /// <summary> /// Des加密 /// </summary> /// <param name="source">源字符串</param> /// <param name="key">des密鑰,長度必須8位</param> /// <param name="iv">密鑰向量</param> /// <returns>加密後的字符串</returns> public static string EncryptDes(string source, string key, byte[] iv) { using (DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider()) { byte[] rgbKeys = GetDesKey(key), rgbIvs = iv, inputByteArray = Encoding.UTF8.GetBytes(source); using (MemoryStream memoryStream = new MemoryStream()) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, desProvider.CreateEncryptor(rgbKeys, rgbIvs), CryptoStreamMode.Write)) { cryptoStream.Write(inputByteArray, 0, inputByteArray.Length); cryptoStream.FlushFinalBlock(); // 1.第一種 return Convert.ToBase64String(memoryStream.ToArray()); // 2.第二種 //StringBuilder result = new StringBuilder(); //foreach (byte b in memoryStream.ToArray()) //{ // result.AppendFormat("{0:X2}", b); //} //return result.ToString(); } } } } /// <summary> /// Des解密 /// </summary> /// <param name="source">源字符串</param> /// <param name="key">des密鑰,長度必須8位</param> /// <param name="iv">密鑰向量</param> /// <returns>解密後的字符串</returns> public static string DecryptDes(string source, string key, byte[] iv) { using (DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider()) { byte[] rgbKeys = GetDesKey(key), rgbIvs = iv, inputByteArray = Convert.FromBase64String(source); using (MemoryStream memoryStream = new MemoryStream()) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, desProvider.CreateDecryptor(rgbKeys, rgbIvs), CryptoStreamMode.Write)) { cryptoStream.Write(inputByteArray, 0, inputByteArray.Length); cryptoStream.FlushFinalBlock(); return Encoding.UTF8.GetString(memoryStream.ToArray()); } } } } #endregion #region aes實現 /// <summary> /// Aes加解密鑰必須32位 /// </summary> public static string AesKey = "asekey32w"; /// <summary> /// 獲取Aes32位密鑰 /// </summary> /// <param name="key">Aes密鑰字符串</param> /// <returns>Aes32位密鑰</returns> static byte[] GetAesKey(string key) { if (string.IsNullOrEmpty(key)) { throw new ArgumentNullException("key", "Aes密鑰不能爲空"); } if (key.Length < 32) { // 不足32補全 key = key.PadRight(32, '0'); } if (key.Length > 32) { key = key.Substring(0, 32); } return Encoding.UTF8.GetBytes(key); } /// <summary> /// Aes加密 /// </summary> /// <param name="source">源字符串</param> /// <param name="key">aes密鑰,長度必須32位</param> /// <returns>加密後的字符串</returns> public static string EncryptAes(string source, string key) { using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider()) { aesProvider.Key = GetAesKey(key); aesProvider.Mode = CipherMode.ECB; aesProvider.Padding = PaddingMode.PKCS7; using (ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor()) { byte[] inputBuffers = Encoding.UTF8.GetBytes(source); byte[] results = cryptoTransform.TransformFinalBlock(inputBuffers, 0, inputBuffers.Length); aesProvider.Clear(); aesProvider.Dispose(); return Convert.ToBase64String(results, 0, results.Length); } } } /// <summary> /// Aes解密 /// </summary> /// <param name="source">源字符串</param> /// <param name="key">aes密鑰,長度必須32位</param> /// <returns>解密後的字符串</returns> public static string DecryptAes(string source, string key) { using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider()) { aesProvider.Key = GetAesKey(key); aesProvider.Mode = CipherMode.ECB; aesProvider.Padding = PaddingMode.PKCS7; using (ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor()) { byte[] inputBuffers = Convert.FromBase64String(source); byte[] results = cryptoTransform.TransformFinalBlock(inputBuffers, 0, inputBuffers.Length); aesProvider.Clear(); return Encoding.UTF8.GetString(results); } } } #endregion }
class Program { static void Main(string[] args) { string plainText = "博客園", encryptString = NetCryptoHelper.EncryptDes(plainText, NetCryptoHelper.DesKey, NetCryptoHelper.DesIv); Console.WriteLine("des加密前的字符串:{0}", plainText); Console.WriteLine("des加密後的字符串:{0}", encryptString); Console.WriteLine("des解密後的字符串:{0}", NetCryptoHelper.DecryptDes(encryptString, NetCryptoHelper.DesKey, NetCryptoHelper.DesIv)); Console.WriteLine("-----------分割線-----------"); Console.WriteLine("aes加密前的字符串:{0}", plainText); encryptString = NetCryptoHelper.EncryptAes(plainText, NetCryptoHelper.AesKey); Console.WriteLine("aes加密後的字符串:{0}", encryptString); Console.WriteLine("aes解密後的字符串:{0}", NetCryptoHelper.DecryptAes(encryptString, NetCryptoHelper.AesKey)); Console.ReadKey(); } }