首页 > 编程语言 >C#常用加密解密方法(MD5加密、解密、签名)

C#常用加密解密方法(MD5加密、解密、签名)

时间:2024-08-06 14:52:18浏览次数:12  
标签:加密 string C# 解密 return md5File input MD5

在日常开发过程中,总会遇到需要加密解密的需求,这里我整理了C#常用的加密解密方法分享给大家。

先看看加密的基本概念:

"加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

加密的基本功能包括:

1. 防止不速之客查看机密的数据文件;

2. 防止机密数据被泄露或篡改;

3. 防止特权用户(如系统管理员)查看私人数据文件;

4. 使入侵者不能轻易地查找一个系统的文件。

一、本节摘要

本节主要分享MD5加密解密: 

MD5全称是message-digest algorithm 5,简单的说就是单向的加密,也就是说无法根据密文推导出明文。

MD5主要用途:
1、对一段信息生成信息摘要,该摘要对该信息具有唯一性,可以作为数字签名
2、用于验证文件的有效性(是否有丢失或损坏的数据)
3、对用户密码的加密
4、在哈希函数中计算散列值

二、源码分享 

1、主方法

  1.   private void Test()
  2.   {
  3.   string o = "i love u";
  4.   o = AddMD5Profix(o);
  5.   //o += " ";
  6.   Console.WriteLine(o);
  7.   Console.WriteLine(ValidateValue(o));
  8.    
  9.   o = RemoveMD5Profix(o);
  10.   Console.WriteLine(o);
  11.    
  12.   }

2、MD5加密解密类

  1.   using System;
  2.   using System.IO;
  3.   using System.Collections.Generic;
  4.   using System.Text;
  5.    
  6.   namespace Commons
  7.   {
  8.   /// <summary>
  9.   /// MD5各种长度加密字符、验证MD5等操作辅助类
  10.   /// </summary>
  11.   public class MD5Util
  12.   {
  13.   public MD5Util()
  14.   {
  15.   }
  16.    
  17.   /// <summary>
  18.   /// 获得32位的MD5加密
  19.   /// </summary>
  20.   /// <param name="input"></param>
  21.   /// <returns></returns>
  22.   public static string GetMD5_32(string input)
  23.   {
  24.   System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
  25.   byte[] data = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(input));
  26.   StringBuilder sb = new StringBuilder();
  27.   for (int i = 0; i < data.Length; i++)
  28.   {
  29.   sb.Append(data[i].ToString("x2"));
  30.   }
  31.   return sb.ToString();
  32.   }
  33.    
  34.   /// <summary>
  35.   /// 获得16位的MD5加密
  36.   /// </summary>
  37.   /// <param name="input"></param>
  38.   /// <returns></returns>
  39.   public static string GetMD5_16(string input)
  40.   {
  41.   return GetMD5_32(input).Substring(8, 16);
  42.   }
  43.    
  44.   /// <summary>
  45.   /// 获得8位的MD5加密
  46.   /// </summary>
  47.   /// <param name="input"></param>
  48.   /// <returns></returns>
  49.   public static string GetMD5_8(string input)
  50.   {
  51.   return GetMD5_32(input).Substring(8, 8);
  52.   }
  53.    
  54.   /// <summary>
  55.   /// 获得4位的MD5加密
  56.   /// </summary>
  57.   /// <param name="input"></param>
  58.   /// <returns></returns>
  59.   public static string GetMD5_4(string input)
  60.   {
  61.   return GetMD5_32(input).Substring(8, 4);
  62.   }
  63.    
  64.   /// <summary>
  65.   /// 添加MD5的前缀,便于检查有无篡改
  66.   /// </summary>
  67.   /// <param name="input"></param>
  68.   /// <returns></returns>
  69.   public static string AddMD5Profix(string input)
  70.   {
  71.   return GetMD5_4(input) + input;
  72.   }
  73.    
  74.   /// <summary>
  75.   /// 移除MD5的前缀
  76.   /// </summary>
  77.   /// <param name="input"></param>
  78.   /// <returns></returns>
  79.   public static string RemoveMD5Profix(string input)
  80.   {
  81.   return input.Substring(4);
  82.   }
  83.    
  84.   /// <summary>
  85.   /// 验证MD5前缀处理的字符串有无被篡改
  86.   /// </summary>
  87.   /// <param name="input"></param>
  88.   /// <returns></returns>
  89.   public static bool ValidateValue(string input)
  90.   {
  91.   bool res = false;
  92.   if (input.Length >= 4)
  93.   {
  94.   string tmp = input.Substring(4);
  95.   if (input.Substring(0, 4) == GetMD5_4(tmp))
  96.   {
  97.   res = true;
  98.   }
  99.   }
  100.   return res;
  101.   }
  102.    
  103.   #region MD5签名验证
  104.   /// <summary>
  105.   /// 对给定文件路径的文件加上标签
  106.   /// </summary>
  107.   /// <param name="path">要加密的文件的路径</param>
  108.   /// <returns>标签的值</returns>
  109.   public static bool AddMD5(string path)
  110.   {
  111.   bool IsNeed = true;
  112.    
  113.   if (CheckMD5(path)) //已进行MD5处理
  114.   IsNeed = false;
  115.    
  116.   try
  117.   {
  118.   FileStream fsread = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
  119.   byte[] md5File = new byte[fsread.Length];
  120.   fsread.Read(md5File, 0, (int)fsread.Length); // 将文件流读取到Buffer中
  121.   fsread.Close();
  122.    
  123.   if (IsNeed)
  124.   {
  125.   string result = MD5Buffer(md5File, 0, md5File.Length); // 对Buffer中的字节内容算MD5
  126.   byte[] md5 = System.Text.Encoding.ASCII.GetBytes(result); // 将字符串转换成字节数组以便写人到文件中
  127.   FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
  128.   fsWrite.Write(md5File, 0, md5File.Length); // 将文件,MD5值 重新写入到文件中。
  129.   fsWrite.Write(md5, 0, md5.Length);
  130.   fsWrite.Close();
  131.   }
  132.   else
  133.   {
  134.   FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
  135.   fsWrite.Write(md5File, 0, md5File.Length);
  136.   fsWrite.Close();
  137.   }
  138.   }
  139.   catch
  140.   {
  141.   return false;
  142.   }
  143.    
  144.   return true;
  145.   }
  146.    
  147.   /// <summary>
  148.   /// 对给定路径的文件进行验证
  149.   /// </summary>
  150.   /// <param name="path"></param>
  151.   /// <returns>是否加了标签或是否标签值与内容值一致</returns>
  152.   public static bool CheckMD5(string path)
  153.   {
  154.   try
  155.   {
  156.   FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
  157.   byte[] md5File = new byte[get_file.Length]; // 读入文件
  158.   get_file.Read(md5File, 0, (int)get_file.Length);
  159.   get_file.Close();
  160.    
  161.   string result = MD5Buffer(md5File, 0, md5File.Length - 32); // 对文件除最后32位以外的字节计算MD5,这个32是因为标签位为32位。
  162.   string md5 = System.Text.Encoding.ASCII.GetString(md5File, md5File.Length - 32, 32); //读取文件最后32位,其中保存的就是MD5值
  163.   return result == md5;
  164.   }
  165.   catch
  166.   {
  167.   return false;
  168.   }
  169.   }
  170.    
  171.   /// <summary>
  172.   /// 计算文件的MD5值
  173.   /// </summary>
  174.   /// <param name="MD5File">MD5签名文件字符数组</param>
  175.   /// <param name="index">计算起始位置</param>
  176.   /// <param name="count">计算终止位置</param>
  177.   /// <returns>计算结果</returns>
  178.   private static string MD5Buffer(byte[] MD5File, int index, int count)
  179.   {
  180.   System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
  181.   byte[] hash_byte = get_md5.ComputeHash(MD5File, index, count);
  182.   string result = System.BitConverter.ToString(hash_byte);
  183.    
  184.   result = result.Replace("-", "");
  185.   return result;
  186.   }
  187.   #endregion
  188.    
  189.   private void Test()
  190.   {
  191.   string o = "i love u";
  192.   o = AddMD5Profix(o);
  193.   //o += " ";
  194.   Console.WriteLine(o);
  195.   Console.WriteLine(ValidateValue(o));
  196.    
  197.   o = RemoveMD5Profix(o);
  198.   Console.WriteLine(o);
  199.    
  200.   }
  201.   }
  202.   }

 

 

2024-08-06 14:42:47【出处】:https://blog.csdn.net/MarcoPro/article/details/128845198

=======================================================================================

标签:加密,string,C#,解密,return,md5File,input,MD5
From: https://www.cnblogs.com/mq0036/p/18345110

相关文章

  • HTML5 WebSocket 详解及使用
    1.WebSocket是什么?WebSocket是HTML5提供的一种在单个TCP连接上进行全双工通讯的协议。(双向通信协议)2.WebSocket的作用?实现客户端与服务器之间的双向通信,允许服务端主动向客户端推送数据。在WebSocketAPI中,浏览器和服务器只需要完成一次握手,两者之间就直......
  • 暑假集训CSP提高模拟14
    暑假集训CSP提高模拟14组题人:@H_Kaguya|@LYinMX\(T1\)P209.BA\(30pts\)部分分\(30pts\):输出\(\left\lceil\dfrac{\sum\limits_{i=1}^{m}a_{i}}{n}\right\rceil\)。数形结合,将\(\{a\}\)抽象成矩形,烙饼抽象成海报覆盖,最终有\(\max(\max\limits_{i=1}^{m}......
  • Mac开发基础08-NSWindow(二)
    NSWindow其他使用和技巧NSWindow是macOS应用程序中用于显示和管理窗口的核心类。可用于创建、编辑和管理应用程序的窗口。1.自定义窗口的内容视图层级替换默认的内容视图NSWindow默认包含一个内容视图,你可以使用自定义内容视图来替换它。Objective-CNSView*customVie......
  • css 实现弹窗缩放出现,从小放大
    在CSS中,实现弹窗从小放大的动画效果,可以使用transform属性和transition属性或者@keyframes动画。以下是几种实现方式:使用transition当弹窗元素的类被添加或移除时,可以使用transition来实现平滑的缩放效果。.modal{opacity:0;transform:scale(0.5);/*初始缩放比例较......
  • python安装torch-cluster、torch-scatter、torch-sparse和torch-geometric | torch_ge
    1.检查CUDA版本【方法1】用nvidia-smi已装cuda,用nvidia-smi或nvcc-V查看【方法2】用torch已装torch,用torch代码打印importtorchprint(torch.__version__)#查看pytorch安装的版本号print(torch.cuda.is_available())#查看cuda是否可......
  • 从零开始学嵌入式技术之C语言11:指针
    一:指针的理解(1)变量的访问方式        内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 ,为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元通常占用1个字节。变量在内存中分配空间,不同类型的变量占用不同大小的空间,那如何访问内......
  • Mac开发基础06-NSView(二)
    要理解NSView更深层的知识,涉及到其渲染机制、事件处理流程、与CALayer的关系及性能优化等方面。1.NSView绘制和渲染机制NSView的绘制过程主要依赖于drawRect:(Objective-C)或draw(_:)(Swift)方法。这个方法被调用是由系统驱动的,通常发生在需要重新绘制视图的时候,如窗口首次......
  • uniapp中的websocket的研究,以及相关的封装
    官方文档---官方文档写的跟屎一样https://uniapp.dcloud.net.cn/api/request/websocket.html相关博客https://www.cnblogs.com/sunnyeve/p/16757633.html还是这个博客清晰https://blog.csdn.net/lyandgh/article/details/100642941......
  • aspnet .core 网站默认不支持文件下载
    将txt文件和rar文件都放到wwwroot目录下,会发现前者可以正常下载而后者不行。其实是需要在初始化的地方进行设置:builder.WebHost.UseKestrel(option=>{option.ListenAnyIP(config.Port);});WebApplicationapp=builder.Build();varhttpContextAccessor=app.Services......
  • password_hash加密实例
    $pwd=password_hash('123456',PASSWORD_DEFAULT);echo$pwd;$res=password_verify('1234567',$pwd);var_dump($res);1.password_hash()函数用于创建密码的散列(hash)PHP版本要求:PHP5>=5.5.0,PHP7语法stringpassw......