开发者该如何利用 C# 加解密?


开发者该如何利用 C# 加解密?

文章插图
作者 | 喵叔
责编 | 刘静
出品 | CSDN(ID:CSDNnews)
加密解密在开发中经常用到,比如登录密码加密解密、消息传输加密解密等 。但是很多人只会使用不理解其中的原理,这篇文章就带领大家快速学习加密解密的原理和使用 。
1.零、什么是加密解密通俗的说加密解密就是将不想让别人很容易看到的东西根据一定的规则进行处理,形成无规则的内容 。拿到加密后内容的人通过一定规则将加密后的内容还原成原文 。这里所说的原文在计算机中被称为明文,加密后的内容被称为密文 。加密后的内容并不是完全不可破解的,只是提高了破解的难度,让大多数人退缩 。那么怎么判断一个加解密安全呢?一般来说加密消息在发送方和接收方进行传递时必须满足三个条件:
  1. 发送方可以确定所发送的消息只有预期接收方可以解密,但不保证其他非接收方获得密文,只要保证非接收方获得密文后无法解密即可;
  2. 接收方可以确定消息是谁发送的;
  3. 接收方可以确定消息在传输过程中没有被篡改,也就是说可以验证消息的完整性 。
一般来说常用的加密方式有三种:
  • 不可逆加密;
  • 对称可逆加密;
  • 非堆成可逆加密 。
下面我来讲一讲这三种常用的加密方式 。
2.不可逆加密常用的不可逆加密是 MD5 加密,MD5是Message-Digest Algorithm 5英文简称,MD5 的特点如下:
  1. 任意长度的输入,经过 MD5 处理后都会输出128位的信息,这个信息称作数字指纹;
  2. 输入不同的信息产生的数字指纹不一样,数字指纹是全球唯一的;
  3. 无法根据数字指纹推导出加密前的信息 。MD5 我们经常用在文档防篡改、密码加密、数字签名、网盘秒传 。针对这四个方面我下面简单讲解一下:
  4. 文档防篡改
    在文档发送前记录文档的 MD5 值,接收方收到文档后计算文档的 MD5 值,如果两个 MD5 值不一样就说明文档在发送过程中被篡改过;
  5. 密码加密
    如果将密码明文存储在数据库中,泄露后可以别人可以直接登录,在用 MD5 将密码加密后即使泄露了也无法通过密文直接登录 。但是这里需要注意,目前网上有很多破解 MD5 密文的网站,这些网站说白了就是利用撞库实现的,这些网站收集了常用的密码组合方式,比如生日、连续相同的数字或密码等,因此我们在验证密码强度时应当将常见的简单密码列,针对所有密码最好将密码中加入随机的信息内容然后再进行 MD5 加密,这就是所谓的加盐;
  6. 数字签名
    某人写了一个重要文件,这个文件经过认证机构利用 MD5 生成摘要信息进行认证,如果以后这个人不承认这个文件是他写的,只需认证机构再次对文件生成摘要信息和以前的照耀信息进行对比即可知道该文件是所写的;
  7. 网盘秒传
    网盘记录文件第一次上传的 MD5 值,以后当有人上传具有相同 MD5 值的文件时只需要将存在于网盘中的这个文件的链接发送出去即可 。
MD5 的实现很简单代码如下:
public class MD5{/// <summary>////// </summary>/// <param name="source">待加密字串</param>/// <param name="length">加密结果长度</param>/// <returns>加密后的字串</returns>public string Encrypt(string source, int length = 32){if (string.IsOrEmpty(source)){return string.Empty;}HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;byte bytes = Encoding.UTF8.GetBytes(source);byte hashValue = https://www.isolves.com/it/cxkf/yy/C/2019-11-11/provider.ComputeHash(bytes);StringBuilder sb = new StringBuilder;switch (length){case 16: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>public string AbstractFile(string fileName){FileStream file = new FileStream(fileName, FileMode.Open);System.Security.Cryptography.MD5 md5 = new MD5CryptoServiceProvider;byte retVal = md5.ComputeHash(file);file.Close;StringBuilder sb = new StringBuilder;for (int i = 0; i < retVal.Length; i++){sb.Append(retVal[i].ToString("x2"));}return sb.ToString;}}


推荐阅读