C#常用加密解密方法(MD5加密、解密、签名)
在日常开发过程中,总会遇到需要加密解密的需求,这里我整理了C#常用的加密解密方法分享给大家。
先看看加密的基本概念:
"加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。
加密的基本功能包括:
1. 防止不速之客查看机密的数据文件;
2. 防止机密数据被泄露或篡改;
3. 防止特权用户(如系统管理员)查看私人数据文件;
4. 使入侵者不能轻易地查找一个系统的文件。
一、本节摘要
本节主要分享MD5加密解密:
MD5全称是message-digest algorithm 5,简单的说就是单向的加密,也就是说无法根据密文推导出明文。
MD5主要用途:
1、对一段信息生成信息摘要,该摘要对该信息具有唯一性,可以作为数字签名
2、用于验证文件的有效性(是否有丢失或损坏的数据)
3、对用户密码的加密
4、在哈希函数中计算散列值
二、源码分享
1、主方法
private void Test() { string o = "i love u"; o = AddMD5Profix(o); //o += " "; Console.WriteLine(o); Console.WriteLine(ValidateValue(o)); o = RemoveMD5Profix(o); Console.WriteLine(o); }
2、MD5加密解密类
using System; using System.IO; using System.Collections.Generic; using System.Text; namespace Commons { /// <summary> /// MD5各种长度加密字符、验证MD5等操作辅助类 /// </summary> public class MD5Util { public MD5Util() { } /// <summary> /// 获得32位的MD5加密 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string GetMD5_32(string input) { System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] data = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(input)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sb.Append(data[i].ToString("x2")); } return sb.ToString(); } /// <summary> /// 获得16位的MD5加密 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string GetMD5_16(string input) { return GetMD5_32(input).Substring(8, 16); } /// <summary> /// 获得8位的MD5加密 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string GetMD5_8(string input) { return GetMD5_32(input).Substring(8, 8); } /// <summary> /// 获得4位的MD5加密 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string GetMD5_4(string input) { return GetMD5_32(input).Substring(8, 4); } /// <summary> /// 添加MD5的前缀,便于检查有无篡改 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string AddMD5Profix(string input) { return GetMD5_4(input) + input; } /// <summary> /// 移除MD5的前缀 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string RemoveMD5Profix(string input) { return input.Substring(4); } /// <summary> /// 验证MD5前缀处理的字符串有无被篡改 /// </summary> /// <param name="input"></param> /// <returns></returns> public static bool ValidateValue(string input) { bool res = false; if (input.Length >= 4) { string tmp = input.Substring(4); if (input.Substring(0, 4) == GetMD5_4(tmp)) { res = true; } } return res; } #region MD5签名验证 /// <summary> /// 对给定文件路径的文件加上标签 /// </summary> /// <param name="path">要加密的文件的路径</param> /// <returns>标签的值</returns> public static bool AddMD5(string path) { bool IsNeed = true; if (CheckMD5(path)) //已进行MD5处理 IsNeed = false; try { FileStream fsread = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] md5File = new byte[fsread.Length]; fsread.Read(md5File, 0, (int)fsread.Length); // 将文件流读取到Buffer中 fsread.Close(); if (IsNeed) { string result = MD5Buffer(md5File, 0, md5File.Length); // 对Buffer中的字节内容算MD5 byte[] md5 = System.Text.Encoding.ASCII.GetBytes(result); // 将字符串转换成字节数组以便写人到文件中 FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); fsWrite.Write(md5File, 0, md5File.Length); // 将文件,MD5值 重新写入到文件中。 fsWrite.Write(md5, 0, md5.Length); fsWrite.Close(); } else { FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); fsWrite.Write(md5File, 0, md5File.Length); fsWrite.Close(); } } catch { return false; } return true; } /// <summary> /// 对给定路径的文件进行验证 /// </summary> /// <param name="path"></param> /// <returns>是否加了标签或是否标签值与内容值一致</returns> public static bool CheckMD5(string path) { try { FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] md5File = new byte[get_file.Length]; // 读入文件 get_file.Read(md5File, 0, (int)get_file.Length); get_file.Close(); string result = MD5Buffer(md5File, 0, md5File.Length - 32); // 对文件除最后32位以外的字节计算MD5,这个32是因为标签位为32位。 string md5 = System.Text.Encoding.ASCII.GetString(md5File, md5File.Length - 32, 32); //读取文件最后32位,其中保存的就是MD5值 return result == md5; } catch { return false; } } /// <summary> /// 计算文件的MD5值 /// </summary> /// <param name="MD5File">MD5签名文件字符数组</param> /// <param name="index">计算起始位置</param> /// <param name="count">计算终止位置</param> /// <returns>计算结果</returns> private static string MD5Buffer(byte[] MD5File, int index, int count) { System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] hash_byte = get_md5.ComputeHash(MD5File, index, count); string result = System.BitConverter.ToString(hash_byte); result = result.Replace("-", ""); return result; } #endregion private void Test() { string o = "i love u"; o = AddMD5Profix(o); //o += " "; Console.WriteLine(o); Console.WriteLine(ValidateValue(o)); o = RemoveMD5Profix(o); Console.WriteLine(o); } } }
2024-08-06 14:42:47【出处】:https://blog.csdn.net/MarcoPro/article/details/128845198
=======================================================================================
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/18345110
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
posted on 2024-08-06 14:43 jack_Meng 阅读(1341) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-08-06 Pytorch学习笔记 -- 系列文章
2019-08-06 Tensorflow学习笔记——常见概念的整理
2019-08-06 Intellij IDEA 快捷键
2018-08-06 多种方式获取SVN的版本号并写入到AssemblyInfo.cs中
2018-08-06 SQL2008中Merge的用法
2018-08-06 VS版本号定义、规则说明,自定义生成版本号插件、批处理等
2014-08-06 英语单词学习方法