using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace CSFrameworkV5.Core.Common { /// /// 最全字符串加密/解密/数字签名工具, www.csframework.com C/S框架网特供! /// public class CryptoHelper { ///// ///// MD5加密,不可逆 ///// ///// 明文字符串 ///// //public static string ToMD5(string clearText) //{ // MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); // byte[] encryptedBytes = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(clearText)); // StringBuilder sb = new StringBuilder(); // for (int i = 0; i < encryptedBytes.Length; i++) // { // sb.AppendFormat("{0:x2}", encryptedBytes[i]); // } // return sb.ToStringEx(); //} /// /// 散列算法加密SHA256位Hash,不可逆 /// /// 明文字符串 /// public static string ToSHA256Hash(string clearText) { SHA256 shaM = new SHA256Managed(); var encryptedBytes = shaM.ComputeHash(Encoding.UTF8.GetBytes(clearText)); var sb = new StringBuilder(); for (var i = 0; i < encryptedBytes.Length; i++) sb.AppendFormat("{0:x2}", encryptedBytes[i]); return sb.ToStringEx(); } /// /// 散列算法加密SHA512位Hash,不可逆 /// /// 明文字符串 /// public static string ToSHA512Hash(string clearText) { SHA512 shaM = new SHA512Managed(); var encryptedBytes = shaM.ComputeHash(Encoding.UTF8.GetBytes(clearText)); var sb = new StringBuilder(); for (var i = 0; i < encryptedBytes.Length; i++) sb.AppendFormat("{0:x2}", encryptedBytes[i]); return sb.ToStringEx(); } #region TripleDES ///// ///// TripleDES加密 ///// ///// 明文字符串 ///// 16位key ///// 8位iv ///// //public static string TripleDESEncrypt(string clearText, string key, string iv) //{ // SymmetricAlgorithm provider = SymmetricAlgorithm.Create("TripleDES"); // provider.Key = Encoding.UTF8.GetBytes(key);//16位 // provider.IV = Encoding.UTF8.GetBytes(iv);//8位 // ICryptoTransform encryptor = provider.CreateEncryptor(); // return Encrypt(clearText, encryptor); //} ///// ///// TripleDES解密 ///// ///// 加密的文本 ///// 16位key ///// 8位iv ///// //public static string TripleDESDecrypt(string encryptedText, string key, string iv) //{ // try // { // SymmetricAlgorithm provider = SymmetricAlgorithm.Create("TripleDES"); // provider.Key = Encoding.UTF8.GetBytes(key);//16位 // provider.IV = Encoding.UTF8.GetBytes(iv);//8位 // ICryptoTransform decryptor = provider.CreateDecryptor(); // return Decrypt(encryptedText, decryptor); // } // catch // { // return string.Empty; // } //} #endregion #region DES /// /// DES加密 /// /// 明文字符串 /// 8位key /// 8位iv /// //public static string DESEncrypt(string clearText, string key, string iv) //{ // SymmetricAlgorithm provider = SymmetricAlgorithm.Create("DES"); // provider.Key = Encoding.UTF8.GetBytes(key);//8位 // provider.IV = Encoding.UTF8.GetBytes(iv);//8位 // ICryptoTransform encryptor = provider.CreateEncryptor(); // return Encrypt(clearText, encryptor); //} /// /// DES解密 /// /// 加密的文本 /// 8位key /// 8位iv /// //public static string DESDecrypt(string encryptedText, string key, string iv) //{ // SymmetricAlgorithm provider = SymmetricAlgorithm.Create("DES"); // provider.Key = Encoding.UTF8.GetBytes(key);//8位 // provider.IV = Encoding.UTF8.GetBytes(iv);//8位 // ICryptoTransform decryptor = provider.CreateDecryptor(); // return Decrypt(encryptedText, decryptor); //} #endregion //// DES,TripleDES通用加密算法 //private static string Encrypt(string clearText, ICryptoTransform encryptor) //{ // // 创建明文流 // byte[] clearBuffer = Encoding.UTF8.GetBytes(clearText); // MemoryStream clearStream = new MemoryStream(clearBuffer); // // 创建空的密文流 // MemoryStream encryptedStream = new MemoryStream(); // CryptoStream cryptoStream = // new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write); // // 将明文流写入到buffer中 // // 将buffer中的数据写入到cryptoStream中 // int BufferSize = 1024; // int bytesRead = 0; // byte[] buffer = new byte[BufferSize]; // do // { // bytesRead = clearStream.Read(buffer, 0, BufferSize); // cryptoStream.Write(buffer, 0, bytesRead); // } while (bytesRead > 0); // cryptoStream.FlushFinalBlock(); // // 获取加密后的文本 // buffer = encryptedStream.ToArray(); // string encryptedText = Convert.ToBase64String(buffer); // return encryptedText; //} //// DES,TripleDES通用解密算法 //private static string Decrypt(string encryptedText, ICryptoTransform decryptor) //{ // try // { // byte[] encryptedBuffer = Convert.FromBase64String(encryptedText); // Stream encryptedStream = new MemoryStream(encryptedBuffer); // MemoryStream clearStream = new MemoryStream(); // CryptoStream cryptoStream = // new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read); // int BufferSize = 1024; // int bytesRead = 0; // byte[] buffer = new byte[BufferSize]; // do // { // bytesRead = cryptoStream.Read(buffer, 0, BufferSize); // clearStream.Write(buffer, 0, bytesRead); // } while (bytesRead > 0); // buffer = clearStream.GetBuffer(); // string clearText = // Encoding.UTF8.GetString(buffer, 0, (int)clearStream.Length); // return clearText; // } // catch // { // return string.Empty; // } //} #region Rijndael /// /// 获得密钥 /// /// 密钥 private static byte[] GetLegalKey(RijndaelManaged Rijndael, string key) { var KeyTemp = key; Rijndael.GenerateKey(); var bytTemp = Rijndael.Key; var KeyLength = bytTemp.Length; if (KeyTemp.Length > KeyLength) KeyTemp = KeyTemp.Substring(0, KeyLength); else if (KeyTemp.Length < KeyLength) KeyTemp = KeyTemp.PadRight(KeyLength, ' '); return Encoding.ASCII.GetBytes(KeyTemp); } /// /// 获得初始向量IV /// /// 初试向量IV private static byte[] GetLegalIV(RijndaelManaged Rijndael, string iv) { var IVTemp = iv; Rijndael.GenerateIV(); var bytTemp = Rijndael.IV; var IVLength = bytTemp.Length; if (IVTemp.Length > IVLength) IVTemp = IVTemp.Substring(0, IVLength); else if (IVTemp.Length < IVLength) IVTemp = IVTemp.PadRight(IVLength, ' '); return Encoding.ASCII.GetBytes(IVTemp); } /// /// Rijndael加密 /// /// 明文 /// key:8位 /// iv:8位 /// public static string RijndaelEncrypt(string clearText, string key, string iv) { var Rijndael = new RijndaelManaged(); var bytIn = Encoding.UTF8.GetBytes(clearText); var ms = new MemoryStream(); Rijndael.Key = GetLegalKey(Rijndael, key); Rijndael.IV = GetLegalIV(Rijndael, iv); var encrypto = Rijndael.CreateEncryptor(); var cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write); cs.Write(bytIn, 0, bytIn.Length); cs.FlushFinalBlock(); ms.Close(); var bytOut = ms.ToArray(); return Convert.ToBase64String(bytOut); } /// /// Rijndael解密 /// /// 加密的文本 /// key:8位 /// iv:8位 /// public static string RijndaelDecrypt(string encryptedText, string key, string iv) { try { var Rijndael = new RijndaelManaged(); var bytIn = Convert.FromBase64String(encryptedText); var ms = new MemoryStream(bytIn, 0, bytIn.Length); Rijndael.Key = GetLegalKey(Rijndael, key); Rijndael.IV = GetLegalIV(Rijndael, iv); var encrypto = Rijndael.CreateDecryptor(); var cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read); var sr = new StreamReader(cs); return sr.ReadToEnd(); } catch { return string.Empty; } } #endregion #region RSA /// /// 获取秘钥 /// /// 私钥 /// 公钥 public static void RSAGetKey(out string privateKey, out string publicKey) { //加密解密用到的公钥与私钥 var oRSA = new RSACryptoServiceProvider(); privateKey = oRSA.ToXmlString(true); //私钥 publicKey = oRSA.ToXmlString(false); //公钥 } /// /// RSA加密 /// /// 明文 /// 公钥 /// public static string RSAEncrypt(string clearText, string publicKey) { var bytes = Encoding.UTF8.GetBytes(clearText); //需要加密的数据 //公钥加密 var oRSA1 = new RSACryptoServiceProvider(); oRSA1.FromXmlString(publicKey); //加密要用到公钥所以导入公钥 var AOutput = oRSA1.Encrypt(bytes, true); //AOutput 加密以后的数据, true:OAEP填充方式 return Convert.ToBase64String(AOutput); } /// /// RSA解密 /// /// RSA加密文本 /// 私钥 /// public static string RSADecrypt(string encryptedText, string privateKey) { try { var oRSA2 = new RSACryptoServiceProvider(); oRSA2.FromXmlString(privateKey); var AOutput = Convert.FromBase64String(encryptedText); var AInput = oRSA2.Decrypt(AOutput, true); //true:OAEP填充方式 var reslut = Encoding.UTF8.GetString(AInput); return reslut; } catch { return string.Empty; } } /// /// RSA数字签名 /// /// 明文 /// 私钥 /// public static string RSASign(string clearText, string privateKey) { var bs = Encoding.UTF8.GetBytes(clearText); var oRSA = new RSACryptoServiceProvider(); //私钥签名 oRSA.FromXmlString(privateKey); var AOutput = oRSA.SignData(bs, "SHA1"); return Convert.ToBase64String(AOutput); } /// /// RSA验证数字签名 /// /// 明文 /// 数字签名 /// 公钥 /// public static bool RSAVerify(string clearText, string signEncryptedText, string publicKey) { var bs1 = Encoding.UTF8.GetBytes(clearText); var bs2 = Convert.FromBase64String(signEncryptedText); var oRSA = new RSACryptoServiceProvider(); //公钥验证 oRSA.FromXmlString(publicKey); var bVerify = oRSA.VerifyData(bs1, "SHA1", bs2); return bVerify; } #endregion #region DSA /// /// 获取秘钥 /// /// 私钥 /// 公钥 public static void DSAGetKey(out string privateKey, out string publicKey) { //加密解密用到的公钥与私钥 var DSA = new DSACryptoServiceProvider(); privateKey = DSA.ToXmlString(true); //私钥 publicKey = DSA.ToXmlString(false); //公钥 } /// /// 获取数字签名 /// /// 明文 /// 私钥 /// public static string DSASign(string clearText, string privateKey) { var bs = Encoding.UTF8.GetBytes(clearText); var DSA = new DSACryptoServiceProvider(); //私钥签名 DSA.FromXmlString(privateKey); var AOutput = DSA.SignData(bs); return Convert.ToBase64String(AOutput); } /// /// 验证签名 /// /// 明文 /// 明文的数字签名 /// 公钥 /// public static bool DSAVerify(string clearText, string signEncryptedText, string publicKey) { var bs1 = Encoding.UTF8.GetBytes(clearText); var bs2 = Convert.FromBase64String(signEncryptedText); var DSA = new DSACryptoServiceProvider(); //公钥验证 DSA.FromXmlString(publicKey); var bVerify = DSA.VerifyData(bs1, bs2); return bVerify; } #endregion } }