2024年6月8日发(作者:)
实验三 MD5算法
实验目的:
1.了解哈希函数的概念和功能,以及一些典型的哈希函数
2.进一步理解MD5算法的概念及结构,掌握MD5算法对数据的处理过程
3.通过编程模拟MD5算法的处理步骤
实验内容:
一.MD5算法概述
MD5算法是一种消息摘要算法(Message Digest Algorithm),此算法以任意长度的信息
(message)作为输入进行计算,产生一个128-bit(16-byte)的指纹或报文摘要(fingerprint
or message digest)。两个不同的message产生相同message digest的几率相当小,从一
个给定的message digest逆向产生原始message更是困难,因此MD5算法适合用在数字签
名应用中。MD5实现简单,在32位的机器上运行速度也相当快,当然实际应用也不仅仅局
限于数字签名。
MD5算法的处理步骤:
第一步:增加填充
增加padding使得数据长度(bit为单位)模512为448。
如果数据长度正好是模512为448,增加512个填充bit,也就是说填充的个数为1-512。
第一个bit为1,其余全部为0。(即第一个字节为0x80)
第二步:补足长度
将数据长度转换为64bit的数值,如果长度超过64bit所能表示的数据长度的范围,值保留
最后64bit,
增加到前面填充的数据后面,使得最后的数据为512bit的整数倍。也就是32bit的16倍的
整数倍。
在RFC1321中,32bit称为一个word。
第三步:初始化变量:
用到4个变量,分别为A、B、C、D,均为32bit长。初始化为:
A: 0x01234567
B: 0x89abcdef
C: 0xfedcba98
D: 0x76543210
第四步:数据处理
首先定义4个辅助函数:
F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z) = XZ v Y not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))
其中:XY表示按位与,X v Y表示按位或,not(X)表示按位取反。xor表示按位异或。
函数中的X、Y、Z均为32bit。
第五步:输出
最后得到的ABCD为输出结果,共128bit。A为低位,D为高位。
二.MD5算法的编程实现
HeaderFiles
MD5.H如下:
#pragma once
typedef unsigned long int UINT32;
typedef unsigned short int UINT16;
/* MD5 context. */
typedef struct {
UINT32 state[4]; /* state (ABCD) */
UINT32 count[2]; /* number of bits, modulo 2^64 (lsb first) */
unsigned char buffer[64]; /* input buffer */
} MD5_CTX;
void MD5Init (MD5_CTX *);
void MD5Update (MD5_CTX *, unsigned char *, unsigned int);
void MD5Final (unsigned char [16], MD5_CTX *);
SourceFiles
如下:
#include "md5.h"
#include "memory.h"
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
static void MD5Transform (UINT32 a[4], unsigned char b[64]);
static void Encode (unsigned char *, UINT32 *, unsigned int);
static void Decode (UINT32 *, unsigned char *, unsigned int);


发布评论