MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法。任何长度的任意内容都可以用MD5计算出散列值。
MD5长度一般是32位的16进制数字符串。
理论上,MD5值的个数是有限的,但是源数据是无限的,因此存在着不同的内容产生相同MD5值的概率。因此MD5算法不可逆,也就是只能得到内容对应的MD5值,无法由MD5值反推内容。但是对不同的内容产生相同MD5值的概率非常非常非常低!
MD5算法理论上是不可逆的,因此***的唯一办法就是碰撞。
1)使用MD5进行对字符串的操作,具体代码实现:
using System.Security.Cryptography;//需要导入这个命名空间
......
static void Main(string[] args)
{
Console.WriteLine("请输入字符串,使用MD5加密 ...");
string str = Console.ReadLine();
string md5 = Md5ChuLiStr(str);
Console.WriteLine(md5);
Console.ReadKey();
}
private static string Md5ChuLiStr(string msg)
{
//1.创建一个MD5对象
MD5 md5 = MD5.Create();
//2.把字符串变为一个byte数组
//对于中文或者某些字符,采用不同的编码生成的byte[]是不一样的,
//所以造成了采用不同编码生成的md5值不一样的情况。
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg);
//3.将一个byte[]通过MD5计算得到一个新的byte[],新的byte[]就是计算md5后的结果。
byte[] md5Buffer = md5.ComputeHash(buffer);
//释放资源
md5.Clear();
//4.将计算后的结果直接显示为字符串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < md5Buffer.Length; i++)
{
//x2:把每个数字转换为16进制,并保留两位数字。
sb.Append(md5Buffer[i].ToString("x2"));
}
return sb.ToString();
}
......
2)使用MD5进行对文件的操作,具体代码实现:
using System.Security.Cryptography;//需要导入这个命名空间
using System.IO;//需要用到文件流等
...
static void Main(string[] args)
{
Console.WriteLine("请输入文件路径,使用MD5加密 ...");
string path = Console.ReadLine();
string md5 = Md5ChuLiFile(path);
Console.WriteLine(md5);
Console.ReadKey();
}
private static string Md5ChuLiFile (string path)
{
MD5 md5 = MD5.Create();
using (FileStream fs = File.OpenRead(path))
{
byte[] md5Buffer = md5.ComputeHash(fs);//这里直接传入文件流对象
md5.Clear();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < md5Buffer.Length; i++)
{
sb.Append(md5Buffer[i].ToString("x2"));
}
return sb.ToString();
}
}
......
*:最后,产生的MD5值可以通过MD5计算器(CalcMD5.exe)进行对照。