DES一共就有4個參數參與運做:明文、密文、密鑰、向量。其中這4者的關係能夠理解爲:算法
爲何要向量這個參數呢?由於若是有一篇文章,有幾個詞重複,那麼這個詞加上密鑰造成的密文,仍然會重複,這給破解者有隙可乘,破解者能夠根據重複的內容,猜出是什麼詞,然而一旦猜對這個詞,那麼,他就能算出密鑰,整篇文章就被破解了!加上向量這個參數之後,每塊文字段都會依次加上一段值,這樣,即便相同的文字,加密出來的密文,也是不同的,算法的安全性大大提升!安全
下面給出DES加、解密的.Net封裝版:ide
using System; using System.Text; using System.Security.Cryptography; using System.IO; namespace 開發測試 { class Program { static void Main(string[] args) { string user = Encrypt("admin"); string pass = Encrypt("999999"); Console.WriteLine(user); Console.WriteLine(pass); string GetUser = Decrypt(user); string GetPass = Decrypt(pass); Console.WriteLine(GetUser); Console.WriteLine(GetPass); Console.ReadLine(); } /// <summary> /// 獲取密鑰 /// </summary> private static string Key { get { return @"P@+#wG%A"; } } /// <summary> /// 獲取向量 /// </summary> private static string IV { get { return @"L*n67}G\Mk@k%:~Y"; } } /// <summary> /// DES加密 /// </summary> /// <param name="plainStr">明文字符串</param> /// <returns>密文</returns> public static string Encrypt(string plainStr) { byte[] bKey = Encoding.UTF8.GetBytes(Key); byte[] bIV = Encoding.UTF8.GetBytes(IV); byte[] byteArray = Encoding.UTF8.GetBytes(plainStr); string encrypt = null; DESCryptoServiceProvider des = new DESCryptoServiceProvider(); try { using (MemoryStream mStream = new MemoryStream()) { using (CryptoStream cStream = new CryptoStream(mStream, des.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write)) { cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); encrypt = Convert.ToBase64String(mStream.ToArray()); } } } catch { } des.Clear(); return encrypt; } /// <summary> /// DES解密 /// </summary> /// <param name="encryptStr">密文字符串</param> /// <returns>明文</returns> public static string Decrypt(string encryptStr) { byte[] bKey = Encoding.UTF8.GetBytes(Key); byte[] bIV = Encoding.UTF8.GetBytes(IV); byte[] byteArray = Convert.FromBase64String(encryptStr); string decrypt = null; DESCryptoServiceProvider des = new DESCryptoServiceProvider(); try { using (MemoryStream mStream = new MemoryStream()) { using (CryptoStream cStream = new CryptoStream(mStream, des.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write)) { cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); decrypt = Encoding.UTF8.GetString(mStream.ToArray()); } } } catch { } des.Clear(); return decrypt; } } }
AES是美國聯邦政府採用的商業及政府數據加密標準,預計將在將來幾十年裏代替DES在各個領域中獲得普遍應用。AES提供128位密鑰,所以,128位AES的加密強度是56位DES加密強度的1021倍還多。假設能夠製造一部能夠在1秒內破解DES密碼的機器,那麼使用這臺機器破解一個128位AES密碼須要大約149億萬年的時間。測試
下面給出AES加解密的.Net封裝版:this
using System; using System.Text; using System.Security.Cryptography; using System.IO; namespace 開發測試 { class Program { static void Main(string[] args) { string user = Encrypt("admin"); string pass = Encrypt("999999"); Console.WriteLine(user); Console.WriteLine(pass); string GetUser = Decrypt(user); string GetPass = Decrypt(pass); Console.WriteLine(GetUser); Console.WriteLine(GetPass); Console.ReadLine(); } /// <summary> /// 獲取密鑰 /// </summary> private static string Key { get { return @"qO[NB]6,YF}gefcaj{+oESb9d8>Z'e9M"; } } /// <summary> /// 獲取向量 /// </summary> private static string IV { get { return @"L+\~f4.Ir)b$=pkf"; } } /// <summary> /// AES加密 /// </summary> /// <param name="plainStr">明文字符串</param> /// <returns>密文</returns> public static string Encrypt(string plainStr) { byte[] bKey = Encoding.UTF8.GetBytes(Key); byte[] bIV = Encoding.UTF8.GetBytes(IV); byte[] byteArray = Encoding.UTF8.GetBytes(plainStr); string encrypt = null; Rijndael aes = Rijndael.Create(); try { using (MemoryStream mStream = new MemoryStream()) { using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write)) { cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); encrypt = Convert.ToBase64String(mStream.ToArray()); } } } catch { } aes.Clear(); return encrypt; } /// <summary> /// AES解密 /// </summary> /// <param name="encryptStr">密文字符串</param> /// <returns>明文</returns> public static string Decrypt(string encryptStr) { byte[] bKey = Encoding.UTF8.GetBytes(Key); byte[] bIV = Encoding.UTF8.GetBytes(IV); byte[] byteArray = Convert.FromBase64String(encryptStr); string decrypt = null; Rijndael aes = Rijndael.Create(); try { using (MemoryStream mStream = new MemoryStream()) { using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write)) { cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); decrypt = Encoding.UTF8.GetString(mStream.ToArray()); } } } catch { } aes.Clear(); return decrypt; } } }
MD5和SHA1散列一般被用於密碼中,不少人稱其爲散列算法,實際上它正確應該叫作散列算法。散列是不可逆的,也就是沒有了"解密"這個說法。加密
下面給出MD5與SHA128散列的.Net的System.Web快速實現版:spa
using System; using System.Text; using System.IO; namespace 開發測試 { class Program { static void Main(string[] args) { string user = MD5("admin"); string pass = MD5("999999"); Console.WriteLine(user); Console.WriteLine(pass); string user2 = SHA1("admin"); string pass2 = SHA1("999999"); Console.WriteLine(user2); Console.WriteLine(pass2); Console.ReadLine(); } //32位大寫MD5散列 public static string MD5(string str) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToUpper(); } //大寫SHA1散列 public static string SHA1(string str) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1").ToUpper(); } } }
全面版:code
using System; using System.Text; using System.IO; using System.Security.Cryptography; namespace 開發測試 { class Program { static void Main(string[] args) { string user = MD5("admin"); string pass = MD5("999999"); Console.WriteLine(user); Console.WriteLine(pass); string user2 = SHA128("admin"); string pass2 = SHA128("999999"); Console.WriteLine(user2); Console.WriteLine(pass2); string user3 = SHA256("admin"); string pass3 = SHA256("999999"); Console.WriteLine(user3); Console.WriteLine(pass3); string user4 = SHA384("admin"); string pass4 = SHA384("999999"); Console.WriteLine(user4); Console.WriteLine(pass4); string user5 = SHA512("admin"); string pass5 = SHA512("999999"); Console.WriteLine(user5); Console.WriteLine(pass5); Console.ReadLine(); } //16字節,128位 public static string MD5(string str) { byte[] buffer = Encoding.UTF8.GetBytes(str); MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider(); byte[] byteArr = MD5.ComputeHash(buffer); return BitConverter.ToString(byteArr); } //20字節,160位 public static string SHA128(string str) { byte[] buffer = Encoding.UTF8.GetBytes(str); SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider(); byte[] byteArr = SHA1.ComputeHash(buffer); return BitConverter.ToString(byteArr); } //32字節,256位 public static string SHA256(string str) { byte[] buffer = Encoding.UTF8.GetBytes(str); SHA256CryptoServiceProvider SHA256 = new SHA256CryptoServiceProvider(); byte[] byteArr = SHA256.ComputeHash(buffer); return BitConverter.ToString(byteArr); } //48字節,384位 public static string SHA384(string str) { byte[] buffer = Encoding.UTF8.GetBytes(str); SHA384CryptoServiceProvider SHA384 = new SHA384CryptoServiceProvider(); byte[] byteArr = SHA384.ComputeHash(buffer); return BitConverter.ToString(byteArr); } //64字節,512位 public static string SHA512(string str) { byte[] buffer = Encoding.UTF8.GetBytes(str); SHA512CryptoServiceProvider SHA512 = new SHA512CryptoServiceProvider(); byte[] byteArr = SHA512.ComputeHash(buffer); return BitConverter.ToString(byteArr); } } }