C# 常用的加密算法

C# 常用的加密算法

懒得看,直接拿来用的。
https://download.csdn.net/download/weixin_44347839/88618785?spm=1001.2014.3001.5501
先上总结:MD5、DES和SHA-1存在安全性问题,不推荐在安全敏感的应用中使用。AES和HMAC-SHA256提供较高的安全性,适用于数据加密和认证。RSA是一种强大的非对称加密算法,适用于加密和数字签名。Base64是一种数据编码方式,用于将二进制数据转换为可打印字符。

一、Sha1

SHA-1(Secure Hash Algorithm 1)是一种哈希函数,用于将任意长度的数据转换为固定长度的哈希值。
特点:固定长度输出,较快的计算速度。
缺点:安全性问题,容易受到碰撞攻击。

/// <summary>
        /// SHA1 加密 
        /// </summary>
        /// <param name="str">需要加密字符串</param>
        /// <param name="encode">指定加密编码</param>
        /// <param name="upperOrLower">大小写格式(大写:X2;小写:x2)默认小写</param> 
        public static string SHA1Encrypt(string str, Encoding encode, string upperOrLower = "x2")
        {
    
    
            try
            {
    
    
                var buffer = encode.GetBytes(str);//用指定编码转为bytes数组
                var data = SHA1.Create().ComputeHash(buffer);
                var sb = new StringBuilder();
                foreach (var t in data)
                {
    
    
                    sb.Append(t.ToString(upperOrLower));
                }

                return sb.ToString();
            }
            catch (Exception ex)
            {
    
    
                return "SHA1加密出错:" + ex.Message;
            }
        }

        /// <summary>
        /// SHA256加密
        /// </summary>
        /// <param name="strIN">要加密的string字符串</param>
        /// <returns>SHA256加密之后的密文</returns>
        public static string SHA256Encrypt(string strIN)
        {
    
    
            byte[] tmpByte;
            SHA256 sha256 = new SHA256Managed();
            tmpByte = sha256.ComputeHash(GetKeyByteArray(strIN));

            StringBuilder rst = new StringBuilder();
            for (int i = 0; i < tmpByte.Length; i++)
            {
    
    
                rst.Append(tmpByte[i].ToString("x2"));
            }
            sha256.Clear();
            return rst.ToString();
        }

        /// <summary>
        /// 获取要加密的string字符串字节数组
        /// </summary>
        /// <param name="strKey">待加密字符串</param>
        /// <returns>加密数组</returns>
        private static byte[] GetKeyByteArray(string strKey)
        {
    
    
            UTF8Encoding Asc = new UTF8Encoding();
            int tmpStrLen = strKey.Length;
            byte[] tmpByte = new byte[tmpStrLen - 1];
            tmpByte = Asc.GetBytes(strKey);
            return tmpByte;
        }

二、HMAC-SHA256

HMAC-SHA256(是一种基于SHA-256哈希函数的消息认证码算法。它使用一个密钥对消息进行哈希计算,以提供消息完整性和认证。
HMAC-SHA256是一种消息认证码算法,使用SHA-256哈希函数和密钥进行计算。
特点:提供消息完整性和认证,防止篡改和伪造消息。
缺点:HMAC-SHA256需要更多的计算和额外的密钥管理。会导致一些性能消耗。

        /// <summary>
        /// HmacSHA256 Base64算法,返回的结果始终是32位
        /// </summary>
        /// <param name="str">待加密的明文字符串</param>
        /// <param name="secret">密钥</param>
        /// <param name="encode">编码</param>
        /// <returns>HmacSHA256算法加密之后的密文</returns>
        public static string HmacSHA256(string str, string secret, Encoding encode)
        {
    
    
            byte[] keyByte = encode.GetBytes(secret);
            byte[] messageBytes = encode.GetBytes(str);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
    
    
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                return Convert.ToBase64String(hashmessage);
            }
        }

三、Base

Base加密是一种简单的编码方式,用于将二进制数据转换为可打印字符。它并不是一种加密算法,而是一种编码方案。
特点::Base加密是可逆的,大多数编程语言都提供了Base加密和解密的函数或库。加密后在文本环境中进行传输和显示,不会出现乱码问题。
缺点:安全性较低:Base加密不提供任何加密安全性,会导致数据体积的增加。

        /// <summary>
        /// base16编码
        /// </summary>
        /// <param name="str"></param>
        /// <param name="autoCode"></param>
        /// <returns></returns>
        public static string Base16Encrypt(string str, string[] autoCode = null)
        {
    
    
            string innerStr = string.Empty;
            StringBuilder strEn = new StringBuilder();
            if (autoCode == null || autoCode.Length < 16)
                autoCode = new string[] {
    
     "a", "2", "B", "g", "E", "5", "f", "6", "C", "8", "o", "9", "Z", "p", "k", "M" };
            System.Collections.ArrayList arr = new System.Collections.ArrayList(System.Text.Encoding.Default.GetBytes(str));
            for (int i = 0; i < arr.Count; i++)
            {
    
    
                byte data = (byte)arr[i];
                int v1 = data >> 4;
                strEn.Append(autoCode[v1]);
                int v2 = ((data & 0x0f) << 4) >> 4;
                strEn.Append(autoCode[v2]);
            }
            return strEn.ToString();
        }

        /// <summary>
        /// base64编码
        /// </summary>
        /// <param name="str"></param>
        /// <param name="encode"></param>
        /// <returns></returns>
        public static string Base64Encode(string str, Encoding encode)
        {
    
    
            var bytes = encode.GetBytes(str);
            return Convert.ToBase64String(bytes);
        }

        /// <summary>
        /// base64解码
        /// </summary>
        /// <param name="str"></param>
        /// <param name="encode"></param>
        /// <returns></returns>
        public static string Base64Decode(string str, Encoding encode)
        {
    
    
            var bytes = Convert.FromBase64String(str);
            return encode.GetString(bytes);
        }

四、MD5

MD5信息摘要算法,可以产生出一个128位(16字节)的散列值哈希值,用于确保信息传输完整一致。

        /// <summary>
        /// 计算字符串的MD5值
        /// </summary>
        public static string md5Encrypt(string str, Encoding encode)
        {
    
    
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] data = encode.GetBytes(str);
            byte[] md5Data = md5.ComputeHash(data, 0, data.Length);
            md5.Clear();

            string destString = "";
            for (int i = 0; i < md5Data.Length; i++)
            {
    
    
                destString += System.Convert.ToString(md5Data[i], 16).PadLeft(2, '0');
            }
            destString = destString.PadLeft(32, '0');
            return destString;
        }

        /// <summary>
        /// 计算文件的MD5值
        /// </summary>
        public static string md5fileEncrypt(string file)
        {
    
    
            try
            {
    
    
                FileStream fs = new FileStream(file, FileMode.Open);
                System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
                byte[] retVal = md5.ComputeHash(fs);
                fs.Close();

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < retVal.Length; i++)
                {
    
    
                    sb.Append(retVal[i].ToString("x2"));
                }
                return sb.ToString();
            }
            catch (Exception ex)
            {
    
    
                throw new Exception("md5file() fail, error:" + ex.Message);
            }
        }

五、DES

DES是一种对称加密算法,广泛应用于数据加密和保护领域。
特点:对称加密,分组加密,密钥长度较短。
缺点:密钥长度短,安全性相对较低,已经不推荐使用。

   /// <summary>
        /// 8位的加密秘钥
        /// </summary>
        private static string KEY = "CSharpKE";

        /// <summary>
        /// 8位以上的默认向量
        /// </summary>
        private static string IV = "CSharpIV";

        /// <summary>
        /// DES加密操作
        /// </summary>
        /// <param name="normalTxt"></param>
        /// <returns></returns>
        public static string DESEncrypt(string normalTxt)
        {
    
    
            byte[] _KEY = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY);
            byte[] _IV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV);

            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            int i = cryptoProvider.KeySize;
            MemoryStream ms = new MemoryStream();
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(_KEY, _IV), CryptoStreamMode.Write);

            StreamWriter sw = new StreamWriter(cst);
            sw.Write(normalTxt);
            sw.Flush();
            cst.FlushFinalBlock();
            sw.Flush();

            string strRet = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
            return strRet;
        }

        /// <summary>
        /// DES解密操作
        /// </summary>
        /// <param name="securityTxt">加密字符串</param>
        /// <returns></returns>
        public static string DESDecrypt(string securityTxt)//解密  
        {
    
    
            byte[] _KEY = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY);
            byte[] _IV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV);
            byte[] byEnc;
            try
            {
    
    
                securityTxt.Replace("_%_", "/");
                securityTxt.Replace("-%-", "#");
                byEnc = Convert.FromBase64String(securityTxt);
            }
            catch
            {
    
    
                return null;
            }
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            MemoryStream ms = new MemoryStream(byEnc);
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(_KEY, _IV), CryptoStreamMode.Read);
            StreamReader sr = new StreamReader(cst);
            return sr.ReadToEnd();
        }

六、RSA

RSA是一种非对称加密算法,使用公钥加密、私钥解密。
特点:非对称加密,安全性较高,可用于加密和数字签名。
缺点:计算速度较慢,适用于加密较小的数据。

  private const int RsaKeySize = 2048;
        private const string publicKeyFileName = "RSA.Pub";
        private const string privateKeyFileName = "RSA.Private";

        /// <summary>
        ///在给定路径中生成XML格式的私钥和公钥。
        /// </summary>
        public void GenerateKeys(string path)
        {
    
    
            using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
            {
    
    
                try
                {
    
    
                    // 获取私钥和公钥。
                    var publicKey = rsa.ToXmlString(false);
                    var privateKey = rsa.ToXmlString(true);

                    // 保存到磁盘
                    File.WriteAllText(Path.Combine(path, publicKeyFileName), publicKey);
                    File.WriteAllText(Path.Combine(path, privateKeyFileName), privateKey);

                }
                finally
                {
    
    
                    rsa.PersistKeyInCsp = false;
                }
            }
        }

        /// <summary>
        /// 用给定路径的RSA公钥文件加密纯文本。
        /// </summary>
        /// <param name="plainText">要加密的文本</param>
        /// <param name="pathToPublicKey">用于加密的公钥路径.</param>
        /// <returns>表示加密数据的64位编码字符串.</returns>
        public string RSAEncrypt(string plainText, string pathToPublicKey)
        {
    
    
            using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
            {
    
    
                try
                {
    
    
                    //加载公钥
                    var publicXmlKey = File.ReadAllText(pathToPublicKey);
                    rsa.FromXmlString(publicXmlKey);

                    var bytesToEncrypt = System.Text.Encoding.Unicode.GetBytes(plainText);

                    var bytesEncrypted = rsa.Encrypt(bytesToEncrypt, false);

                    return Convert.ToBase64String(bytesEncrypted);
                }
                finally
                {
    
    
                    rsa.PersistKeyInCsp = false;
                }
            }
        }

        /// <summary>
        /// 给定路径的RSA私钥文件解密 加密文本
        /// </summary>
        /// <param name="encryptedText">加密的密文</param>
        /// <param name="pathToPrivateKey">用于加密的私钥路径.</param>
        /// <returns>未加密数据的字符串</returns>
        public string RSADecrypt(string encryptedText, string pathToPrivateKey)
        {
    
    
            using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
            {
    
    
                try
                {
    
    
                    var privateXmlKey = File.ReadAllText(pathToPrivateKey);
                    rsa.FromXmlString(privateXmlKey);

                    var bytesEncrypted = Convert.FromBase64String(encryptedText);

                    var bytesPlainText = rsa.Decrypt(bytesEncrypted, false);

                    return System.Text.Encoding.Unicode.GetString(bytesPlainText);
                }
                finally
                {
    
    
                    rsa.PersistKeyInCsp = false;
                }
            }
        }

七、AES

AES是一种对称加密算法,使用相同的密钥进行加密和解密。
特点:对称加密,安全性强,计算速度较快。
缺点:无明显缺点,被广泛应用于数据加密。

 /// <summary>
        /// AES 算法加密
        /// </summary>
        /// <param name="content">明文</param>
        /// <param name="Key">密钥</param>
        /// <returns>加密后的密文</returns>
        public static string AESEncrypt(string encryptStr, string key = "12345678987654321234567890987654")
        {
    
    
            byte[] keyArray = Encoding.UTF8.GetBytes(key);
            byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptStr);
            RijndaelManaged rDel = new RijndaelManaged
            {
    
    
                Key = keyArray,
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };
            ICryptoTransform cTransform = rDel.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        public static string AESDecrypt(string decryptStr, string key = "12345678987654321234567890987654")
        {
    
    
            byte[] keyArray = Encoding.UTF8.GetBytes(key);
            byte[] toEncryptArray = Convert.FromBase64String(decryptStr);
            RijndaelManaged rDel = new RijndaelManaged
            {
    
    
                Key = keyArray,
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };
            ICryptoTransform cTransform = rDel.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Encoding.UTF8.GetString(resultArray);
        }

猜你喜欢

转载自blog.csdn.net/weixin_44347839/article/details/134926493