1、MD5应用
首先我们要知道一个字符的长度是8位(bit),即一个字节的长度。现在我们要做的就是将一个字符串Str1分割成每512位为一个分组。MD5有四个32位的被称作链接变量的整数参数,进行设置,并确保形参a在内存中的值改变了,可以在形参中用按引用调用(&a),或返回a值取代原来a值。接下来就是要进行一个MD5算法的主要循环了,这个循环的循环次数为512位分组的个数(即之前提到的N+1或者N+2)。处理完所有的512位的分组后,得到一组新的A,B,C,D的值,将这些值按ABCD的顺序级联,然后输出。这里还要注意,输出的MD5是按内存中数值的排列顺序,所以我们要分别对A,B,C,D的值做一个小端规则的转换。举个例子:A有32位,分成4个字节A1A2A3A4。输出A的时候,要这样输出:A4A3 A2A1。这样就能输出正确的MD5了。
明文输入进去改变后,MD5值改变较大。但是得到的MD5长度不变,依然是32位。
2、MD5算法具有以下特点:
1)压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2)容易计算:从原数据计算出MD5值很容易。
3)抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4)弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
3、分析用MD5进行文件完整性校验
MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。MD5用在游戏打包时,将所有的模型,纹理贴图,地图等数据打包成.sqp文件后,对比打包后的数据源文件的MD5值,若相同的话则打包成功,可以删掉源文件以节省存储空间。打包后文件的数据可以直接通过sfmpq的api根据文件名打开;源文件的话通过内存映射文件打开,分别计算其MD5值即可。
源代码:
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;