实验三MD5密码

  • 格式:doc
  • 大小:390.50 KB
  • 文档页数:6

实验三 MD5密码
一、实验目的
通过实际编程了解MD5算法的加密和解密过程,加深对Hash算法的认识。

二、实验环境
运行Windows或Linux操作系统的PC机,具有gcc、VC等C语言编译环境。

三、实验原理
在MD5算法中,首先需要对信息进行填充,使其字节长度与448模512同余,即信息的字节长度扩展至n×512+448,n为一个正整数。

填充的方法如下:在信息的后面填充第一位1,其余各位均为0,直到满足上面的条件才停止用0对信息填充。

然后,再在这个结果后面附加一个以64为二进制表示的填充前信息长度。

经过这两步的处理,现在的信息字节长度为n×512+448=(n+1)×512,即长度恰好是512的整数倍,这样做的目的是为满足后面处理中对信息长度的要求。

n个分组中第q个分组表示为Y q。

MD5中有A、B、C、D,4个32为被称作链接变量的整数参数,它们的初始值分别为:A=01234567,B=89abcdef,C=fedcba98,D=76543210当设置好这个4个链接变量后,就开始进入算法的4轮循环运算。

循环的次数是信息中512位信息分组数目。

四、实验步骤
首先将上面4个链接变量赋值到另外4个变量中:A到AA,B到BB,C到CC,D到DD,以备后面进行处理。

然后进入主循环,主循环有4轮,每轮循环都很相似。

第1轮进行16次操作,每次操作对A、B、C和D中的其中3个作一次非线性函数运算,然后将所有结果加上第4个变量,文本的一个字分组和一个常数。

再将所得结果向左循环移S位,并加上A、B、C或D其中之一。

最后用该结果取代A、B、C或D其中之一。

以下是每次操作中用到的4个非线性函数(每轮一个)。

下面为每一轮16步操作中的4次操作,16步操作按照一定次序顺序进行。

M[j]表示在第q个512位数据块中的第j个32位子的分组0《j《15。

常数T[i]
可以如下选择,在第i步中,T[i]是4294967296×abs(sin(i))的整数部分,i的单位是弧度。

其中,T[i]是32位随机数源,它消除了输入数据中任何规律性的特征。

所有这些完成之后,将A、B、C、D分别加上AA、BB、CC、DD。

然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。

五、实验过程与分析
下面简单介绍所用到的结构体变量和函数。

程序中用到的结构体变量如下:Typedef struct md5-state
{
Ulong64 length;
Ulong32 state[4],curlen;
Unsigned char buf[64];
}md-state;
Length记录已经处理过的位数,curlen记录已经处理过的字节数,数组state 存储上面所说的4个链接变量,buf作为处理过程中的缓存。

程序中用到的函数如下:
(1) void md5-init(md5-state*md)函数名称:初始化函数
(2) int md5-process(md5-state×md,const usigned char×buf,unsigned long len)函数名称:处理函数
(3) int md5-done(md5-state*md,unsigned char*Hash函数名称:完成函数。

(4) int md5-text(void)函数名称:测试函数。

六、实验结果
另外新建一个TXT文本,在其中输入明文,以abc为例,得到的Hash值是
七、心得体会
在MD5的算法中求Hash值是相对比较简单的,每一处的公式都是显而易见的,通过编写MD5的C语言代码,将MD5的算法思想重新遍历一遍,是的MD5的表达更明确。