C#高级--加密解密详解

https://blog.youkuaiyun.com/liyou123456789/article/details/120609269

C#高级–加密解密详解
零、文章目录
一、名词介绍
1、加密
是以某种特殊的算法改变原有的信息数据,以另外一种形式呈现,这里有几个名词:加密之前的信息数据可以理解为原数据,原文;加密之后的数据信息可以被理解为密文,一般的呈现格式为一串字符,从字符上来看,没有什么规律!

2、解密
由加密后得到的密文,通过解密算法,解密以后,可以得到未曾加密之前的原信息数据,原文,被称之为解密

二、加密的分类
1、不可逆加密
不可逆,就是指不能不能返回,就是原信息数据,通过加密后得到的密文数据信息,不存在算法,让密文变回来,不能变回原文信息; 经常以MD5 hash散列计算为代表;

2、可逆加密
可逆,就是指原信息数据,通过加密算法,加密后,得到的密文数据信息,存在一种解密算法,可以让密文解密后得到原文信息

三、不可逆加密MD5
MD5加密,就是典型的不可逆的加密,因为他只能从数据信息通过加密后得到密文信息,而不能从密文再通过计算得到原文;

1、规则
MD5公开的算法,hash散列计算; 任何语言实现后其实都一样,通用的,无论是C#,java各种语言的实现都一样的。本质是通过hash散列计算,可以对普通的数据信息进行加密,也可以对文件生成文件的摘要。
相同原数据信息加密的结果是一样的
不同长度的内容加密后加过都是 32 位
原文差别很小,结果差别很大
不管文件多大,都能产生 32 位长度摘要
文件内容有一点改动,结果变化非常大
文件内容不变,名字变了,结果是不变
2、作用
(1)防篡改
发个文档,事先给别人一个MD5,是文档的摘要;

源代码管理器svn,即使电脑断网了,文件有任何改动都能被发现,本地存了一个文件的MD5,文件有更新,就再对比下MD5;

极速秒传,扫描文件的MD5跟已有的文件MD5比对,吻合表示文件已存在不用再上传;

(2)密码保存,防止看到明文
密码只有用户知道,数据库不能存明文,但是又需要验证,MD5加密下原始密码,数据库存密文,下次登录把密码MD5后再比对,密文是可见的,所以要求密码不能太简单,加密的时候还可以加盐

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

3、MD5的争议
实质上,MD5 只是一种哈希算法。哈希算法,又叫散列算法,是一类把任意数据转换为定长(或限制长度)数据的算法统称。可以把数据计算后得到一个hash散列值,不能计算得到原数据。

部分人认为MD5不算是加密算法,他们认为加密就要对应一个解密,可以把原文加密成密文,也能从密文解密到原文,这才算加密。也有部分人认为这个为不可逆加密。

4、代码实现
帮助类实现

using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace MyEncryption
{
    public class MD5Encrypt
    {        
        /// <summary>
        /// MD5加密,和动网上的16/32位MD5加密结果相同
        /// 使用的UTF8编码
        /// </summary>
        /// <param name="source">待加密字串</param>
        /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
        /// <returns>加密后的字串</returns>
        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();
        }
        
        /// <summary>
        /// 获取文件的MD5摘要
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
  &nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值