MD5算法【计算文件和字符串的MD5值】

时间:2021-11-29 11:14:08

1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错)。任何长度的任意内容都可以用MD5计算出散列值。MD5的前身:MD2、MD3、MD4。介绍工具:CalcMD5.zip。主要作用就是【验明"真身"】,字符串文件均可(确保信息传输过程中的完整性、一致性)。

2. MD5算法的特点:

    1. 长度固定

    2. 单向性 ---- 可以通过MD5计算器来计算文件或者字符串的MD5值,但是不可以通过给出的MD5值来推算出文件或者字符串。

    3. 抗冲突性(不重复)

    4. "雪崩效应",只要源发生一点变化,就会造成大的变化

    5. 不同的"源",生成的MD5值总是不一样的,相同的"源",产生的总是相同的MD5值。

    6. 同样的内容,每次生成的MD5值是一样的。

3. 代码实现【计算文件和字符串的MD5值】

    ·计算字符串的MD5值:

     ///
<summary>


///
计算字符串的MD5值


///
</summary>


///
<param name="msg"></param>


///
<returns></returns>


private
static
string
GetMD5FromString(string
msg)

{


//1.创建一个用来计算MD5值的类对象

 


using (MD5
md5
=
MD5.Create())

{


//把字符串转换为byte[]数组


//注意:如果字符串中包含汉字,则这里会把汉字使用utf-8编码转换为byte[],当其他地方计算MD5值的时候,如果对汉字使用了不同的编码,则同样的汉字生成的byte[]是不一样的,所以计算出的MD5值也就不一样了。

 


//byte[] msgBuffer = Encoding.Default.GetBytes(msg); 使用系统默认的编码


byte[] msgBuffer
=
Encoding.UTF8.GetBytes(msg);


//2. 计算给定的字符串的MD5值


的byte[]数组转化为一个长度为32的字符串:就是把一个byte转成16进制同时保留2位即可。


byte[] md5Buffer=
md5.ComputeHash(msgBuffer);


md5.Clear();//释放资源


StringBuilder
sbMd5=new
StringBuilder();


for (int
i
=
0; i
<
md5Buffer.Length; i++)

{


进制输出,并保留2位


sbMd5.Append(md5Buffer[i].ToString("x2"));

}


return
sbMd5.ToString();

}

}


///
<summary>


///
计算文件的MD5值


///
</summary>


///
<param name="path"></param>


///
<returns></returns>


private
static
string
GetMD5FromFile(string
path)

{


using (MD5
md5
=
MD5.Create())

{


using (FileStream
fsRead
=
File.OpenRead(path))

{


byte[] bytes
=
md5.ComputeHash(fsRead);


md5.Clear();


StringBuilder
sbMd5=new
StringBuilder();


for (int
i
=
0; i
<
bytes.Length; i++)

{


sbMd5.Append(bytes[i].ToString("x2"));

}


return
sbMd5.ToString();

}

}

}