C# DES_AES_MD5_加密_解密
2014-06-11 17:29
330 查看
一、DES加解密
DES一共就有4个参数参与运作:明文、密文、密钥、向量。其中这4者的关系可以理解为:密文=明文+密钥+向量;
明文=密文-密钥-向量;
为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复,那么这个词加上密钥形成的密文,仍然会重复,这给破解者有机可乘,破解者可以根据重复的内容,猜出是什么词,然而一旦猜对这个词,那么,他就能算出密钥,整篇文章就被破解了!加上向量这个参数以后,每块文字段都会依次加上一段值,这样,即使相同的文字,加密出来的密文,也是不一样的,算法的安全性大大提高!
下面给出DES加、解密的.Net封装版:
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加解密
AES是美国联邦政府采用的商业及政府数据加密标准,预计将在未来几十年里代替DES在各个领域中得到广泛应用。AES提供128位密钥,因此,128位AES的加密强度是56位DES加密强度的1021倍还多。假设可以制造一部可以在1秒内破解DES密码的机器,那么使用这台机器破解一个128位AES密码需要大约149亿万年的时间。下面给出AES加解密的.Net封装版:
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与SHA128、256...散列
MD5和SHA1散列通常被用于密码中,很多人称其为散列算法,实际上它正确应该叫做散列算法。散列是不可逆的,也就是没有了"解密"这个说法。下面给出MD5与SHA128散列的.Net的System.Web快速实现版:
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(); } } }
全面版:
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); } } }
相关文章推荐
- 【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解
- DES,AeS加解密,MD5,SHA加密
- 常用加密解密算法【RSA、AES、DES、MD5】介绍和使用
- 加密解密算法【RSA、AES、DES、MD5】介绍和使用
- IOS 加密解密(AES、DES、base64、md5)
- AES 加密 解密 MD5 加签 验签
- Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES
- Android加密和解密(DES,AES,MD5)
- C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)
- ios常见加密解密方法(RSA、DES 、AES、MD5)
- SHA1 MD5 BASE64 AES 加密解密
- 常用加密解密算法【RSA、AES、DES、MD5】介绍和使用
- SHA1 MD5 BASE64 AES 加密解密
- AES加密逐句分析、解密、md5
- 常用加密解密算法【RSA、AES、DES、MD5】介绍和使用
- Android平台 AES加密/解密
- AES加密解密-iphone-C#
- AES加密,解密 C# .net 解密支持大文件
- AES加密解密|及Base64的使用
- AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用