EncryptHelper

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace NugetLibs.HelpTool
{
    /// <summary>
    /// 加解密帮助类
    /// </summary>
    public class EncryptHelper
    {
        #region 默认密钥定义  
        /// <summary>  
        /// 默认加密密钥  
        /// </summary>  
        public const string DefaultDESKey = @"12345678";
        /// <summary>  
        /// 默认加密向量  
        /// </summary>  
        public const string DefaultDESIV = @"1234567812345678";
        /// <summary>  
        /// 默认加密密钥  
        /// </summary>  
        public const string Default3DESKey = @"123456781234567812345678";
        /// <summary>  
        /// 默认加密向量  
        /// </summary>  
        public const string Default3DESIV = @"1234567812345678";
        /// <summary>  
        /// 获取密钥  
        /// </summary>  
        public const string DefaultAESKey = @"12345678123456781234567812345678";
        /// <summary>  
        /// 获取向量  
        /// </summary>  
        public const string DefaultAESIV = @"1234567812345678";
        /// <summary>  
        /// 默认加密密钥  
        /// </summary>  
        public const string DefaultRC2Key = @"1234567812345678";
        /// <summary>  
        /// 默认加密向量  
        /// </summary>  
        public const string DefaultRC2IV = @"1234567812345678";
        /// <summary>  
        /// 默认的RSA公钥  
        /// </summary>  
        public const string DefaultRSAPublicKey = @"<RSAKeyValue>xxx</RSAKeyValue>";
        /// <summary>  
        /// 默认的RSA密钥  
        /// </summary>  
        public const string DefaultRSAPrivateKey = @"<RSAKeyValue>ccc</RSAKeyValue>";
        #endregion

        #region Base64编码和解码
        /// <summary>
        /// 把字符串进行Base64编码
        /// </summary>
        /// <param name="value">字符串</param>
        /// <returns>Base64编码字符串</returns>
        public static string ToBase64String(string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                return value;
            }
            byte[] bytes = Encoding.UTF8.GetBytes(value);
            return Convert.ToBase64String(bytes);
        }

        /// <summary>
        /// 把字符串进行Base64解码
        /// </summary>
        /// <param name="value">Base64编码字符串</param>
        /// <returns>原字符串</returns>
        public static string UnBase64String(string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                return value;
            }
            byte[] bytes = Convert.FromBase64String(value);
            return Encoding.UTF8.GetString(bytes);
        }
        #endregion

        #region 对称加密算法  

        #region 3DES对称加密算法  
        /// <summary>  
        /// 使用指定的128字节的密钥对8字节数组进行3Des加密  
        /// </summary>  
        /// <param name="plainStr">明文字符串</param>  
        /// <param name="key">密钥长度,可以为128(16字节),或是192(24字节)</param>  
        /// <param name="iv">加密向量长度64位以上(8个字节以上)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>已加密的字符串</returns>  
        public static string TripleDESEncrypt(string plainStr, string key = Default3DESKey, string iv = DefaultDESKey, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);

            string encrypt = null;
            var tdsc = new TripleDESCryptoServiceProvider();
            try
            {
                //加密模式,偏移  
                tdsc.Mode = mode;
                tdsc.Padding = padding;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, tdsc.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        if (isBase64Code)
                            encrypt = Convert.ToBase64String(mStream.ToArray());
                        else
                            ByteStrConvertHelper.ToString(mStream.ToArray());
                    }
                }
            }
            catch { }
            tdsc.Clear();

            return encrypt;
        }
        /// <summary>  
        /// 使用指定的128字节的密钥对8字节数组进行3Des解密  
        /// </summary>  
        /// <param name="encryptStr">密文字符串</param>  
        /// <param name="key">密钥长度,可以为128(16字节),或是192(24字节)</param>  
        /// <param name="iv">加密向量长度64位以上(8个字节以上)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>已解密的字符串</returns>  
        public static string TripleDESDecrypt(string encryptStr, string key = Default3DESKey, string iv = DefaultDESKey, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray;
            if (isBase64Code)
                byteArray = Convert.FromBase64String(encryptStr);
            else
                byteArray = ByteStrConvertHelper.ToBytes(encryptStr);

            string decrypt = null;
            var tdsc = new TripleDESCryptoServiceProvider();
            try
            {
                tdsc.Mode = mode;
                tdsc.Padding = padding;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, tdsc.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        decrypt = Encoding.UTF8.GetString(mStream.ToArray());
                    }
                }
            }
            catch { }
            tdsc.Clear();

            return decrypt;
        }
        #endregion

        #region DES对称加密算法  
        /// <summary>  
        /// DES加密  
        /// </summary>  
        /// <param name="plainStr">明文字符串</param>  
        /// <param name="key">加密密钥长度64位(8字节)</param>  
        /// <param name="iv">加密向量长度64位以上(8个字节以上)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>密文</returns>  
        public static string DESEncrypt(string plainStr, string key = DefaultDESKey, string iv = DefaultDESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);

            string encrypt = null;
            var des = new DESCryptoServiceProvider();
            try
            {
                des.Mode = mode;
                des.Padding = padding;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, des.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        if (isBase64Code)
                            encrypt = Convert.ToBase64String(mStream.ToArray());
                        else
                            ByteStrConvertHelper.ToString(mStream.ToArray());
                    }
                }
            }
            catch { }
            des.Clear();

            return encrypt;
        }

        /// <summary>  
        /// DES解密  
        /// </summary>  
        /// <param name="encryptStr">密文字符串</param>  
        /// <param name="key">加密密钥长度64位(8字节)</param>  
        /// <param name="iv">加密向量长度64位以上(8个字节以上)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>明文</returns>  
        public static string DESDecrypt(string encryptStr, string key = DefaultDESKey, string iv = DefaultDESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray;
            if (isBase64Code)
                byteArray = Convert.FromBase64String(encryptStr);
            else
                byteArray = ByteStrConvertHelper.ToBytes(encryptStr);

            string decrypt = null;
            var des = new DESCryptoServiceProvider();
            try
            {
                des.Mode = mode;
                des.Padding = padding;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, des.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        decrypt = Encoding.UTF8.GetString(mStream.ToArray());
                    }
                }
            }
            catch { }
            des.Clear();

            return decrypt;
        }
        #endregion

        #region AES加密算法  
        /// <summary>  
        /// AES加密  
        /// </summary>  
        /// <param name="plainStr">明文字符串</param>  
        /// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>  
        /// <param name="iv">加密向量(16到19字节)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>密文</returns>  
        public static string AESEncrypt(string plainStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);

            var encrypts = AESEncrypt(byteArray, key, iv, mode, padding);
            if (isBase64Code)
                return Convert.ToBase64String(encrypts);
            else
                return ByteStrConvertHelper.ToString(encrypts);
        }
        /// <summary>  
        /// AES加密  
        /// </summary>  
        /// <param name="plainbytes">明文字节数组</param>  
        /// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>  
        /// <param name="iv">加密向量(16到19字节)</param>
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>密文</returns>  
        public static byte[] AESEncrypt(byte[] plainbytes, string key = DefaultAESKey, string iv = DefaultAESIV, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray = plainbytes;

            byte[] encrypt = null;
            var aes = Rijndael.Create();
            try
            {
                aes.Padding = padding;
                aes.Mode = mode;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                    }
                    encrypt = mStream.ToArray();
                }
            }
            catch { }
            aes.Clear();

            return encrypt;
        }
        /// <summary>  
        /// AES加密  
        /// </summary>  
        /// <param name="plainbytes">明文字节数组</param>  
        /// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>  
        /// <param name="iv">加密向量(16到19字节)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>密文</returns>  
        public static string AESEncrypt(byte[] plainbytes, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);

            var encrypts = AESEncrypt(plainbytes, key, iv, mode, padding);
            if (isBase64Code)
                return Convert.ToBase64String(encrypts);
            else
                return ByteStrConvertHelper.ToString(encrypts);
        }
        /// <summary>  
        /// AES解密  
        /// </summary>  
        /// <param name="encryptStr">密文字符串</param>  
        /// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>  
        /// <param name="iv">加密向量(16到19字节)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>明文</returns>  
        public static string AESDecrypt(string encryptStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray;
            if (isBase64Code)
                byteArray = Convert.FromBase64String(encryptStr);
            else
                byteArray = ByteStrConvertHelper.ToBytes(encryptStr);

            string decrypt = null;
            var aes = Rijndael.Create();
            try
            {
                aes.Mode = mode;
                aes.Padding = padding;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        decrypt = Encoding.UTF8.GetString(mStream.ToArray());
                    }
                }
            }
            catch { }
            aes.Clear();

            return decrypt;
        }
        /// <summary>  
        /// AES解密  
        /// </summary>  
        /// <param name="encryptStr">密文字符串</param>  
        /// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>  
        /// <param name="iv">加密向量(16到19字节)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>明文字节数组</returns>  
        public static byte[] AESDecryptToBytes(string encryptStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray;
            if (isBase64Code)
                byteArray = Convert.FromBase64String(encryptStr);
            else
                byteArray = ByteStrConvertHelper.ToBytes(encryptStr);

            byte[] decrypt = null;
            var aes = Rijndael.Create();
            try
            {
                aes.Mode = mode;
                aes.Padding = padding;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                    }
                    decrypt = mStream.ToArray();
                }
            }
            catch { }
            aes.Clear();

            return decrypt;
        }
        /// <summary>  
        /// AES解密  
        /// </summary>  
        /// <param name="encryptByte">密文字节数组</param>  
        /// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>  
        /// <param name="iv">加密向量(16到19字节)</param>
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>明文字节数组</returns>  
        public static byte[] AESDecryptToBytes(byte[] encryptByte, string key = DefaultAESKey, string iv = DefaultAESIV, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray = encryptByte;

            byte[] decrypt = null;
            var aes = Rijndael.Create();
            try
            {
                aes.Mode = mode;
                aes.Padding = padding;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                    }
                    decrypt = mStream.ToArray();
                }
            }
            catch { }
            aes.Clear();

            return decrypt;
        }
        #endregion

        #region RC2加密算法  
        /// <summary>  
        /// RC2加密  
        /// </summary>  
        /// <param name="plainStr">明文字符串</param>  
        /// <param name="key">加密密钥支持40~128长度,可以每8位递增(5到16个长度的字符串)</param>  
        /// <param name="iv">加密向量64位以上(8个字节上去字符串)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>密文</returns>  
        public static string RC2Encrypt(string plainStr, string key = DefaultRC2Key, string iv = DefaultRC2IV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);

            string encrypt = null;
            var rc2 = new RC2CryptoServiceProvider();
            try
            {
                rc2.Padding = padding;
                rc2.Mode = mode;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, rc2.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        if (isBase64Code)
                            encrypt = Convert.ToBase64String(mStream.ToArray());
                        else
                            encrypt = ByteStrConvertHelper.ToString(mStream.ToArray());
                    }
                }
            }
            catch { }
            rc2.Clear();

            return encrypt;
        }

        /// <summary>  
        /// RC2解密  
        /// </summary>  
        /// <param name="encryptStr">明文字符串</param>  
        /// <param name="key">加密密钥支持40~128长度,可以每8位递增(5到16个长度的字符串)</param>  
        /// <param name="iv">加密向量64位以上(8个字节上去字符串)</param>  
        /// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>  
        /// <param name="mode">加密模式</param>  
        /// <param name="padding">填充模式</param>  
        /// <returns>明文</returns>  
        public static string RC2Decrypt(string encryptStr, string key = DefaultRC2Key, string iv = DefaultRC2IV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(key);
            byte[] bIV = Encoding.UTF8.GetBytes(iv);
            byte[] byteArray;
            if (isBase64Code)
                byteArray = Convert.FromBase64String(encryptStr);
            else
                byteArray = ByteStrConvertHelper.ToBytes(encryptStr);

            string decrypt = null;
            var rc2 = new RC2CryptoServiceProvider();
            try
            {
                rc2.Mode = mode;
                rc2.Padding = padding;
                using (var mStream = new MemoryStream())
                {
                    using (var cStream = new CryptoStream(mStream, rc2.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        decrypt = Encoding.UTF8.GetString(mStream.ToArray());
                    }
                }
            }
            catch { }
            rc2.Clear();

            return decrypt;
        }
        #endregion

        #endregion

        #region 哈稀算法  

        #region 获取哈稀散列值  
        /// <summary>  
        /// 使用md5计算散列  
        /// </summary>  
        /// <param name="source">要用MD5算散列的字节数据</param>  
        /// <returns>经过MD5算散列后的数据</returns>  
        public static byte[] Hash(byte[] source)
        {
            if ((source == null) || (source.Length == 0)) throw new ArgumentException("source is not valid");
            var m = MD5.Create();
            return m.ComputeHash(source);
        }
        /// <summary>  
        /// 对传入的明文密码进行Hash加密,密码不能为中文  
        /// </summary>  
        /// <param name="oriPassword">需要加密的明文密码</param>  
        /// <returns>经过Hash加密的密码</returns>  
        public static string HashPassword(string oriPassword)
        {
            if (string.IsNullOrEmpty(oriPassword))
                throw new ArgumentException("oriPassword is valid");

            var acii = new ASCIIEncoding();
            var hashedBytes = Hash(acii.GetBytes(oriPassword));
            return ByteStrConvertHelper.ToString(hashedBytes);
        }
        /// <summary>  
        /// 计算MD5  
        /// </summary>  
        /// <param name="data">要算MD5的字符串</param>  
        /// <param name="isBase64Code">是否是Base64编码</param>  
        /// <returns>MD5字符串</returns>  
        public static string HashMD5(string data, bool isBase64Code = false)
        {
            if (string.IsNullOrEmpty(data)) return "";
            var md5 = new MD5CryptoServiceProvider();
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            bytes = md5.ComputeHash(bytes);
            md5.Clear();
            if (isBase64Code)
                return Convert.ToBase64String(bytes);
            else
                return ByteStrConvertHelper.ToString(bytes);
        }
        /// <summary>
        /// 把字符串进行32位MD5加密
        /// </summary>
        /// <param name="str">要加密的字符串</param>
        /// <returns>加密的字符串</returns>
        public static string HashMD532(string str)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] strByte = Encoding.Default.GetBytes(str);
            byte[] md5Data = md5.ComputeHash(strByte);
            md5.Clear();
            StringBuilder strBuilder = new StringBuilder();
            for (var i = 0; i < md5Data.Length; i++)
            {
                strBuilder.Append(md5Data[i].ToString("x2"));
            }
            return strBuilder.ToString();
        }
        /// <summary>  
        /// 生成16位的MD5散列值  
        /// </summary>  
        /// <param name="data">要算MD5的字符串</param>  
        /// <returns></returns>  
        public static string HashMD516(string data)
        {
            var md5 = new MD5CryptoServiceProvider();
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            return ByteStrConvertHelper.ToString(md5.ComputeHash(bytes)).Substring(8, 16);
        }

        /// <summary>  
        /// 对字符串进行SHA1散列  
        /// </summary>  
        /// <param name="data">需要哈稀的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>密文</returns>  
        public static string HashSHA1(string data, bool isBase64 = false)
        {
            var StrRes = Encoding.UTF8.GetBytes(data);
            HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
            StrRes = iSHA.ComputeHash(StrRes);
            if (isBase64)
                return Convert.ToBase64String(StrRes);
            else
                return ByteStrConvertHelper.ToString(StrRes);
        }

        /// <summary>  
        /// SHA256加密,不可逆转  
        /// </summary>  
        /// <param name="data">string data:被加密的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>返回加密后的字符串</returns>  
        public static string HashSHA256(string data, bool isBase64 = false)
        {
            SHA256 s256 = new SHA256CryptoServiceProvider();
            byte[] byte1 = Encoding.UTF8.GetBytes(data);
            byte1 = s256.ComputeHash(byte1);
            s256.Clear();
            if (isBase64)
                return Convert.ToBase64String(byte1);
            else
                return ByteStrConvertHelper.ToString(byte1);
        }

        /// <summary>  
        /// SHA384加密,不可逆转  
        /// </summary>  
        /// <param name="data">string data:被加密的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>返回加密后的字符串</returns>  
        public static string HashSHA384(string data, bool isBase64 = false)
        {
            SHA384 s384 = new SHA384CryptoServiceProvider();
            byte[] byte1 = Encoding.UTF8.GetBytes(data);
            byte1 = s384.ComputeHash(byte1);
            s384.Clear();
            if (isBase64)
                return Convert.ToBase64String(byte1);
            else
                return ByteStrConvertHelper.ToString(byte1);
        }

        /// <summary>  
        /// SHA512加密,不可逆转  
        /// </summary>  
        /// <param name="data">string data:被加密的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>返回加密后的字符串</returns>  
        public static string HashSHA512(string data, bool isBase64 = false)
        {
            SHA512 s512 = new SHA512CryptoServiceProvider();
            byte[] byte1 = Encoding.Default.GetBytes(data);
            byte1 = s512.ComputeHash(byte1);
            s512.Clear();
            if (isBase64)
                return Convert.ToBase64String(byte1);
            else
                return ByteStrConvertHelper.ToString(byte1);
        }
        #endregion

        #region 带混淆字符串的散列  
        /// <summary>  
        /// 对字符串进行HmacMD5散列  
        /// </summary>  
        /// <param name="key">密钥</param>  
        /// <param name="data">需要哈稀的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>密文</returns>  
        public static string HmacMD5(string key, string data, bool isBase64 = false)
        {
            var StrRes = Encoding.UTF8.GetBytes(data);
            var bkey = Encoding.UTF8.GetBytes(key);
            var hmacSha1 = new HMACMD5(bkey);
            StrRes = hmacSha1.ComputeHash(StrRes);
            if (isBase64)
                return Convert.ToBase64String(StrRes);
            else
                return ByteStrConvertHelper.ToString(StrRes);
        }

        /// <summary>  
        /// 对字符串进行HmacSHA1散列  
        /// </summary>  
        /// <param name="key">密钥</param>  
        /// <param name="data">需要哈稀的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>密文</returns>  
        public static string HmacSHA1(string key, string data, bool isBase64 = false)
        {
            var StrRes = Encoding.UTF8.GetBytes(data);
            var bkey = Encoding.UTF8.GetBytes(key);
            HMACSHA1 hmacSha1 = new HMACSHA1(bkey);
            StrRes = hmacSha1.ComputeHash(StrRes);
            if (isBase64)
                return Convert.ToBase64String(StrRes);
            else
                return ByteStrConvertHelper.ToString(StrRes);
        }

        /// <summary>  
        /// 对字符串进行HmacSHA256散列  
        /// </summary>  
        /// <param name="key">密钥</param>  
        /// <param name="data">需要哈稀的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>密文</returns>  
        public static string HmacSHA256(string key, string data, bool isBase64 = false)
        {
            var StrRes = Encoding.UTF8.GetBytes(data);
            var bkey = Encoding.UTF8.GetBytes(key);
            var hmacSha1 = new HMACSHA256(bkey);
            StrRes = hmacSha1.ComputeHash(StrRes);
            if (isBase64)
                return Convert.ToBase64String(StrRes);
            else
                return ByteStrConvertHelper.ToString(StrRes);
        }

        /// <summary>  
        /// 对字符串进行HmacSHA384散列  
        /// </summary>  
        /// <param name="key">密钥</param>  
        /// <param name="data">需要哈稀的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>密文</returns>  
        public static string HmacSHA384(string key, string data, bool isBase64 = false)
        {
            var StrRes = Encoding.UTF8.GetBytes(data);
            var bkey = Encoding.UTF8.GetBytes(key);
            var hmacSha1 = new HMACSHA384(bkey);
            StrRes = hmacSha1.ComputeHash(StrRes);
            if (isBase64)
                return Convert.ToBase64String(StrRes);
            else
                return ByteStrConvertHelper.ToString(StrRes);
        }

        /// <summary>  
        /// 对字符串进行HmacSHA512散列  
        /// </summary>  
        /// <param name="key">密钥</param>  
        /// <param name="data">需要哈稀的字符串</param>  
        /// <param name="isBase64">是否采用Base64</param>  
        /// <returns>密文</returns>  
        public static string HmacSHA512(string key, string data, bool isBase64 = false)
        {
            var StrRes = Encoding.UTF8.GetBytes(data);
            var bkey = Encoding.UTF8.GetBytes(key);
            var hmacSha1 = new HMACSHA512(bkey);
            StrRes = hmacSha1.ComputeHash(StrRes);
            if (isBase64)
                return Convert.ToBase64String(StrRes);
            else
                return ByteStrConvertHelper.ToString(StrRes);
        }
        #endregion

        #endregion

        #region 非对称加密算法  
        /// <summary>  
        /// RSA加密  
        /// </summary>  
        /// <param name="plaintData">明文</param>  
        /// <param name="publicKey">RSA公钥</param>  
        /// <param name="isBase64">输出数据是否用Base64编码</param>  
        /// <returns></returns>  
        public static string RSAEncrypt(string plaintData, string publicKey = DefaultRSAPublicKey, bool isBase64 = false)
        {
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(publicKey);
            var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plaintData), false);
            if (isBase64)
                return Convert.ToBase64String(cipherbytes);
            else
                return ByteStrConvertHelper.ToString(cipherbytes);
        }
        /// <summary>  
        /// RSA解密  
        /// </summary>  
        /// <param name="encryptData">密文</param>  
        /// <param name="privateKey">RSA私钥</param>  
        /// <param name="isBase64">密文数据是否用Base64编码</param>  
        /// <returns></returns>  
        public static string RSADecrypt(string encryptData, string privateKey = DefaultRSAPublicKey, bool isBase64 = false)
        {
            byte[] bData;
            if (isBase64)
                bData = Convert.FromBase64String(encryptData);
            else
                bData = ByteStrConvertHelper.ToBytes(encryptData);
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(privateKey);
            var cipherbytes = rsa.Decrypt(bData, false);
            return Encoding.UTF8.GetString(cipherbytes);
        }
        /// <summary>  
        /// RSA加密  
        /// </summary>  
        /// <param name="plaintData">明文</param>  
        /// <param name="publicKey">RSA公钥</param>  
        /// <param name="isBase64">输出数据是否用Base64编码</param>  
        /// <returns></returns>  
        public static string RSAEncrypt(string plaintData, RSAParameters publicKey, bool isBase64 = false)
        {
            var rsa = new RSACryptoServiceProvider();
            rsa.ImportParameters(publicKey);
            var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plaintData), false);
            if (isBase64)
                return Convert.ToBase64String(cipherbytes);
            else
                return ByteStrConvertHelper.ToString(cipherbytes);
        }
        /// <summary>  
        /// RSA解密  
        /// </summary>  
        /// <param name="encryptData">密文</param>  
        /// <param name="privateKey">RSA私钥</param>  
        /// <param name="isBase64">密文数据是否用Base64编码</param>  
        /// <returns></returns>  
        public static string RSADecrypt(string encryptData, RSAParameters privateKey, bool isBase64 = false)
        {
            byte[] bData;
            if (isBase64)
                bData = Convert.FromBase64String(encryptData);
            else
                bData = ByteStrConvertHelper.ToBytes(encryptData);
            var rsa = new RSACryptoServiceProvider();
            rsa.ImportParameters(privateKey);
            var cipherbytes = rsa.Decrypt(bData, false);
            return Encoding.UTF8.GetString(cipherbytes);
        }
        #endregion
    }

    /// <summary>  
    /// RSA加解密类  
    /// </summary>  
    public class RSACryptionHelper
    {
        #region RSA 加密解密   

        #region RSA 的密钥产生   
        /// <summary>  
        /// RSA 的密钥产生 产生私钥 和公钥   
        /// </summary>  
        /// <param name="xmlKeys"></param>  
        /// <param name="xmlPublicKey"></param>  
        public void RSAKey(out string xmlKeys, out string xmlPublicKey)
        {
            var rsa = new RSACryptoServiceProvider();
            xmlKeys = rsa.ToXmlString(true);
            xmlPublicKey = rsa.ToXmlString(false);
        }
        #endregion

        #region RSA的加密函数   
        //##############################################################################   
        //RSA 方式加密   
        //说明KEY必须是XML的行式,返回的是字符串   
        //在有一点需要说明!!该加密方式有 长度 限制的!!   
        //##############################################################################   

        //RSA的加密函数  string  
        /// <summary>  
        /// RSA加密  
        /// </summary>  
        /// <param name="xmlPublicKey"></param>  
        /// <param name="m_strEncryptString"></param>  
        /// <returns></returns>  
        public string RSAEncrypt(string xmlPublicKey, string m_strEncryptString)
        {

            byte[] PlainTextBArray;
            byte[] CypherTextBArray;
            string Result;
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPublicKey);
            PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);
            CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
            Result = Convert.ToBase64String(CypherTextBArray);
            return Result;

        }
        //RSA的加密函数 byte[]  
        /// <summary>  
        /// RSA解密  
        /// </summary>  
        /// <param name="xmlPublicKey"></param>  
        /// <param name="EncryptString"></param>  
        /// <returns></returns>  
        public string RSAEncrypt(string xmlPublicKey, byte[] EncryptString)
        {

            byte[] CypherTextBArray;
            string Result;
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPublicKey);
            CypherTextBArray = rsa.Encrypt(EncryptString, false);
            Result = Convert.ToBase64String(CypherTextBArray);
            return Result;

        }
        #endregion

        #region RSA的解密函数   
        /// <summary>  
        /// RSA的解密函数  string  
        /// </summary>  
        /// <param name="xmlPrivateKey"></param>  
        /// <param name="m_strDecryptString"></param>  
        /// <returns></returns>  
        public string RSADecrypt(string xmlPrivateKey, string m_strDecryptString)
        {
            byte[] PlainTextBArray;
            byte[] DypherTextBArray;
            string Result;
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPrivateKey);
            PlainTextBArray = Convert.FromBase64String(m_strDecryptString);
            DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);
            Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
            return Result;

        }

        /// <summary>  
        /// RSA的解密函数  byte  
        /// </summary>  
        /// <param name="xmlPrivateKey"></param>  
        /// <param name="DecryptString"></param>  
        /// <returns></returns>  
        public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString)
        {
            byte[] DypherTextBArray;
            string Result;
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPrivateKey);
            DypherTextBArray = rsa.Decrypt(DecryptString, false);
            Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
            return Result;

        }
        #endregion

        #endregion

        #region RSA 数字签名   

        #region 获取Hash描述表  
        /// <summary>  
        /// 获取Hash描述表  
        /// </summary>  
        /// <param name="m_strSource"></param>  
        /// <param name="HashData"></param>  
        /// <returns></returns>  
        public bool GetHash(string m_strSource, ref byte[] HashData)
        {
            //从字符串中取得Hash描述   
            byte[] Buffer;
            var MD5 = HashAlgorithm.Create("MD5");
            Buffer = Encoding.UTF8.GetBytes(m_strSource);
            HashData = MD5.ComputeHash(Buffer);

            return true;
        }

        /// <summary>  
        /// 获取Hash描述表  
        /// </summary>  
        /// <param name="m_strSource"></param>  
        /// <param name="strHashData"></param>  
        /// <returns></returns>  
        public bool GetHash(string m_strSource, ref string strHashData)
        {
            //从字符串中取得Hash描述   
            byte[] Buffer;
            byte[] HashData;
            var MD5 = HashAlgorithm.Create("MD5");
            Buffer = Encoding.UTF8.GetBytes(m_strSource);
            HashData = MD5.ComputeHash(Buffer);

            strHashData = Convert.ToBase64String(HashData);
            return true;

        }

        /// <summary>  
        /// 获取Hash描述表  
        /// </summary>  
        /// <param name="objFile"></param>  
        /// <param name="HashData"></param>  
        /// <returns></returns>  
        public bool GetHash(FileStream objFile, ref byte[] HashData)
        {
            //从文件中取得Hash描述   
            var MD5 = HashAlgorithm.Create("MD5");
            HashData = MD5.ComputeHash(objFile);
            objFile.Close();

            return true;

        }

        /// <summary>  
        /// 获取Hash描述表  
        /// </summary>  
        /// <param name="objFile"></param>  
        /// <param name="strHashData"></param>  
        /// <returns></returns>  
        public bool GetHash(FileStream objFile, ref string strHashData)
        {
            //从文件中取得Hash描述   
            byte[] HashData;
            var MD5 = HashAlgorithm.Create("MD5");
            HashData = MD5.ComputeHash(objFile);
            objFile.Close();

            strHashData = Convert.ToBase64String(HashData);

            return true;
        }
        #endregion

        #region RSA 签名  
        /// <summary>  
        /// RSA 签名  
        /// </summary>  
        /// <param name="privateKey">Xml私钥</param>  
        /// <param name="hashData">待签名Hash描述</param>  
        /// <param name="signatureData">签名后的结果</param>  
        /// <returns></returns>  
        public bool Signature(string privateKey, byte[] hashData, ref byte[] signatureData)
        {
            try
            {
                var RSA = new RSACryptoServiceProvider();
                RSA.FromXmlString(privateKey);
                var RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
                //设置签名的算法为MD5   
                RSAFormatter.SetHashAlgorithm("MD5");
                //执行签名   
                signatureData = RSAFormatter.CreateSignature(hashData);
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>  
        /// RSA 签名  
        /// </summary>  
        /// <param name="privateKey">Xml私钥</param>  
        /// <param name="hashData">待签名Hash描述</param>  
        /// <param name="signatureData">签名后的结果</param>  
        /// <returns></returns>  
        public bool Signature(string privateKey, byte[] hashData, ref string signatureData)
        {
            try
            {
                var RSA = new RSACryptoServiceProvider();
                RSA.FromXmlString(privateKey);
                var RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
                //设置签名的算法为MD5   
                RSAFormatter.SetHashAlgorithm("MD5");
                //执行签名   
                signatureData = Convert.ToBase64String(RSAFormatter.CreateSignature(hashData));
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>  
        /// RSA 签名  
        /// </summary>  
        /// <param name="privateKey">Xml私钥</param>  
        /// <param name="hashData">待签名Hash描述</param>  
        /// <param name="signatureData">签名后的结果</param>  
        /// <returns></returns>  
        public bool Signature(string privateKey, string hashData, ref byte[] signatureData)
        {
            try
            {
                var RSA = new RSACryptoServiceProvider();
                RSA.FromXmlString(privateKey);
                var RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
                //设置签名的算法为MD5   
                RSAFormatter.SetHashAlgorithm("MD5");
                //执行签名   
                var bHashData = Convert.FromBase64String(hashData);
                signatureData = RSAFormatter.CreateSignature(bHashData);

                return true;
            }
            catch { return false; }
        }

        /// <summary>  
        /// RSA 签名  
        /// </summary>  
        /// <param name="privateKey">Xml私钥</param>  
        /// <param name="hashData">待签名Hash描述</param>  
        /// <param name="signatureData">签名后的结果</param>  
        /// <returns></returns>  
        public bool Signature(string privateKey, string hashData, ref string signatureData)
        {
            try
            {
                var RSA = new RSACryptoServiceProvider();
                RSA.FromXmlString(privateKey);
                var RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
                //设置签名的算法为MD5   
                RSAFormatter.SetHashAlgorithm("MD5");
                //执行签名   
                var bHashData = Convert.FromBase64String(hashData);
                signatureData = Convert.ToBase64String(RSAFormatter.CreateSignature(bHashData));
                return true;
            }
            catch { return false; }
        }
        #endregion

        #region RSA 签名验证   
        /// <summary>  
        /// RSA签名验证(验证时,函数RSADeformatter.VerifySignature先用公钥解密signatureData)  
        /// </summary>  
        /// <param name="publicKey">Xml字符串公钥</param>  
        /// <param name="hashData">Hash描述(刚生成的报文摘要)</param>  
        /// <param name="signatureData">签名后的结果(等待验证的私钥加密的Hash描述)</param>  
        /// <returns></returns>  
        public bool VerifySignature(string publicKey, byte[] hashData, byte[] signatureData)
        {
            var RSA = new RSACryptoServiceProvider();
            RSA.FromXmlString(publicKey);
            var RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
            //指定解密的时候HASH算法为MD5   
            RSADeformatter.SetHashAlgorithm("MD5");
            return (RSADeformatter.VerifySignature(hashData, signatureData));
        }
        /// <summary>  
        /// RSA签名验证(验证时,函数RSADeformatter.VerifySignature先用公钥解密signatureData)  
        /// </summary>  
        /// <param name="publicKey">Xml字符串公钥</param>  
        /// <param name="hashData">Hash描述(刚生成的报文摘要)</param>  
        /// <param name="signatureData">签名后的结果(等待验证的私钥加密的Hash描述)</param>  
        /// <returns></returns>  
        public bool VerifySignature(string publicKey, string hashData, byte[] signatureData)
        {
            byte[] bHashData = Convert.FromBase64String(hashData);
            return VerifySignature(publicKey, bHashData, signatureData);
        }
        /// <summary>  
        /// RSA签名验证(验证时,函数RSADeformatter.VerifySignature先用公钥解密signatureData)  
        /// </summary>  
        /// <param name="publicKey">Xml字符串公钥</param>  
        /// <param name="hashData">Hash描述(刚生成的报文摘要)</param>  
        /// <param name="signatureData">签名后的结果(等待验证的私钥加密的Hash描述)</param>  
        /// <returns></returns>  
        public bool VerifySignature(string publicKey, byte[] hashData, string signatureData)
        {
            var bSignatureData = Convert.FromBase64String(signatureData);
            return VerifySignature(publicKey, hashData, bSignatureData);
        }
        /// <summary>  
        /// RSA签名验证(验证时,函数RSADeformatter.VerifySignature先用公钥解密signatureData)  
        /// </summary>  
        /// <param name="publicKey">Xml字符串公钥</param>  
        /// <param name="hashData">Hash描述(刚生成的报文摘要)</param>  
        /// <param name="signatureData">签名后的结果(等待验证的私钥加密的Hash描述)</param>  
        /// <returns></returns>  
        public bool VerifySignature(string publicKey, string hashData, string signatureData)
        {
            var bHashData = Convert.FromBase64String(hashData);
            var bSignatureData = Convert.FromBase64String(signatureData);
            return VerifySignature(publicKey, bHashData, bSignatureData);
        }
        #endregion

        #endregion
    }
}

 

posted @ 2019-10-22 18:09  DarJeely  阅读(269)  评论(0编辑  收藏  举报