一. 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 ///5 /// MD5加密,和动网上的16/32位MD5加密结果相同, 6 /// 使用的UTF8编码 7 /// 8 /// 待加密字串 9 /// 16或32值之一,其它则采用.net默认MD5加密算法10 ///加密后的字串 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 MD542 43 #region MD5摘要44 ///45 /// 获取文件的MD5摘要46 /// 47 /// 48 ///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 /// 58 /// 根据stream获取文件摘要59 /// 60 /// 61 ///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 #endregion75 }
二 . DES可逆对称加密
1 ///2 /// DES AES Blowfish 3 /// 对称加密算法的优点是速度快, 4 /// 缺点是密钥管理不方便,要求共享密钥。 5 /// 可逆对称加密 密钥长度8 6 /// 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 ///13 /// DES 加密14 /// 15 /// 需要加密的值16 ///加密后的结果 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 ///33 /// DES解密34 /// 35 /// 36 ///解密后的结果 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 ///2 /// RSA ECC 3 /// 可逆非对称加密 4 /// 非对称加密算法的优点是密钥管理很方便,缺点是速度慢。 5 /// 6 public class RsaEncrypt 7 { 8 ///9 /// 获取加密/解密对10 /// 给你一个,是无法推算出另外一个的11 /// 12 /// Encrypt Decrypt13 /// 14 ///Encrypt Decrypt 15 public static KeyValuePairGetKeyPair()16 {17 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();18 string publicKey = RSA.ToXmlString(false);19 string privateKey = RSA.ToXmlString(true);20 return new KeyValuePair (publicKey, privateKey);21 }22 23 /// 24 /// 加密:内容+加密key25 /// 26 /// 27 /// 加密key28 ///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 /// 40 /// 解密 内容+解密key41 /// 42 /// 43 /// 解密key44 ///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 /// 57 /// 可以合并在一起的,,每次产生一组新的密钥58 /// 59 /// 60 /// 加密key61 /// 解密key62 ///加密后结果 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 }