.net常用加密和解密算法

MD5加密:(不可逆加密)

加解方法封装: 

 public class Encrypt
    {
        /// <summary>
        /// md5加密后返回密文
        /// </summary>
        /// <param name="source">要加密的明文</param>
        /// <returns></returns>
        public static string MD5Encrypt(string source)
        {
            try
            {
                MD5 md5 = MD5.Create();
                byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(source));
                StringBuilder sBuilder = new StringBuilder();
                for (int i = 0; i < data.Length; i++)
                {
                    sBuilder.Append(data[i].ToString("x2"));
                }
                return sBuilder.ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 获取文件的md5摘要
        /// </summary>
        /// <param name="fileName">文件名称</param>
        /// <returns>文件摘要</returns>
        public static string AbstractFile(string fileName)
        {
            using (FileStream stream = new FileStream(fileName, FileMode.Open))
            {
                MD5 md5 = new MD5CryptoServiceProvider();
                byte[] retVal = md5.ComputeHash(stream);

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < retVal.Length; i++)
                {
                    sb.Append(retVal[i].ToString("x2"));
                }

                return sb.ToString();
            }
        }

    }

实例:

Console.WriteLine(Encrypt.MD5Encrypt("123456"));     
Console.WriteLine(Encrypt.AbstractFile(@"C:\Users\Administrator\Desktop\test\jquery.js"));

结果:

md5加密特点:

1.相同原文加密后的结果是一样的

2.不同长度的内容加密后长度是一样的

3.加密不可逆,不能通过密文解密出原文

4.原文差别很小,但加密后的结果差别很大

扫描二维码关注公众号,回复: 12574583 查看本文章

5.文件也可以经过加密产生摘要

md5加密应用:

1.系统登录的密码,经md5加密后将密文存在数据库中,用户登录时对用户输入的密码用md5加密后和数据库比较。(密码保存,防止看到明文)

2.源代码管理器,比如svn,文件有改动时,文件就会出现被改动的标记。(防篡改)

3.极速秒传,扫描文件的md5,跟已有的文件md5比对,吻合表示文件已存在则不再上传。

4.数字签名,把一些内容摘要一下,由权威的第三方去保障,将来这个文件就是由你做的,不能抵赖。

DES加密:(对称可逆加密)

app.config添加一个配置型,用于存储加密的key

 <appSettings>
    <add key="DesKey" value="hello666"/>
 </appSettings>

加解密方法封装:  

public class Encrypt
    {
        public static string DesKey = ConfigurationManager.AppSettings["DesKey"];
        private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes(DesKey.Substring(0, 8));
        private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes(DesKey.Insert(0, "w").Substring(0, 8));

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="text">需要加密的值</param>
        /// <returns>加密后的结果</returns>
        public static string DesEncrypt(string text)
        {
            DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
            using (MemoryStream memStream = new MemoryStream())
            {
                CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
                StreamWriter sWriter = new StreamWriter(crypStream);
                sWriter.Write(text);
                sWriter.Flush();
                crypStream.FlushFinalBlock();
                memStream.Flush();
                return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
            }
        }


        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="encryptText">需要解密的值</param>
        /// <returns>解密后的结果</returns>
        public static string DesDecrypt(string encryptText)
        {
            DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
            byte[] buffer = Convert.FromBase64String(encryptText);

            using (MemoryStream memStream = new MemoryStream())
            {
                CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
                crypStream.Write(buffer, 0, buffer.Length);
                crypStream.FlushFinalBlock();
                memStream.Flush();
                return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
            }
        }
    }

实例:

string strDes = Encrypt.DesEncrypt("张三");
Console.WriteLine(strDes);
Console.WriteLine(Encrypt.DesDecrypt(strDes));

结果:

DES加密特点:

1.加密后能解密回原文,加密key和解密key是同一个。

2.加密解密的速度快,问题是密钥的安全性。

RSA加密:(不对称可逆加密)

加解密方法封装:  

 public class Encrypt
    {
        /// <summary>
        /// RSA随机生成一对密钥
        /// </summary>
        /// <returns>一对密钥值</returns>
        public static KeyValuePair<string, string> GetKeyPair()
        {
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            string publicKey = RSA.ToXmlString(false);
            string privateKey = RSA.ToXmlString(true);
            return new KeyValuePair<string, string>(publicKey, privateKey);
        }


        /// <summary>
        /// RSA加密(内容+加密key)
        /// </summary>
        /// <param name="content">内容</param>
        /// <param name="encryptKey">加密key</param>
        /// <returns>加密后的信息</returns>
        public static string RSAEncrypt(string content, string encryptKey)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(encryptKey);
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            byte[] DataToEncrypt = ByteConverter.GetBytes(content);
            byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
            return Convert.ToBase64String(resultBytes);
        }


        /// <summary>
        /// RSA解密(内容+解密key)
        /// </summary>
        /// <param name="content">内容</param>
        /// <param name="descryptKey">解密key</param>
        /// <returns></returns>
        public static string RSADecrypt(string content, string descryptKey)
        {
            byte[] dataToDecrypt = Convert.FromBase64String(content);
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            RSA.FromXmlString(descryptKey);
            byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            return ByteConverter.GetString(resultBytes);
        }

    }

实例:

KeyValuePair<string, string> encryptDescypt = Encrypt.GetKeyPair();
string rsaEn = Encrypt.RSAEncrypt("123456",encryptDescypt.Key);
string rsaDe = Encrypt.RSADecrypt(rsaEn, encryptDescypt.Value);
Console.WriteLine(rsaEn);
Console.WriteLine(rsaDe);

结果:

RSA加密特点:

1.加密后能解密回原文,加密key和解密key不是同一个。

2.加密解密速度不快,但安全性好。

3.公开加密key,保证数据的安全传递。

4.公开解密key,保证数据的不可抵赖。

猜你喜欢

转载自blog.csdn.net/liangmengbk/article/details/114228947