• net core体系-web应用程序-4asp.net core2.0 项目实战(1)-8项目加密解密方案


    本文目录
    1. 摘要
    2. MD5加密封装
    3. AES的加密、解密
    4. DES加密/解密
    5. 总结

    1.  摘要

      C#中常用的一些加密和解密方案,如:md5加密、RSA加密与解密和DES加密等,Asp.Net Core 2.0下该如何调整与使用我们以前常用的解加密算法类呢,下面是我整理的MD5加密、AES&DES对称加解密、Encrypt&Decrypt加解密完整实例。希望能给大家提供一些参考和帮助。

      

    2.  MD5加密封装

      MD5常用加密FormsAuthentication.HashPasswordForStoringInConfigFile在Net Freamwork4.5以后就不在支持,下面整理了32位或16位下的几个方法,以及不同写法,最后一个由从老版本迁移过来,后续淘汰不用。

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace NC.Common
    {
        /// <summary>
        /// 此类获取md5加密值均为大写,如果要获取小写:MD5Comm.Get32MD5One(xx).ToLower();或完善此类。
        /// </summary>
        public class MD5Comm
        {
            #region --Expired code--
            ///// <summary>
            ///// MD5加密
            ///// </summary>
            //public string Md5(string txt)
            //{
            //    //return FormsAuthentication.HashPasswordForStoringInConfigFile(txt, "MD5");//此方法nf4.5后不再支持
            //}
            //public string Md5Pass(string pwd)
            //{
            //    return Md5(pwd + "Jiahao");
            //} 
            #endregion
    
            /// <summary>
            /// 此代码示例通过创建哈希字符串适用于任何 MD5 哈希函数 (在任何平台) 上创建 32 个字符的十六进制格式哈希字符串
            /// 官网案例改编
            /// </summary>
            /// <param name="source"></param>
            /// <returns></returns>
            public static string Get32MD5One(string source)
            {
                using (MD5 md5Hash = MD5.Create())
                {
                    byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source));
                    StringBuilder sBuilder = new StringBuilder();
                    for (int i = 0; i < data.Length; i++)
                    {
                        sBuilder.Append(data[i].ToString("x2"));
                    }
    
                    string hash = sBuilder.ToString();
                    return hash.ToUpper();
                }
            }
            /// <summary>
            /// 获取16位md5加密
            /// </summary>
            /// <param name="source"></param>
            /// <returns></returns>
            public static string Get16MD5One(string source)
            {
                using (MD5 md5Hash = MD5.Create())
                {
                    byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source));
                    //转换成字符串,并取9到25位
                    string sBuilder = BitConverter.ToString(data, 4, 8);
                    //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉
                    sBuilder = sBuilder.Replace("-", "");
                    return sBuilder.ToString().ToUpper();
                }
            }
            //// <summary>
            /// </summary>
            /// <param name="strSource">需要加密的明文</param>
            /// <returns>返回32位加密结果,该结果取32位加密结果的第9位到25位</returns>
            public static string Get32MD5Two(string source)
            {
                System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
                //获取密文字节数组
                byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
                //转换成字符串,32位
                string strResult = BitConverter.ToString(bytResult);
                //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉
                strResult = strResult.Replace("-", "");
                return strResult.ToUpper();
            }
            //// <summary>
            /// </summary>
            /// <param name="strSource">需要加密的明文</param>
            /// <returns>返回16位加密结果,该结果取32位加密结果的第9位到25位</returns>
            public static string Get16MD5Two(string source)
            {
                System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
                //获取密文字节数组
                byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
                //转换成字符串,并取9到25位
                string strResult = BitConverter.ToString(bytResult, 4, 8);
                //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉
                strResult = strResult.Replace("-", "");
                return strResult.ToUpper();
            }
            /// <summary>
            /// 自定义MD5函数,32位,从老版本迁移过来,后续淘汰不用。与Get32MD5One重复
            /// </summary>
            public static string Get32MD5Old(string str)
            {
                byte[] b = Encoding.UTF8.GetBytes(str);
                b = new MD5CryptoServiceProvider().ComputeHash(b);
                string ret = "";
                for (int i = 0; i < b.Length; i++)
                    ret += b[i].ToString("x").PadLeft(2, '0');
    
                return ret.ToUpper();
            }
        }
    }
    复制代码

    3.  AES的加密、解密

      上面我们介绍了MD5加密封装,接下来分享给大家供大家参考一下AES加密、解密,AES要注意的是32位密匙。AES 加密解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

    复制代码
    using System;
    using System.IO;
    using System.Text;
    using System.Security.Cryptography;
    
    namespace NC.Common
    {
        /// <summary> 
        /// 加密
        /// </summary> 
        public class AES
        {
            //默认密钥向量
            private static byte[] Keys = { 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79, 0x53, 0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F };
    
            public static string Encode(string encryptString, string encryptKey)
            {
                encryptKey = GetSubString(encryptKey,0, 32, "");
                encryptKey = encryptKey.PadRight(32, ' ');
    
                RijndaelManaged rijndaelProvider = new RijndaelManaged();
                rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 32));
                rijndaelProvider.IV = Keys;
                ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();
    
                byte[] inputData = Encoding.UTF8.GetBytes(encryptString);
                byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length);
    
                return Convert.ToBase64String(encryptedData);
            }
    
            public static string Decode(string decryptString, string decryptKey)
            {
                try
                {
                    decryptKey = GetSubString(decryptKey,0, 32, "");
                    decryptKey = decryptKey.PadRight(32, ' ');
    
                    RijndaelManaged rijndaelProvider = new RijndaelManaged();
                    rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
                    rijndaelProvider.IV = Keys;
                    ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();
    
                    byte[] inputData = Convert.FromBase64String(decryptString);
                    byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);
    
                    return Encoding.UTF8.GetString(decryptedData);
                }
                catch
                {
                    return "";
                }
    
            }
    
            public static string GetSubString(string p_SrcString, int p_StartIndex, int p_Length, string p_TailString)
            {
                string myResult = p_SrcString;
    
                Byte[] bComments = Encoding.UTF8.GetBytes(p_SrcString);
                foreach (char c in Encoding.UTF8.GetChars(bComments))
                {    //当是日文或韩文时(注:中文的范围:u4e00 - u9fa5, 日文在u0800 - u4e00, 韩文为xAC00-xD7A3)
                    if ((c > 'u0800' && c < 'u4e00') || (c > 'xAC00' && c < 'xD7A3'))
                    {
                        //if (System.Text.RegularExpressions.Regex.IsMatch(p_SrcString, "[u0800-u4e00]+") || System.Text.RegularExpressions.Regex.IsMatch(p_SrcString, "[xAC00-xD7A3]+"))
                        //当截取的起始位置超出字段串长度时
                        if (p_StartIndex >= p_SrcString.Length)
                            return "";
                        else
                            return p_SrcString.Substring(p_StartIndex,
                                                           ((p_Length + p_StartIndex) > p_SrcString.Length) ? (p_SrcString.Length - p_StartIndex) : p_Length);
                    }
                }
    
                if (p_Length >= 0)
                {
                    byte[] bsSrcString = Encoding.Default.GetBytes(p_SrcString);
    
                    //当字符串长度大于起始位置
                    if (bsSrcString.Length > p_StartIndex)
                    {
                        int p_EndIndex = bsSrcString.Length;
    
                        //当要截取的长度在字符串的有效长度范围内
                        if (bsSrcString.Length > (p_StartIndex + p_Length))
                        {
                            p_EndIndex = p_Length + p_StartIndex;
                        }
                        else
                        {   //当不在有效范围内时,只取到字符串的结尾
    
                            p_Length = bsSrcString.Length - p_StartIndex;
                            p_TailString = "";
                        }
    
                        int nRealLength = p_Length;
                        int[] anResultFlag = new int[p_Length];
                        byte[] bsResult = null;
    
                        int nFlag = 0;
                        for (int i = p_StartIndex; i < p_EndIndex; i++)
                        {
                            if (bsSrcString[i] > 127)
                            {
                                nFlag++;
                                if (nFlag == 3)
                                    nFlag = 1;
                            }
                            else
                                nFlag = 0;
    
                            anResultFlag[i] = nFlag;
                        }
    
                        if ((bsSrcString[p_EndIndex - 1] > 127) && (anResultFlag[p_Length - 1] == 1))
                            nRealLength = p_Length + 1;
    
                        bsResult = new byte[nRealLength];
    
                        Array.Copy(bsSrcString, p_StartIndex, bsResult, 0, nRealLength);
    
                        myResult = Encoding.Default.GetString(bsResult);
                        myResult = myResult + p_TailString;
                    }
                }
    
                return myResult;
            }
    
        }
    }
    复制代码

    4.  DES加密/解密

      除了MD5加密、AES加密/解密之外还经常用到DES加密、解密,注意的是DES的密匙是8位的,这里有家婆MD5加密一起使用。

    复制代码
    using System;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace NC.Common
    {
        /// <summary>
        /// DES加密/解密类。
        /// </summary>
        public class DESEncrypt
        {
    
            #region --加密--
    
            /// <summary>
            /// 加密
            /// </summary>
            /// <param name="Text"></param>
            /// <returns></returns>
            public static string Encrypt(string Text)
            {
                return Encrypt(Text, "ncmvc");
            }
            /// <summary> 
            /// 加密数据 
            /// </summary> 
            /// <param name="Text"></param> 
            /// <param name="sKey"></param> 
            /// <returns></returns> 
            public static string Encrypt(string Text, string sKey)
            {
                try
                {
                    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                    byte[] inputByteArray;
                    inputByteArray = Encoding.Default.GetBytes(Text);
                    string md5SKey = MD5Comm.Get32MD5One(sKey).Substring(0, 8);
                    des.Key = ASCIIEncoding.ASCII.GetBytes(md5SKey);
                    des.IV = ASCIIEncoding.ASCII.GetBytes(md5SKey);
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    StringBuilder ret = new StringBuilder();
                    foreach (byte b in ms.ToArray())
                    {
                        ret.AppendFormat("{0:X2}", b);
                    }
                    return ret.ToString();
                }
                catch { return "error"; }
            }
    
            #endregion
    
            #region --解密--
    
            /// <summary>
            /// 解密
            /// </summary>
            /// <param name="Text"></param>
            /// <returns></returns>
            public static string Decrypt(string Text)
            {
                return Decrypt(Text, "ncmvc");
            }
            /// <summary> 
            /// 解密数据 
            /// </summary> 
            /// <param name="Text"></param> 
            /// <param name="sKey"></param> 
            /// <returns></returns> 
            public static string Decrypt(string Text, string sKey)
            {
                try
                {
                    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                    int len;
                    len = Text.Length / 2;
                    byte[] inputByteArray = new byte[len];
                    int x, i;
                    for (x = 0; x < len; x++)
                    {
                        i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
                        inputByteArray[x] = (byte)i;
                    }
                    string md5SKey = MD5Comm.Get32MD5One(sKey).Substring(0, 8);
                    des.Key = ASCIIEncoding.ASCII.GetBytes(md5SKey);
                    des.IV = ASCIIEncoding.ASCII.GetBytes(md5SKey);
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    return Encoding.Default.GetString(ms.ToArray());
                }
                catch { return "error"; }
            }
    
            #endregion
    
        }
    }
    复制代码

    5.  总结

      Asp.Net Core 2.0下加解密封装类分享给大家,供参考!文中有不合理之处望告知,欢迎批评指正。以前做项目常用的几种加密方式,在Net Core2.0下经过重新整理,好的延续,不合理方法弃用。相关案例使用方法欢迎大家继续关注《Asp.Net Core 2.0项目实战》系列。

    IT黑马
  • 相关阅读:
    Grafana、Prometheus、mtail-日志监控
    Grafana、Prometheus-监控平台
    vijos1062迎春舞会之交谊舞
    【模板】字符串哈希
    非递归方式打印4的全排列
    蚂蚁金服后端开发面试
    Intern Day163
    Intern Day156
    Intern Day153
    Intern Day153
  • 原文地址:https://www.cnblogs.com/hmit/p/10768425.html
Copyright © 2020-2023  润新知