千家信息网

.NET中常见的加解密算法有哪些

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要讲解了".NET中常见的加解密算法有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习".NET中常见的加解密算法有哪些"吧!一、MD5不可
千家信息网最后更新 2026年11月04日.NET中常见的加解密算法有哪些

这篇文章主要讲解了".NET中常见的加解密算法有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习".NET中常见的加解密算法有哪些"吧!

    一、MD5不可逆加密

    不可逆加密是指将原文加密成密文以后,无法将密文解密成原文。

    MD5的算法是公开的,无论是哪种语言,只要需要加密的字符串是相同的,那么经过MD5加密以后生成的结果都是一样的。

    .NET框架中已经帮我们实现好了MD5加密,请看下面的例子:

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace MyEncriptDemo{    public class MD5Encrypt    {        #region MD5        ///         /// MD5加密,和动网上的16/32位MD5加密结果相同,        /// 使用的UTF8编码        ///         /// 待加密字串        /// 16或32值之一,其它则采用.net默认MD5加密算法        /// 加密后的字串        public static string Encrypt(string source, int length = 32)//默认参数        {            if (string.IsNullOrEmpty(source)) return string.Empty;            HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;            byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的            byte[] hashValue = provider.ComputeHash(bytes);            StringBuilder sb = new StringBuilder();            switch (length)            {                case 16://16位密文是32位密文的9到24位字符                    for (int i = 4; i < 12; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;                case 32:                    for (int i = 0; i < 16; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;                default:                    for (int i = 0; i < hashValue.Length; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;            }            return sb.ToString();        }        #endregion MD5    }}

    Main()方法调用:

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MyEncriptDemo{    class Program    {        static void Main(string[] args)        {            // MD5            Console.WriteLine(MD5Encrypt.Encrypt("1"));            Console.WriteLine(MD5Encrypt.Encrypt("1"));            Console.WriteLine(MD5Encrypt.Encrypt("123456孙悟空"));            Console.WriteLine(MD5Encrypt.Encrypt("113456孙悟空"));            Console.WriteLine(MD5Encrypt.Encrypt("113456孙悟空113456孙悟空113456孙悟空113456孙悟空113456孙悟空113456孙悟空113456孙悟空"));            Console.ReadKey();        }    }}

    结果:

    应用:

    1、校验密码

    从上面的例子中可以看出,只要字符串相同,那么加密以后的结果就是一样的,利用MD5的这个特性,可以用来做密码校验。在注册的时候把密码用MD5加密然后保存到数据库里面,数据库里面保存的是密文,别人无法看到。登录的时候,在把密码经过MD5加密,然后用加密后的密文和数据库里面保存的密文进行比对,如果相同,则证明密码是一样的;如果不同,证明密码是错误的。

    注意:MD5是不能解密的,网上的解密都是基于撞库原理的:即将原文和密文保存到数据库中,每次利用密文去和数据库里保存的密文进行比对,如果比对成功,则解密了。为了防止撞库,可以使密码复杂一些,例如加盐:即在密码的后面加上一段后缀然后加密后在保存到数据库。登录的时候,在密码后面加上同样的后缀,然后加密以后和数据库保存的密码进行比对。

    2、防篡改

    例如下载VS安装文件,官网下载的文件才是权威的,但是有时会去系统之家这一类的网站下载,如何保证在系统之家下载的安装文件和官网发布的文件是一样的呢?这时就可以利用MD5进行判断。官方在发布VS安装文件的同时,也会发布一个根据该文件生成的MD5码,在系统之家下载完安装文件以后,可以对该安装文件进行一次MD5加密,然后比对官方发布的MD5码和生成的MD5码,如果相同,则证明下载的文件就是官方方便的。那么如何对文件进行MD5呢?请看下面的例子:

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace MyEncriptDemo{    public class MD5Encrypt    {        #region MD5        ///         /// MD5加密,和动网上的16/32位MD5加密结果相同,        /// 使用的UTF8编码        ///         /// 待加密字串        /// 16或32值之一,其它则采用.net默认MD5加密算法        /// 加密后的字串        public static string Encrypt(string source, int length = 32)//默认参数        {            if (string.IsNullOrEmpty(source)) return string.Empty;            HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;            byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的            byte[] hashValue = provider.ComputeHash(bytes);            StringBuilder sb = new StringBuilder();            switch (length)            {                case 16://16位密文是32位密文的9到24位字符                    for (int i = 4; i < 12; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;                case 32:                    for (int i = 0; i < 16; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;                default:                    for (int i = 0; i < hashValue.Length; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;            }            return sb.ToString();        }        #endregion MD5        #region MD5摘要        ///         /// 获取文件的MD5摘要        ///         ///         ///         public static string AbstractFile(string fileName)        {            using (FileStream file = new FileStream(fileName, FileMode.Open))            {                return AbstractFile(file);            }        }        ///         /// 根据stream获取文件摘要        ///         ///         ///         public static string AbstractFile(Stream stream)        {            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();        }        #endregion    }}

    Main()方法里面调用:

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MyEncriptDemo{    class Program    {        static void Main(string[] args)        {            // MD5            //Console.WriteLine(MD5Encrypt.Encrypt("1"));            //Console.WriteLine(MD5Encrypt.Encrypt("1"));            //Console.WriteLine(MD5Encrypt.Encrypt("123456孙悟空"));            //Console.WriteLine(MD5Encrypt.Encrypt("113456孙悟空"));            //Console.WriteLine(MD5Encrypt.Encrypt("113456孙悟空113456孙悟空113456孙悟空113456孙悟空113456孙悟空113456孙悟空113456孙悟空"));            // 对文件进行MD5            string md5Abstract1 = MD5Encrypt.AbstractFile(@"E:\EF一对多.txt");            Console.WriteLine(md5Abstract1);            string md5Abstract2 = MD5Encrypt.AbstractFile(@"E:\EF一对多 - 副本.txt");            Console.WriteLine(md5Abstract2);            Console.ReadKey();        }    }}

    结果:

    可以看出,虽然文件的名称不同,但只要文件的内容是相同的,则生成的MD5码就是相同的。

    3、急速秒传

    以百度云为例:假如从百度云上面下载了一个文件,然后把这个文件在上传到百度云就会急速秒传。因为第一次上传的时候,百度云会对上传的文件进行MD5加密,然后把加密后的MD5码保存下来。下载之后再上传,百度云客户端会先对文件计算MD5,然后将计算的MD5和服务器保存的MD5进行对比,如果一致就不需要在上传了,只需要把服务器上文件的名称修改成和上传文件的名称一致即可。因为上传的文件在服务器上已经存在。(就算修改了文件名称,但生成的MD5还是一样的)

    4、源代码管理工具

    源代码管理工具实现判断文件是否修改,也是根据MD5进行比对的。

    二、对称可逆加密

    对称可逆加密:可逆是指加密和解密是可逆的,即可以根据原文得到密文,也可以根据密文得到原文。对称是指加密和解密的密钥是相同的。下面以DES加密为例。

    在示例程序中,密钥长度是8位的,写在配置文件中。

    读取配置文件获取密钥的代码如下:

    using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MyEncriptDemo{    public static class Constant    {        public static string DesKey = AppSettings("DesKey", "DesEncript");        private static T AppSettings(string key, T defaultValue)        {            var v = ConfigurationManager.AppSettings[key];            return String.IsNullOrEmpty(v) ? defaultValue : (T)Convert.ChangeType(v, typeof(T));        }    }}

    加密和解密的代码如下:

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace MyEncriptDemo{    ///     /// DES AES Blowfish    ///  对称加密算法的优点是速度快,    ///  缺点是密钥管理不方便,要求共享密钥。    /// 可逆对称加密  密钥长度8    ///     public class DesEncrypt    {        // 按照8位长度的密钥进行加密        private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Substring(0, 8));        // 对称算法的初始化向量        private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Insert(0, "w").Substring(0, 8));        ///         /// DES 加密        ///         /// 需要加密的值        /// 加密后的结果        public static string Encrypt(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);            }        }        ///         /// DES解密        ///         ///         /// 解密后的结果        public static string Decrypt(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();                return ASCIIEncoding.UTF8.GetString(memStream.ToArray());            }        }    }}

    Main()方法调用:

    string strDes = "张三李四";string desEn1 = DesEncrypt.Encrypt(strDes);string desDe1 = DesEncrypt.Decrypt(desEn1);Console.WriteLine(strDes.Equals(desDe1));

    结果:

    注意:对称可逆加密的算法是公开的。

    三、非对称可逆加密

    非对称可逆加密:可逆是指加密和解密是一样,即根据原文可以得到密文,根据密文也可以得到原文。非对称是指加密和解密的密钥是不同的。下面以RSA加密为例:

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace MyEncriptDemo{    ///     /// RSA ECC    /// 可逆非对称加密    /// 非对称加密算法的优点是密钥管理很方便,缺点是速度慢。    ///     public class RsaEncrypt    {        ///         /// 获取加密/解密对        /// 给你一个,是无法推算出另外一个的        ///        /// Encrypt   Decrypt        ///         /// Encrypt   Decrypt        public static KeyValuePair GetKeyPair()        {            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();            string publicKey = RSA.ToXmlString(false);            string privateKey = RSA.ToXmlString(true);            return new KeyValuePair(publicKey, privateKey);        }        ///         /// 加密:内容+加密key        ///         ///         /// 加密key        ///         public static string Encrypt(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);        }        ///         /// 解密  内容+解密key        ///         ///         /// 解密key        ///         public static string Decrypt(string content, string decryptKey)        {            byte[] dataToDecrypt = Convert.FromBase64String(content);            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();            RSA.FromXmlString(decryptKey);            byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);            UnicodeEncoding ByteConverter = new UnicodeEncoding();            return ByteConverter.GetString(resultBytes);        }        ///         /// 可以合并在一起的,,每次产生一组新的密钥        ///         ///         /// 加密key        /// 解密key        /// 加密后结果        private static string Encrypt(string content, out string publicKey, out string privateKey)        {            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();            publicKey = rsaProvider.ToXmlString(false);            privateKey = rsaProvider.ToXmlString(true);            UnicodeEncoding ByteConverter = new UnicodeEncoding();            byte[] DataToEncrypt = ByteConverter.GetBytes(content);            byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt, false);            return Convert.ToBase64String(resultBytes);        }    }}

    Main()方法调用:

    // 获取加密和解密的密钥KeyValuePair encryptDecrypt = RsaEncrypt.GetKeyPair();string strValue = "RsaDemo";string rsaEn1 = RsaEncrypt.Encrypt(strValue, encryptDecrypt.Key);//key是加密的string rsaDe1 = RsaEncrypt.Decrypt(rsaEn1, encryptDecrypt.Value);//value 解密的   不能反过来用的Console.WriteLine(strValue.Equals(rsaDe1));

    结果:

    注意:

    1、加密钥和解密钥是根据功能来划分的。

    2、私钥和公钥是根据钥匙的公开程度来划分的,加密钥可以作为公钥或者私钥、解密钥也可以作为公钥或者私钥。

    感谢各位的阅读,以上就是".NET中常见的加解密算法有哪些"的内容了,经过本文的学习后,相信大家对.NET中常见的加解密算法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

    加密 文件 孙悟空 密文 对称 密钥 算法 结果 相同 密码 原文 数据 数据库 内容 生成 常见 名称 字符 就是 方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 今日互联网科技 鸠鸠互联网科技 互联网科技卖菜 迪茉互联网科技 壕鑫互联网络科技 互联网科技logo设计 中国互联网有什么科技含量 互联网科技寓意 注册互联网科技公司经营范围大全 群盈汇互联网科技有限公司 领航科技大厦互联网公司 2021世界互联网领先科技成果发布 互联网科技包装股 科技互联网行业投资研究 唯美互联网科技 唐山双旺合互联网科技产业园 互联网的科技体现在哪里 陕西彩京云互联网科技有限公司 平安好医生打造互联网科技医疗 现代科技的标志之一的互联网 华宇互联网科技 电子科技大学互联网 阿里巴巴算科技企业还是互联网 科技与互联网哪个更好 贵州叶脉互联网科技有限公司所属行业 新兴科技互联网创新大赛颁奖典礼 互联网科技和法律行业 互联网科技的全部知识 每天都有哪些好的互联网科技 互联网时代科技型公司的机会
    0