C# 加密解密类
一. MD5
1 防止看到明文 数据库密码,加盐(原密码+固定字符串,然后再MD5/双MD5)
2 防篡改
3 急速秒传(第一次上传文件,保存md5摘要,第二次上传检查md5摘要)
4文件下载(防篡改,官方发布的时候给一个md5摘要,安装的时候首先检查下摘要)
5 svn TFS git VSS(本地保存文件的md5摘要,任何修改都会影响md5)
1 public class MD5Encrypt 2 { 3 #region MD5 4 /// <summary> 5 /// MD5加密,和动网上的16/32位MD5加密结果相同, 6 /// 使用的UTF8编码 7 /// </summary> 8 /// <param name="source">待加密字串</param> 9 /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param> 10 /// <returns>加密后的字串</returns> 11 public static string Encrypt(string source, int length = 32)//默认参数 12 { 13 if (string.IsNullOrEmpty(source)) return string.Empty; 14 HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm; 15 byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的 16 byte[] hashValue = provider.ComputeHash(bytes); 17 StringBuilder sb = new StringBuilder(); 18 switch (length) 19 { 20 case 16://16位密文是32位密文的9到24位字符 21 for (int i = 4; i < 12; i++) 22 { 23 sb.Append(hashValue[i].ToString("x2")); 24 } 25 break; 26 case 32: 27 for (int i = 0; i < 16; i++) 28 { 29 sb.Append(hashValue[i].ToString("x2")); 30 } 31 break; 32 default: 33 for (int i = 0; i < hashValue.Length; i++) 34 { 35 sb.Append(hashValue[i].ToString("x2")); 36 } 37 break; 38 } 39 return sb.ToString(); 40 } 41 #endregion MD5 42 43 #region MD5摘要 44 /// <summary> 45 /// 获取文件的MD5摘要 46 /// </summary> 47 /// <param name="fileName"></param> 48 /// <returns></returns> 49 public static string AbstractFile(string fileName) 50 { 51 using (FileStream file = new FileStream(fileName, FileMode.Open)) 52 { 53 return AbstractFile(file); 54 } 55 } 56 57 /// <summary> 58 /// 根据stream获取文件摘要 59 /// </summary> 60 /// <param name="stream"></param> 61 /// <returns></returns> 62 public static string AbstractFile(Stream stream) 63 { 64 MD5 md5 = new MD5CryptoServiceProvider(); 65 byte[] retVal = md5.ComputeHash(stream); 66 67 StringBuilder sb = new StringBuilder(); 68 for (int i = 0; i < retVal.Length; i++) 69 { 70 sb.Append(retVal[i].ToString("x2")); 71 } 72 return sb.ToString(); 73 } 74 #endregion 75 }
二 . DES可逆对称加密
1 /// <summary> 2 /// DES AES Blowfish 3 /// 对称加密算法的优点是速度快, 4 /// 缺点是密钥管理不方便,要求共享密钥。 5 /// 可逆对称加密 密钥长度8 6 /// </summary> 7 public class DesEncrypt 8 { 9 private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes("key")); 10 private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes("value"); 11 12 /// <summary> 13 /// DES 加密 14 /// </summary> 15 /// <param name="text">需要加密的值</param> 16 /// <returns>加密后的结果</returns> 17 public static string Encrypt(string text) 18 { 19 DESCryptoServiceProvider dsp = new DESCryptoServiceProvider(); 20 using (MemoryStream memStream = new MemoryStream()) 21 { 22 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write); 23 StreamWriter sWriter = new StreamWriter(crypStream); 24 sWriter.Write(text); 25 sWriter.Flush(); 26 crypStream.FlushFinalBlock(); 27 memStream.Flush(); 28 return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length); 29 } 30 } 31 32 /// <summary> 33 /// DES解密 34 /// </summary> 35 /// <param name="encryptText"></param> 36 /// <returns>解密后的结果</returns> 37 public static string Decrypt(string encryptText) 38 { 39 DESCryptoServiceProvider dsp = new DESCryptoServiceProvider(); 40 byte[] buffer = Convert.FromBase64String(encryptText); 41 42 using (MemoryStream memStream = new MemoryStream()) 43 { 44 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write); 45 crypStream.Write(buffer, 0, buffer.Length); 46 crypStream.FlushFinalBlock(); 47 return ASCIIEncoding.UTF8.GetString(memStream.ToArray()); 48 } 49 } 50 }
三 RSA可逆非对称加密
1 /// <summary> 2 /// RSA ECC 3 /// 可逆非对称加密 4 /// 非对称加密算法的优点是密钥管理很方便,缺点是速度慢。 5 /// </summary> 6 public class RsaEncrypt 7 { 8 /// <summary> 9 /// 获取加密/解密对 10 /// 给你一个,是无法推算出另外一个的 11 /// 12 /// Encrypt Decrypt 13 /// </summary> 14 /// <returns>Encrypt Decrypt</returns> 15 public static KeyValuePair<string, string> GetKeyPair() 16 { 17 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 18 string publicKey = RSA.ToXmlString(false); 19 string privateKey = RSA.ToXmlString(true); 20 return new KeyValuePair<string, string>(publicKey, privateKey); 21 } 22 23 /// <summary> 24 /// 加密:内容+加密key 25 /// </summary> 26 /// <param name="content"></param> 27 /// <param name="encryptKey">加密key</param> 28 /// <returns></returns> 29 public static string Encrypt(string content, string encryptKey) 30 { 31 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 32 rsa.FromXmlString(encryptKey); 33 UnicodeEncoding ByteConverter = new UnicodeEncoding(); 34 byte[] DataToEncrypt = ByteConverter.GetBytes(content); 35 byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false); 36 return Convert.ToBase64String(resultBytes); 37 } 38 39 /// <summary> 40 /// 解密 内容+解密key 41 /// </summary> 42 /// <param name="content"></param> 43 /// <param name="decryptKey">解密key</param> 44 /// <returns></returns> 45 public static string Decrypt(string content, string decryptKey) 46 { 47 byte[] dataToDecrypt = Convert.FromBase64String(content); 48 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 49 RSA.FromXmlString(decryptKey); 50 byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false); 51 UnicodeEncoding ByteConverter = new UnicodeEncoding(); 52 return ByteConverter.GetString(resultBytes); 53 } 54 55 56 /// <summary> 57 /// 可以合并在一起的,,每次产生一组新的密钥 58 /// </summary> 59 /// <param name="content"></param> 60 /// <param name="encryptKey">加密key</param> 61 /// <param name="decryptKey">解密key</param> 62 /// <returns>加密后结果</returns> 63 private static string Encrypt(string content, out string publicKey, out string privateKey) 64 { 65 RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); 66 publicKey = rsaProvider.ToXmlString(false); 67 privateKey = rsaProvider.ToXmlString(true); 68 69 UnicodeEncoding ByteConverter = new UnicodeEncoding(); 70 byte[] DataToEncrypt = ByteConverter.GetBytes(content); 71 byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt, false); 72 return Convert.ToBase64String(resultBytes); 73 }