MD5消息摘要算法的那些事
前言:前段时间学习MD5加密的一些算法,可以自己写程序对字符串或者文件进行加密成32位字符,而且我自己开发了一个我们网上下载下来验证MD5加密的工具CalcMD5.exe,这里我将贡献一下源码,下面也将介绍一下这个工具的一些代码,所以就整理了一下,作为自己日后学习的一个文档吧
1. MD5(Message Digest)消息摘要算法
(1) MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法,任何长度的任意内容都可以用MD5计算出散列值
(2)无论字符串还是文件都可以计算MD5值,无论字符串长短,还是文件大或者小,计算出来的MD5值得位数相同
(3)不可逆,不可能根据现有的MD5值,计算出原来的字符串是什么
(4)不可重复性(理论上可以重复,但是几率很小)
(5)MD5算法理论上是不可逆的,因此攻击的唯一办法就是碰撞,两个不同的内容生成相同的MD5值,这就是碰撞
2. 计算字符串的加密
(1)对字符串进行加密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | static string MD5EncryptFormString( string msg) { //创建了一个计算MD5值得对象 MD5 md5 = MD5.Create(); //先计算出msg字符串的byte数组 //把字符串msg根据UTF-8,计算出byte[] //对于包含中文的字符串,计算字符串时如果采用不同的编码,比如UTF-8或者GB2312,所以计算出来的byte[]不同,进而通过ComputeHash(byte[])计算出来的MD5值也不同,所以建议大家计算MFD5值时都采用统一的编码UTF-8 byte [] bs=Encoding.UTF8.GetBytes(msg); //根据byte[]数组,还原原来的字符串 //string str=Encoding.UTF8.GetString(bs); //开始计算MD5值 byte [] md5Bytes = md5.ComputeHash(bs); //释放资源 md5.Clear(); //获取字符串,将MD5转换为字符串 StringBuilder sb = new StringBuilder(); for ( int i = 0; i < md5Bytes.Length; i++) { sb.Append(md5Bytes[i].ToString( "x2" )); } return sb.ToString(); } Console.WriteLine( "请输入一个字符串" ); string msg=Console.ReadLine(); string MD5Str=MD5EncryptFormString(msg); Console.WriteLine(MD5Str); |
(2) 效果展示
3. 计算文件的加密
(1) 对文件进行加密
private static string MD5EncryptFormFile(string path)
{
//创建MD5对象
MD5 md5 = MD5.Create();
using (FileStream fs = File.OpenRead(path))
{
byte[] bs = md5.ComputeHash(fs);
md5.Clear();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bs.Length; i++)
{
sb.Append(bs[i].ToString("x2"));
}
return sb.ToString();
}
}
Console.Write("请输入文件路径:");
string path = Console.ReadLine();
string MD5 = MD5EncryptFormFile(path);
Console.WriteLine(MD5);
(2) 效果展示
4. MD5加密计算器
(1) 这个软件的基本设计用到的东西就是上面的两个算法,还有一个就是支持拖拽的代码如下:
string[] filename;
private void txtMessage_DragDrop(object sender, DragEventArgs e)
{
if (rbFileMD5.Checked == true)
{
filename = (string[])e.Data.GetData(DataFormats.FileDrop);
string[] str = filename[0].ToString().Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
txtMessage.Text = "文件路径:" + filename[0] + "\r\n" + "文件名称:" + str[str.Length - 1];
}
}
private void txtMessage_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop, true) == true)
{
e.Effect = DragDropEffects.All;
}
}
(2) 下面我展示几张截图的效果:
1) 文件使用截图
2) 字符串使用截图
(3)源码下载地址:http://download.csdn.net/detail/hanyinglong/4666224
初心商城:初心商城
作者:韩迎龙(Kencery) MVC/.NET群:159227188如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏一杯咖啡,本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!