加密 方法随笔
public class CipherHelper { /// <summary> /// Hash 加密采用的算法 /// </summary> public enum HashFormat { MD516, MD532, SHA1, SHA256, SHA384, SHA512 }; /// <summary> /// 对称加密采用的算法 /// </summary> public enum SymmetricFormat { DES, TripleDES }; /// <summary> /// 对字符串进行 Hash 加密 /// </summary> public static string Hash(string inputString, HashFormat hashFormat) { HashAlgorithm algorithm = null; switch (hashFormat) { case HashFormat.MD516: algorithm = MD5.Create(); break; case HashFormat.MD532: algorithm = MD5.Create(); break; case HashFormat.SHA1: algorithm = SHA1.Create(); break; case HashFormat.SHA256: algorithm = SHA256.Create(); break; case HashFormat.SHA384: algorithm = SHA384.Create(); break; case HashFormat.SHA512: algorithm = SHA512.Create(); break; } algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString)); if (hashFormat == HashFormat.MD516) { return BitConverter.ToString(algorithm.Hash).Replace("-", "").Substring(8, 16).ToUpper(); } else { return BitConverter.ToString(algorithm.Hash).Replace("-", "").ToUpper(); } } public static string HMACSHA(string message, string secret) { byte[] secretKey = Encoding.UTF8.GetBytes(secret); HMACSHA256 hmac = new HMACSHA256(secretKey); hmac.Initialize(); byte[] bytes = Encoding.UTF8.GetBytes(message); byte[] rawHmac = hmac.ComputeHash(bytes); return ToHexString(rawHmac); } /// <summary> /// java中Hex.encodeHexString方法的c#实现 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static string ToHexString(byte[] bytes) // 0xae00cf => "AE00CF " { string hexString = string.Empty; if (bytes != null) { StringBuilder strB = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { strB.Append(bytes[i].ToString("X2")); } hexString = strB.ToString(); } return hexString; } /// <summary> /// 对字符串进行对称加密 /// </summary> public static string SymmetricEncrypt(string inputString, SymmetricFormat symmetricFormat, string key, string iv) { SymmetricAlgorithm algorithm = null; switch (symmetricFormat) { case SymmetricFormat.DES: algorithm = DES.Create(); break; case SymmetricFormat.TripleDES: algorithm = TripleDES.Create(); break; } int keySize = algorithm.Key.Length; byte[] desString = Encoding.UTF8.GetBytes(inputString); byte[] desKey = Encoding.UTF8.GetBytes(key.Substring(0, keySize)); byte[] desIV = Encoding.UTF8.GetBytes(iv.Substring(0, keySize)); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, algorithm.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write); cStream.Write(desString, 0, desString.Length); cStream.FlushFinalBlock(); cStream.Close(); //return Convert.ToBase64String(mStream.ToArray()); return BitConverter.ToString(mStream.ToArray()).Replace("-", "").ToUpper(); } /// <summary> /// 对字符串进行对称解密 /// </summary> public static string SymmetricDecrypt(string inputString, SymmetricFormat symmetricFormat, string key, string iv) { SymmetricAlgorithm algorithm = null; switch (symmetricFormat) { case SymmetricFormat.DES: algorithm = DES.Create(); break; case SymmetricFormat.TripleDES: algorithm = TripleDES.Create(); break; } int keySize = algorithm.Key.Length; //byte[] desString = Convert.FromBase64String(inputString); byte[] desString = new byte[inputString.Length / 2]; for (int i = 0; i < inputString.Length; i += 2) { desString[i / 2] = byte.Parse(inputString.Substring(i, 2), System.Globalization.NumberStyles.AllowHexSpecifier); } byte[] desKey = Encoding.UTF8.GetBytes(key.Substring(0, keySize)); byte[] desIV = Encoding.UTF8.GetBytes(iv.Substring(0, keySize)); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, algorithm.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write); cStream.Write(desString, 0, desString.Length); cStream.FlushFinalBlock(); cStream.Close(); return Encoding.UTF8.GetString(mStream.ToArray()); } /// <summary> /// RSA 加密 /// </summary> public static string Rsa(string PublicRsaKey, string source) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(PublicRsaKey); var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(source), true); return Convert.ToBase64String(cipherbytes); } /// <summary> /// RSA解密 /// </summary> public static string UnRsa(string PrivateRsaKey, string source) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(PrivateRsaKey); var cipherbytes = rsa.Decrypt(Convert.FromBase64String(source), true); return Encoding.UTF8.GetString(cipherbytes); } /// <summary> /// Base64解密 /// </summary> /// <param name="codeName">解密采用的编码方式,注意和加密时采用的方式一致</param> /// <param name="result">待解密的密文</param> /// <returns>解密后的字符串</returns> public static string DecodeBase64(Encoding encode, string result) { string decode = ""; byte[] bytes = Convert.FromBase64String(result); try { decode = encode.GetString(bytes); } catch { decode = result; } return decode; } /// <summary> /// Base64加密 /// </summary> /// <param name="Message"></param> /// <returns></returns> public static string Base64Code(string Message) { byte[] bytes = Encoding.Default.GetBytes(Message); return Convert.ToBase64String(bytes); } }