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);