• 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
        }
    }
  • 相关阅读:
    Java8新特性3 Stream
    注解
    Base64编码
    代理
    Cglib
    快照
    Java安全模式
    Hibernet缓存详解
    中文文档
    JDK1.8时间日期函数
  • 原文地址:https://www.cnblogs.com/Jeely/p/11721499.html
Copyright © 2020-2023  润新知