C#加密解密
阿新 • • 發佈:2020-06-20
1、MD5加密
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace MyEncrypt { /// <summary> /// 不可逆加密 /// 1 防止被篡改 /// 2 防止明文儲存 /// 3 防止抵賴,數字簽名 /// </summary> publicclass MD5Encrypt { #region MD5 /// <summary> /// MD5加密,和動網上的16/32位MD5加密結果相同,/// 使用的UTF8編碼 /// </summary> /// <param name="source">待加密字串</param> /// <param name="length">16或32值之一,其它則採用.net預設MD5加密演算法</param> /// <returns>加密後的字串</returns> public static string Encrypt(string source,int length = 32)//預設引數 { if (string.IsNullOrEmpty(source)) return string.Empty; HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm; byte[] bytes = Encoding.UTF8.GetBytes(source);//這裡需要區別編碼的 byte[] hashValue = provider.ComputeHash(bytes); StringBuilder sb = new StringBuilder(); switch (length) { case 16://16位密文是32位密文的9到24位字元 for (int i = 4; i < 12; i++) { sb.Append(hashValue[i].ToString("x2")); } break; case 32: for (int i = 0; i < 16; i++) { sb.Append(hashValue[i].ToString("x2")); } break; default: for (int i = 0; i < hashValue.Length; i++) { sb.Append(hashValue[i].ToString("x2")); } break; } return sb.ToString(); } #endregion MD5 #region MD5摘要 /// <summary> /// 獲取檔案的MD5摘要 /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static string AbstractFile(string fileName) { using (FileStream file = new FileStream(fileName,FileMode.Open)) { return AbstractFile(file); } } /// <summary> /// 根據stream獲取檔案摘要 /// </summary> /// <param name="stream"></param> /// <returns></returns> public static string AbstractFile(Stream stream) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } #endregion } }
2、DES對稱加密解密
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace MyEncrypt { /// <summary> /// DES AES Blowfish /// 對稱加密演算法的優點是速度快, /// 缺點是金鑰管理不方便,要求共享金鑰。 /// 可逆對稱加密 金鑰長度8 /// </summary> public class DesEncrypt { private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Substring(0,8)); private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Insert(0,"w").Substring(0,8)); /// <summary> /// DES 加密 /// </summary> /// <param name="text">需要加密的值</param> /// <returns>加密後的結果</returns> public static string Encrypt(string text) { DESCryptoServiceProvider dsp = new DESCryptoServiceProvider(); using (MemoryStream memStream = new MemoryStream()) { CryptoStream crypStream = new CryptoStream(memStream,dsp.CreateEncryptor(_rgbKey,_rgbIV),CryptoStreamMode.Write); StreamWriter sWriter = new StreamWriter(crypStream); sWriter.Write(text); sWriter.Flush(); crypStream.FlushFinalBlock(); memStream.Flush(); return Convert.ToBase64String(memStream.GetBuffer(),0,(int)memStream.Length); } } /// <summary> /// DES解密 /// </summary> /// <param name="encryptText"></param> /// <returns>解密後的結果</returns> public static string Decrypt(string encryptText) { DESCryptoServiceProvider dsp = new DESCryptoServiceProvider(); byte[] buffer = Convert.FromBase64String(encryptText); using (MemoryStream memStream = new MemoryStream()) { CryptoStream crypStream = new CryptoStream(memStream,dsp.CreateDecryptor(_rgbKey,CryptoStreamMode.Write); crypStream.Write(buffer,0,buffer.Length); crypStream.FlushFinalBlock(); return ASCIIEncoding.UTF8.GetString(memStream.ToArray()); } } } }
3、RSA非對稱加密解密
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace MyEncrypt { /// <summary> /// RSA ECC /// 可逆非對稱加密 /// 非對稱加密演算法的優點是金鑰管理很方便,缺點是速度慢。 /// </summary> public class RsaEncrypt { /// <summary> /// 獲取加密/解密對 /// 給你一個,是無法推算出另外一個的 /// /// Encrypt Decrypt /// </summary> /// <returns>Encrypt Decrypt</returns> public static KeyValuePair<string,string> GetKeyPair() { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); string publicKey = RSA.ToXmlString(false); string privateKey = RSA.ToXmlString(true); return new KeyValuePair<string,string>(publicKey,privateKey); } /// <summary> /// 加密:內容+加密key /// /// </summary> /// <param name="content"></param> /// <param name="encryptKey">加密key</param> /// <returns></returns> public static string Encrypt(string content,string encryptKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(encryptKey); UnicodeEncoding ByteConverter = new UnicodeEncoding(); byte[] DataToEncrypt = ByteConverter.GetBytes(content); byte[] resultBytes = rsa.Encrypt(DataToEncrypt,false); return Convert.ToBase64String(resultBytes); } /// <summary> /// 解密 內容+解密key /// </summary> /// <param name="content"></param> /// <param name="decryptKey">解密key</param> /// <returns></returns> public static string Decrypt(string content,string decryptKey) { byte[] dataToDecrypt = Convert.FromBase64String(content); RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSA.FromXmlString(decryptKey); byte[] resultBytes = RSA.Decrypt(dataToDecrypt,false); UnicodeEncoding ByteConverter = new UnicodeEncoding(); return ByteConverter.GetString(resultBytes); } /// <summary> /// 可以合併在一起的,每次產生一組新的金鑰 /// </summary> /// <param name="content"></param> /// <param name="encryptKey">加密key</param> /// <param name="decryptKey">解密key</param> /// <returns>加密後結果</returns> private static string Encrypt(string content,out string publicKey,out string privateKey) { RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); publicKey = rsaProvider.ToXmlString(false); privateKey = rsaProvider.ToXmlString(true); UnicodeEncoding ByteConverter = new UnicodeEncoding(); byte[] DataToEncrypt = ByteConverter.GetBytes(content); byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt,false); return Convert.ToBase64String(resultBytes); } } }