using System; using System.Security.Cryptography; using System.Text; namespace LJLib.Tools.DEncrypt { /// /// RSA加密解密及RSA签名和验证 /// public static class RSACryption { #region RSA 加密解密 #region RSA 的密钥产生 /// /// RSA 的密钥产生 产生私钥 和公钥 /// public static void RSAKey(out string privateKey, out string publicKey) { using (var rsa = new RSACryptoServiceProvider()) { privateKey = rsa.ToXmlString(true); publicKey = rsa.ToXmlString(false); } } #endregion #region RSA的加密函数 //############################################################################## //RSA 方式加密 //说明KEY必须是XML的行式,返回的是字符串 //在有一点需要说明!!该加密方式有 长度 限制的!! //############################################################################## //RSA的加密函数 string public static string RSAEncrypt(string publicKey, string source) { return Convert.ToBase64String(RSAEncrypt(publicKey, Encoding.UTF8.GetBytes(source))); } //RSA的加密函数 byte[] public static byte[] RSAEncrypt(string publicKey, byte[] source) { using (var rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(publicKey); return rsa.Encrypt(source, false); } } #endregion #region RSA的解密函数 //RSA的解密函数 string public static string RSADecrypt(string privateKey, string base64Str) { return Encoding.UTF8.GetString(RSADecrypt(privateKey, Convert.FromBase64String(base64Str))); } //RSA的解密函数 byte public static byte[] RSADecrypt(string privateKey, byte[] destData) { using (var rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(privateKey); return rsa.Decrypt(destData, false); } } #endregion #endregion #region RSA数字签名 #region RSA签名 //RSA签名 public static string SignData(string privateKey, string source) { return SignData(privateKey, Encoding.UTF8.GetBytes(source)); } //RSA签名 public static string SignData(string privateKey, byte[] source) { using (var rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(privateKey); var RSAFormatter = new RSAPKCS1SignatureFormatter(rsa); //RSAFormatter.SetHashAlgorithm("MD5"); //var md5 = new LJLib.Tools.Encry.MD5(); ////执行签名 //return Convert.ToBase64String(RSAFormatter.CreateSignature(md5.ComputeHash(source))); RSAFormatter.SetHashAlgorithm("SHA256"); var sha = new LJLib.Tools.Encry.sha256(); //执行签名 return Convert.ToBase64String(RSAFormatter.CreateSignature(sha.Getsha256(source))); } } #endregion #region RSA 签名验证 public static bool Verify(string publicKey, string source, string signData) { return Verify(publicKey, Encoding.UTF8.GetBytes(source), signData); } public static bool Verify(string publicKey, byte[] source, string signData) { using (var rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(publicKey); var RSADeformatter = new RSAPKCS1SignatureDeformatter(rsa); //RSADeformatter.SetHashAlgorithm("MD5"); //var md5 = new LJLib.Tools.Encry.MD5(); //return RSADeformatter.VerifySignature(md5.ComputeHash(source), Convert.FromBase64String(signData)); RSADeformatter.SetHashAlgorithm("SHA256"); var sha = new LJLib.Tools.Encry.sha256(); return RSADeformatter.VerifySignature(sha.Getsha256(source), Convert.FromBase64String(signData)); } } #endregion #endregion } }